1 / 21

Process Synchronization

Process Synchronization. Buffer. Producer. Consumer. ต้องมี buffer ถ้า read/write speed ไม่เท่ากัน. ทำสลับ กันไม่ได้. ไม่ต้องเขียนลงฮาร์ดดิสก์ เขียนลง memory แทน และไม่เปลือง memory มาก. Circular Queue. A. D. in. 1. out. 2. C. 0. 3. 4. 7. 6. 5. Variable count = 3.

keon
Download Presentation

Process Synchronization

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Process Synchronization Buffer Producer Consumer ต้องมี bufferถ้า read/write speed ไม่เท่ากัน ทำสลับกันไม่ได้ ไม่ต้องเขียนลงฮาร์ดดิสก์ เขียนลง memory แทนและไม่เปลือง memory มาก

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

  3. Producer & Consumer problem Producer: while (true) { while (counter == BUFFER_SIZE) buffer[in] = nextProduced in = (in + 1) % BUFFER_SIZE counter++ } Consumer: while (true) { while (counter == 0) nextConsumed = buffer[out] out = (out + 1) % BUFFER_SIZE counter -- }

  4. Machine Language counter++ instr1: register1 = counter instr2: register1 = register1 + 1 instr3: counter = register1 counter -- instr1: register2 = counter instr2: register2 = register2 – 1 instr3: counter = register2 Let counter = 5 Executing (single core) 121 233 yields “counter = 4”

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

  6. 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. Sync. HW: TestAndSet booleanTestAndSet(boolean *target) { // atomically by hardware booleanrv = *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. 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. Semaphores ใน critical section มี resourceอยู่ S ชิ้น เป็น mutual exclusive Semaphore is a system call.No processes can execute wait() or signal() at the same time by using the previouslydescribedtechnique. wait(S) { while (S <= 0); S-- } signal(S) { S++ } S คือจำนวนทรัพยากรที่มี ถ้า 1 process ใช้ทรัพยากร 1 ชิ้น ก็จะเข้าใช้ได้พร้อมกันไม่เกิน S process Shared variablebetween process S = 10 wait(S) Critical section Critical section signal(S)

  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 another process No spinlock Semaphore แบบ spinlock ไม่รับประกัน bounded waiting ดูหน้าต่อไป

  12. Semaphores: no-spinlock typedefstruct { 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 Ensurebounded waiting by FIFO queue

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

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

  15. History's Worst Software Bugs July 28, 1962 -- Mariner I space probe1982 -- Soviet gas pipeline1985-1987 -- Therac-25 medical accelerator (race condition)At least five patients die; others are seriously injured. 1988 -- Buffer overflow in Berkeley Unix finger daemon 1985-1987 -- 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. http://www.wired.com/software/coolapps/news/2005/11/69355?currentPage=all

  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) ถ้าเพิ่ม static จะหมายความว่าอย่างไร ???

  18. http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.htmlhttp://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html

  19. http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.htmlhttp://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

More Related