งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

Process Synchronization

งานนำเสนอที่คล้ายกัน


งานนำเสนอเรื่อง: "Process Synchronization"— ใบสำเนางานนำเสนอ:

1 Process Synchronization
Buffer Producer Consumer ต้องมี buffer ถ้า read/write speed ไม่เท่ากัน Example Producer Consumer 1 Data Compression Encryption 2 Application grep, findstr 3 tar gzip ทำสลับ กันไม่ได้ ไม่ต้องเขียนลงฮาร์ดดิสก์ เขียนลง memory แทน และไม่เปลือง memory มาก

2 Circular Queue D A 1 in out 2 C 3 4 7 6 5 Variable count = 3

3 Producer & Consumer problem
while (ยังต้อง produce อยู่) { while (counter == BUFFER_SIZE) buffer[in] = nextProduced in = (in + 1) % BUFFER_SIZE counter++ } Consumer: while (ยังต้อง consume อยู่) { while (counter == 0) nextConsumed = buffer[out] out = (out + 1) % BUFFER_SIZE counter --

4 Machine Language counter++ instr 1: register1 = counter
instr 2: register1 = register1 + 1 instr 3: counter = register1 counter -- instr 1: register2 = counter instr 2: register2 = register2 – 1 instr 3: counter = register2 Let counter = 5 Executing (single core) yields “counter = 4”

5 Critical Section A solution to the critical-section problem must satisfy: Mutual exclusion Progress Bounded waiting entry section critical section เพิ่ม code เข้าไปป้องกัน critical section exit section ขณะที่ไม่มี process ใน critical section Process ที่อยู่ใน entry section remainder section 3 1 2 5 4 Process ที่อยู่ใน remainder section เลือกมา 1 ตัว (progress หมายถึง การเลือก cannot be postponed indefinitely) ตัวที่ไม่ได้รับเลือก จะต้องเป็น bounded waiting

6 This software solution assumes atomic instructions.
Obsolete! Peterson’s Solution int turn; // turn = 0, 1 process that is allowed to execute in its CS. boolean flag[2]; // flag[i] = true, process i is ready to enter its CS. Process 0 Process 1 do { critical section remainder section } while (TRUE); do { critical section remainder section } while (TRUE); flag[0] = TRUE; turn = 1; while (flag[1] && turn == 1); flag[1] = TRUE; turn = 0; while (flag[0] && turn == 0); flag[0] = FALSE flag[1] = FALSE This software solution assumes atomic instructions. Mutual exclusion, progress, bounded waiting are satisfied. แต่ทำได้แค่ 2 process เท่านั้น OS สมัยก่อนเป็นแบบ non-preemtive เพราะ CPU ยังไม่มี atomic instructions ดังนั้นต้องทำ critical section ให้เสร็จก่อนปล่อย CPU เช่น iPad, iOS < 4 (อาจจะเพราะพัฒนา kernel ไม่ทัน)

7 Not satisfy bounded-waiting requirement
Sync. HW: TestAndSet boolean TestAndSet(boolean *target) { // atomically by hardware boolean rv = *target; // even in multi-processors *target = TRUE; return rv; } Shared variable เริ่มต้น lock = FALSE; do { while (TestAndSet(&lock)); // critical section lock = FALSE; // remainder section } while (TRUE); do { while (TestAndSet(&lock)); // critical section lock = FALSE; // remainder section } while (TRUE); Not satisfy bounded-waiting requirement

8 Not satisfy bounded-waiting requirement
Sync. HW: Swap void Swap(boolean *a, boolean *b) { // atomic instruction (HW) boolean temp = *a; *a = *b; *b = temp; } Shared variable lock = FALSE; Bounded waiting not satisfied! do { key = TRUE; while (key == TRUE) Swap(&lock, &key); // critical section lock = FALSE; // remainder section } while (TRUE); do { key = TRUE; while (key == TRUE) Swap(&lock, &key); // critical section lock = FALSE; // remainder section } while (TRUE); Not satisfy bounded-waiting requirement

9 Bounded-waiting mutual exclusion
ต้องจัดคิวให้ process ที่รออยู่ เริ่มต้น waiting[i] = false; lock = false; do { waiting[i] = TRUE; key = TRUE; while (waiting[i] && key) key = TestAndSet(&lock); waiting[i] = FALSE; // critical section j = (i + 1) % n; while ((j != i) && !waiting[j]) j = (j + 1) % n; if (j == i) lock = FALSE; else waiting[j] = FALSE; // remainder section } while (TRUE); รอใช้ critical section ได้เข้าใช้ CS แล้ว ค้นหา process ที่รอใช้ CS (หาไปทางขวา) ใม่มี process อื่นที่รอใช้ CS Unlock ปล่อย CS มี process j รอใช้ CS ส่งมอบ CS ให้ process ตัวแรกที่อยู่ถัดไปทางขวา

10 Shared variable between process
Semaphores ใน critical section มี resource อยู่ S ชิ้น เป็น mutual exclusive wait(S) { while (S <= 0); S-- } signal(S) { S++ } S คือจำนวนทรัพยากรที่มี ถ้า 1 process ใช้ทรัพยากร 1 ชิ้น ก็จะเข้าใช้ได้พร้อมกันไม่เกิน S process Shared variable between process S = 10 wait(S) Critical section Critical section signal(S) Semaphore is a system call. No processes can execute wait() or signal() at the same time by using the previously described technique.

11 Semaphores: spinlock do { // n = #resources wait(n);
// critical section signal(n); // remainder section } while (TRUE); หยุดรอจนกว่าจะเข้า CS ได้ หรือ หมด time quantum การหยุดรอ CS มี 2 options คือ Spinlock ใช้ time quantum ต่อไป No spinlock เรียก context-switch เข้า CS Spin ก็คือ while loop รอ CS user process user process ได้เข้าใช้ CS Spinlock user process Kernel (scheduler) another process No spinlock Semaphore แบบ spinlock ไม่รับประกัน bounded waiting ดูหน้าต่อไป

12 Semaphores: no-spinlock Ensure bounded waiting by FIFO queue
typedef struct { int value; struct process *list; } semaphore; S + #processes waiting #processes allowed wait(semaphore *S) { S -> value--; if (S -> value < 0) { append this process to S -> list; block(); // context switch } signal(semaphore *S) { S -> value++; if (S -> value <= 0) { // FIFO remove a process P from S -> list; wakeup(P); } No spinlock Ensure bounded waiting by FIFO queue

13 Error diffusion on multi-core processors
Spinlock: A case study Error diffusion on multi-core processors Use spinlock, do not allow context-switch !!!

14 Web App (Race condition)
มีผู้สมัครกี่คนแล้ว (n) แจก ID = n + 1 ให้ผู้สมัคร ถ้าไม่ป้องกัน จะมีคนได้ ID ซ้ำกัน A case study เกิด exception ตอน save ลง DB มีคนสมัครไม่ได้จำนวนมาก Disaster !!! Web Application Browser Browser Browser โรงแรมรอยัลพลาซ่าถล่ม(ตึกถล่ม)พ.ศ.2536

15 History's Worst Software Bugs July 28, Mariner I space probe Soviet gas pipeline Therac-25 medical accelerator (race condition) At least five patients die; others are seriously injured Buffer overflow in Berkeley Unix finger daemon Therac-25 medical accelerator. A radiation therapy device malfunctions and delivers lethal radiation doses at several medical facilities. Based upon a previous design, the Therac-25 was an "improved" therapy system that could deliver two different kinds of radiation: either a low-power electron beam (beta particles) or X-rays. The Therac-25's X-rays were generated by smashing high-power electrons into a metal target positioned between the electron gun and the patient. A second "improvement" was the replacement of the older Therac-20's electromechanical safety interlocks with software control, a decision made because software was perceived to be more reliable. What engineers didn't know was that both the 20 and the 25 were built upon an operating system that had been kludged together by a programmer with no formal training. Because of a subtle bug called a "race condition," a quick-fingered typist could accidentally configure the Therac-25 so the electron beam would fire in high-power mode but with the metal X-ray target out of position. At least five patients die; others are seriously injured.

16 Solutions from students
PHP flock (ล็อคไฟล์) mutex (ใช้ library) ล็อค port .NET Lock(object) Application.Lock() ใช้ได้เฉพาะ ASP.NET ล็อคเกิน scope ที่ต้องการ !!! Semaphore (ต้องประกาศเป็น static) Monitor.Lock() JAVA Synchronized (ชื่อคลาส.class) General solution Auto-increment (database feature) ทำได้ทั้ง My SQL และ MS SQL Server Inter-process Semaphore (C#) ต้อง import DLL เพื่อเรียก Win32 ให้ OS สร้าง semaphore ให้ Lock table (lock table [ชื่อตาราง] write) ออก (unlock tables)

17 lock Statement (C# Reference)
ถ้าตัวแปร lock เป็นแบบ static จะเกิดอะไรขึ้น ภาษา Java ใช้ synchronized กรณี WebApp ต้องใส่ static ให้ object ที่เป็น lock กรณี Account ไม่ต้องใส่ static ให้ object ที่เป็น lock

18

19

20

21

22 กิจกรรม เรียนหลักสูตรออนไลน์ (ต้องมี amazon account ก่อน)
Link to the Online Course  


ดาวน์โหลด ppt Process Synchronization

งานนำเสนอที่คล้ายกัน


Ads by Google