part iii synchronization
play

Part III Synchronization Semaphores The bearing of a child takes - PowerPoint PPT Presentation

Part III Synchronization Semaphores The bearing of a child takes nine months, no matter how many women are assigned. 1 Spring 2015 Frederick P. Brooks Jr. Se Semap apho hores es A semaphore is an object that consists of a private


  1. Part III Synchronization Semaphores The bearing of a child takes nine months, no matter how many women are assigned. 1 Spring 2015 Frederick P. Brooks Jr.

  2. Se Semap apho hores es  A semaphore is an object that consists of a private counter, a private waiting list of processes, and two public methods ( e.g ., member functions): signal and wait . semaphore method signal counter method wait waiting list 2

  3. Semap Se apho hore e Me Metho hod: d: wa wait void wait(sem S) { S.count--; if (S.count < 0) { add the caller to the waiting list ; block(); } }  After decreasing the counter by 1, if the new value becomes negative, then  add the caller to the waiting list, and  block the caller. 3

  4. Se Semap apho hore e Me Metho hod: d: si sign gnal al void signal(sem S) { S.count++; if (S.count <= 0) { remove a process P from the waiting list; resume( P ); } }  After increasing the counter by 1, if the new value is not positive (e.g., non-negative), then  remove a process P from the waiting list,  resume the execution of process P, and return 4

  5. Impo porta tant nt No Note: e: 1/ 1/4 S.count--; S.count++; if (S.count<0) { if (S.count<=0) { add to list ; remove P ; block(); resume( P ); } }  If S.count < 0 , abs(S.count) is the number of waiting processes.  This is because processes are added to ( resp ., removed from) the waiting list only if the counter value is < 0 ( resp ., <= 0 ). 5

  6. Impo porta tant nt No Note: e: 2/ 2/4 S.count--; S.count++; if (S.count<0) { if (S.count<=0) { add to list ; remove P ; block(); resume( P ); } }  The waiting list can be implemented with a queue if FIFO order is desired.  However, th the e co corr rrec ectn tnes ess s of of a p a pro rogr gram am sh shou ould no d not t de depe pend nd on on a a pa part rticu cular ar impl plem emen enta tati tion on (e. e.g. g., or orde deri ring ng) of of the the wai aiti ting ng list st . 6

  7. Impo porta tant nt No Note: e: 3/ 3/4 S.count--; S.count++; if (S.count<0) { if (S.count<=0) { add to list ; remove P ; block(); resume( P ); } }  The caller may block in the call to wait() .  The caller never blocks in the call to signal() . If S.count > 0 , signal() returns and the caller continues. Otherwise, a waiting process is released and the caller continues. In this case, two processes continue. tw 7

  8. Th The Mo e Most st Im Impo portan ant t No Note: e: 4/ 4/4 S.count--; S.count++; if (S.count<0) { if (S.count<=0) { add to list ; remove P ; block(); resume( P ); } }  wait() and signal() must be executed at atom omica cally ( i.e ., as one uninterruptible unit).  Otherwise, ra race ce co cond nditi tion ons may occur.  Hom omew ewor ork : use execution sequences to show race conditions if wait() and/or signal() is not executed atomically. 8

  9. Ty Typi pica cal Us Uses es of of Sem Semap apho hores es  There are three typical uses of semaphores:  mutual exclusion: Mutex ( i.e ., Mut ual Ex clusion) locks  count-down lock: Keep in mind that a semaphore has a private counter that can count.  notification: Wait for an event to occur and indicate an event has occurred. 9

  10. Us Use e 1: 1: Mu Mutua ual Ex Excl clus usion on (Lo Lock ck) initialization is important semaphore S = 1; int count = 0; // shared variable Process 1 Process 2 while (1) { while (1) { // do something // do something entry S.wait(); S.wait(); count++; count--; critical sections S.signal(); S.signal(); // do something // do something exit } }  What if the initial value of S is zero?  S is a binary semaphore ( count being 0 or 1). 10

  11. Us Use e 2: 2: C Cou ount nt-Do Down wn Co Coun unter er semaphore S = 3; Process 1 Process 2 while (1) { while (1) { // do something // do something S.wait(); S.wait(); at most 3 processes can be here!!! S.signal(); S.signal(); // do something // do something } }  After three processes pass through wait() , this section is locked until a process calls signal() . 11

  12. Use 3: Use 3: No Notifica cati tion on semaphore S1 = 1, S2 = 0; process 1 process 2 while (1) { while (1) { // do something // do something S1.wait(); S2.wait(); notify notify cout << “1”; cout << “2”; S2.signal(); S1.signal(); notify // do something // do something } }  Process 1 uses S2.signal() to notify process 2, indicating “ I am done. Please go ahead. ”  The output is 1 2 1 2 1 2 ……  What if S1 and S2 are both 0’s or both 1’s?  What if S1 = 0 and S2 = 1? 12

  13. Di Dini ning ng Ph Philos osop ophe hers  Five philosophers are in a thinking - eating cycle.  When a philosopher gets hungry, he sits down, picks up his left and then his right chopsticks, and eats.  A philosopher can eat only if he has both chopsticks.  After eating, he puts down both chopsticks and thinks.  This cycle continues. 13

  14. Di Dini ning ng Ph Philos osop ophe her: Ide deas as  Chopsticks are shared outer critical section left chop locked items (by two neighboring philosophers) and must be Semaphore C[5] = 1; protected. C[i].wait();  Each chopstick has a C[(i+1)%5].wait(); semaphore with initial value 1 (i.e., available). has 2 chops and eats  A philosopher calls wait() C[(i+1)%5].signal(); to pick up a chopstick and C[i].signal(); signal() to release it. inner critical section right chop locked 14

  15. Di Dini ning ng Ph Philos osop ophe hers: s: Co Code de semaphore C[5] = 1; philosopher i wait for my left chop while (1) { // thinking wait for my right chop C[i].wait(); C[(i+1)%5].wait(); release my right chop // eating C[(i+1)%5].signal(); release my left chop C[i].signal(); // finishes eating } Does s this solution tion work? 15

  16. Di Dini ning ng Ph Philos osop ophe hers: s: De Dead adloc ock! k!  If all five philosophers sit down and pick up their left chopsticks at the same time, this causes a ci circ rcul ular ar wai aiti ting ng and the program deadlocks.  An easy way to remove this deadlock is to introduce a weirdo who picks up his right chopstick first! 16

  17. Dini Di ning ng Ph Philos osop ophe hers: s: A Be A Better er Ide dea semaphore C[5] = 1; philosopher i (0, 1, 2, 3) Philosopher 4: the weirdo while (1) { while (1) { // thinking // thinking C[i].wait(); C[(i+1)%5].wait(); C[(i+1)%5].wait(); C[i].wait(); // eating // eating C[(i+1)%5].signal(); C[i].signal(); C[i].signal(); C[(i+1)%5].signal(); // finishes eating; // finishes eating } } lock left chop lock right chop 17

  18. Di Dini ning ng Ph Philos osop ophe hers: s: Qu Ques estion ons  The following are some important questions for you to think about.  We choose philosopher 4 to be the weirdo. Does this choice matter?  Show that this solution does not cause circ ci rcul ular ar wa waiti ting ng .  Show that this solution does not cause circ ci rcul ular ar wai waiti ting ng even if we have more than 1 and less than 5 weirdoes.  This solution is not sy symmet etri ric because not all threads run the same code. 18

  19. Count Count-Do Down wn Lo Lock ck Ex Exam ampl ple  The naïve solution to the dining philosophers problem causes circular waiting.  If only four philosophers are allowed to sit down, deadlock cannot occur.  Why? If all four of them sit down at the same time, the right-most philosopher may have both chopsticks!  How about fewer than four? This is obvious. 19

  20. Count Count-Do Down wn Lo Lock ck Ex Exam ampl ple semaphore C[5]= 1; semaphore Chair = 4; get a chair this is a count-down lock while (1) { that only allows 4 to go! // thinking Chair.wait(); C[i].wait(); C[(i+1)%5].wait(); // eating this is our old friend C[(i+1)%5].signal(); C[i].signal(); Chair.signal(); } release my chair 20

  21. The he Pro roducer/Cons ducer/Consumer umer Pro roblem blem  Suppose we have a circular buffer of n slots.  Pointer in ( resp ., out ) points to the first empty ( resp ., filled) slot.  Producer processes keep adding data into the buffer.  Consumer processes keep retrieving data from the bounded-buffer buffer. 21

  22. Problem blem An Analysis ysis  A producer deposits data into Buf[in] and a consumer retrieves info from Buf[out] .  in and out must be advanced.  in is shared among producers.  out is shared among consumers.  If Buf is full, producers should be blocked. buffer is implemented with an array Buf[ ]  If Buf is empty, consumers should be blocked. 22

  23.  A semaphore to protect the buffer.  The second semaphore to block producers if the buffer is full.  The third semaphore to block consumers if the buffer is empty. 23

Recommend


More recommend