Presentation is loading. Please wait.

Presentation is loading. Please wait.

OSes: 5. Synch 1 Operating Systems v Objectives –describe the synchronization problem and some common mechanisms for solving it Certificate Program in.

Similar presentations


Presentation on theme: "OSes: 5. Synch 1 Operating Systems v Objectives –describe the synchronization problem and some common mechanisms for solving it Certificate Program in."— Presentation transcript:

1 OSes: 5. Synch 1 Operating Systems v Objectives –describe the synchronization problem and some common mechanisms for solving it Certificate Program in Software Development CSE-TC and CSIM, AIT September -- November, 2003 5. Process Synchronization (Ch. 6, S&G) ch 7 in the 6th ed.

2 OSes: 5. Synch 2 Contents 1.Motivation: Bounded Buffer 2.Critical Sections 3.Synchronization Hardware 4.Semaphores 5.Synchronization Examples continued

3 OSes: 5. Synch 3 6.Problems with Semaphores 7.Critical Regions 8.Monitors 9.Synchronization in Solaris 2 10.Atomic Transactions

4 OSes: 5. Synch 4 1. Motivation: Bounded Buffer 0123n-1 ….. producerconsumer writeread bounded buffer

5 OSes: 5. Synch 5 Producer Code (pseudo-Pascal) : repeat... /* produce an itemP */... while (counter == n) do no-op; buffer[in] := itemP; /* write */ in := (in+1) mod n; counter := counter + 1; until false; :

6 OSes: 5. Synch 6 Consumer Code : repeat while (counter == 0) do no-op; itemC := buffer[out]; /* read */ out := (out+1) mod n; counter := counter - 1;... /* use itemC for something */... until false; :

7 OSes: 5. Synch 7 Problem  Assume  Assume counter == 5  producer runconsumer run  producer runconsumer run :: counter := counter := counter + 1; counter - 1; ::  counter may now be 4, 5, or 6. Why?

8 OSes: 5. Synch 8 Machine Language  “counter := counter + 1” becomes: reg1 := counter reg1 := reg1 + 1 counter := reg1  “counter := counter - 1” becomes: reg2 := counter reg2 := reg2 - 1 counter := reg2

9 OSes: 5. Synch 9 Execution Interleaving v The concurrent execution of the two processes is achieved by interleaving the execution of each  There are many possible interleavings, which can lead to different values for counter –a different interleaving may occur each time the processes are run

10 OSes: 5. Synch 10 Interleaving Example  Initially: counter == 5 v Execution: reg1 := counter// reg1 == 5 reg1 := reg1 + 1// reg1 == 6 reg2 := counter// reg2 == 5 reg2 := reg2 - 1// reg2 == 4 counter := reg1// counter == 6 counter := reg2// counter == 4

11 OSes: 5. Synch 11 Summary of Problem  Incorrect results occur because of a race condition over the modification of the shared variable ( counter ) v The processes must be synchronized while they are sharing data so that the result is predictable and correct

12 OSes: 5. Synch 12 2. Critical Sections v A critical section is a segment of code which can only be executed by one process at a time –all other processes are excluded –called mutual exclusion

13 OSes: 5. Synch 13 Critical Section Pseudo-code repeat entry section critical section exit section remainder section until false;

14 OSes: 5. Synch 14 Implementation Features v An implementation of the critical section idea must have three features: –mutual exclusion –progress u the next process to enter the critical region is decided solely by looking at those waiting in their entry sections –bounded waiting u no process should wait forever in their entry section

15 OSes: 5. Synch 15 2.1. Solutions for Two Processes v Algorithm 1 (take turns) –shared data: –shared data: var turn: 0..1 := 0; /* or 1 */ –Code for process i: –Code for process i: repeat while (turn /== i) do no-op: critical section; turn := j; remainder section; until false; progress requirement not met

16 OSes: 5. Synch 16 Algorithm2 (who wants to enter?) v Shared data: var flag : array [0..1] of boolean := {false, false}; v Code for process i: repeat flag[i] := true; while (flag[j]) do no-op: critical section; flag[i] := false; remainder section; until false; progress requirement still not met

17 OSes: 5. Synch 17 Algorithm 3 (Peterson, 1981) v Combines algorithms 1 and 2 –who wants to enter? –if both do then take turns v Shared data: var flag : array [0..1] of boolean := {false, false}; var turn : 0..1 := 0; /* or 1 */ continued

18 OSes: 5. Synch 18 v Code for process i: repeat flag[i] := true; turn := j; while (flag[j] and turn == j) do no-op: critical section; flag[i] := false; remainder section; until false;

19 OSes: 5. Synch 19 2.2. Multiple Processes v Uses the bakery algorithm (Lamport 1974). v Each customer (process) receives a number on entering the store (the entry section). v The customer with the lowest number is served first (enters the critical region). continued

20 OSes: 5. Synch 20 v If two customers have the same number, then the one with the lowest name is served first –names are unique and ordered

21 OSes: 5. Synch 21 Pseudo-code v Shared data: var choosing : array [0..n-1] of boolean := {false.. false}; var number : array [0..n-1] of integer := {0.. 0}; continued

22 OSes: 5. Synch 22 v Code for process i: repeat choosing[i] := true; number[i] := max(number[0], number[1],..., number[n-1]) + 1; choosing[i] := false; for j := 0 to n-1 do begin while (choosing[j]) do no-op; while ((number[j] /== 0) and ((number[j],j) < (number[i],i))) do no-op; end; critical section number[i] := 0; remainder section until false;

23 OSes: 5. Synch 23 3. Synchronization Hardware v Hardware solutions can make software synchronization much simpler v On a uniprocessor, the OS can disallow interrupts while a shared variable is being changed –not so easy on multiprocessors continued

24 OSes: 5. Synch 24 v Typical hardware support: –atomic test-and-set of a boolean (byte) –atomic swap of booleans (bytes) v Atomic means an uninterruptable ‘unit’ of work.

25 OSes: 5. Synch 25 3.1. Atomic Test-and-Set function Test-and-Set( var target : boolean) : boolean begin Test-and-Set := target; target := true; end;

26 OSes: 5. Synch 26 Use v Shared data: var lock : boolean := false; v Process code for mutual exclusion: repeat while (Test-and-Set(lock) do no-op; critical section lock := false; remainder section until false; lock/inlock/outresultaction F T Fproceed T T Tloop

27 OSes: 5. Synch 27 3.2. Atomic Swap procedure Swap(var a, b : boolean) var temp : boolean; begin temp := a; a := b; b := temp; end;

28 OSes: 5. Synch 28 Use v Shared data: var lock : boolean := false; v Process code for m.e.: var key : boolean: repeat key := true; repeat Swap(lock, key); until (key == false); critical section lock := false; remainder section until false; key1key2…keyNlock in: T T… T F

29 OSes: 5. Synch 29 3.3. Bounded Waiting v TestAndSet() and Swap() both satisfy the requirements of mutual exclusion and progress v But bounded waiting is not satisfied v We must add an extra data structure to code FIFO (queueing-style) behaviour

30 OSes: 5. Synch 30 4. Semaphores (Dijkstra, 1965) v Semaphores are a synchronization tool based around two atomic operations: –wait() sometimes called P() –signal() sometimes called V()

31 OSes: 5. Synch 31 4.1. Definitions procedure wait(var S : semaphore) begin while (S =< 0) do no-op; S := S - 1; end; procedure signal(var S : semaphore) begin S := S + 1; end; same as integer

32 OSes: 5. Synch 32 4.2. Mutual Exclusion with Semaphores v Shared data: var mutex : semaphore := 1; v Process code: repeat wait(mutex); critical section; signal(mutex); remainder section; until false;

33 OSes: 5. Synch 33 4.3. Ordering Processes  Establish a fixed order for two processes p 1 and p 2, We set semaphore Order := 0.  If the desired order is p 1 -> p 2, p 2 should issue a wait(Order), and then wait until p 1 issues a signal(Order).

34 OSes: 5. Synch 34 4.4. Counting Semaphores  Allow N processes into a critical section, by initialising semaphore Limit to N –the first N processes each decrement Limit using wait(Limit), until Limit == 0, at which time new processes must wait v This approach is used for controlling access to a limited number of resources (e.g. N resources)

35 OSes: 5. Synch 35 4.5. Implementations  Our wait() implementation uses busy-waiting –sometimes called a spinlock  An alternative is for the process calling wait() to block –place itself on a wait list associated with the semaphore –signal() chooses a blocked process to become ready

36 OSes: 5. Synch 36 New Semaphore Data Type type semaphore = record value : integer; L : list of waiting-processes; end;

37 OSes: 5. Synch 37 New Operations procedure wait(var S : semaphore) begin S.value := S.value - 1; if (S.value < 0) then begin /* add the calling process to S.L */... block; end; end; continued

38 OSes: 5. Synch 38 procedure signal(var S : semaphore) begin S.value := S.value + 1; if (S.value =< 0) then begin /* remove a process P from S.L */... wakeup(P); end; end;

39 OSes: 5. Synch 39 4.6. Deadlocks & Starvation  Deadlock occurs when every process is waiting for a signal(S) call that can only be carried out by one of the waiting processes. v Starvation occurs when a waiting process never gets selected to move into the critical region.

40 OSes: 5. Synch 40 4.7. Binary Semaphores v A binary semaphore is a specialisation of the counting semaphore with S only having a range of 0..1 –S starts at 0 –easy to implement –can be used to code up counting semaphores

41 OSes: 5. Synch 41 5. Synchronization Examples v 5.1. Bounded Buffer v 5.2. Readers and Writers v 5.3. Dining Philosophers

42 OSes: 5. Synch 42 5.1. Bounded Buffer (Again) 0123n-1 ….. producerconsumer writeread bounded buffer

43 OSes: 5. Synch 43 Implementation v Shared data: var buffer : array[0..n-1] of Item; var mutex : semaphore := 1; /* for access to buffer */ var full : semaphore := 0; /* num. of used array cells */ var empty : semaphore := n; /* num. of empty array cells */

44 OSes: 5. Synch 44 Producer Code repeat... /* produce an itemP */... wait(empty); wait(mutex); buffer[in] := itemP; in := (in+1) mod n; signal(mutex); signal(full); until false;

45 OSes: 5. Synch 45 Consumer Code repeat wait(full); wait(mutex); itemC := buffer[out]; out := (out+1) mod n; signal(mutex); signal(empty);... /* use itemC for something */... until false;

46 OSes: 5. Synch 46 5.2. Readers & Writers v Readers make no change to the shared data (e.g. a file) –no synchronization problem v Writers do change the shared data v Multiple writers (or a writer and readers) cause a synchronization problem.

47 OSes: 5. Synch 47 Many Variations v 1. Don’t keep a reader waiting unless a writer is already using the shared data –writers may starve v 2. Don’t keep a writer waiting –readers may starve

48 OSes: 5. Synch 48 Variation 1 v Shared data: var shared-data : Item; var readcount : integer : = 0; /* no. of readers currently using shared-data */ var mutex : semaphore := 1; /* control access to readcount */ var wrt : semaphore := 1; /* used for m.e. of writers */

49 OSes: 5. Synch 49 Writer’s Code : wait(wrt);... /* writing is performed */... signal(wrt); :

50 OSes: 5. Synch 50 Reader’s Code wait(mutex); readcount := readcount + 1; if (readcount == 1) then wait(wrt); signal(mutex);... /* reading is performed */... wait(mutex); readcount := readcount - 1; if (readcount == 0) then signal(wrt); signal(mutex);

51 OSes: 5. Synch 51 5.3. Dining Philosophers v An example of the need to allocate several resources (chopsticks) among processes (philosophers) in a deadlock and starvation free manner. Dijkstra, 1965

52 OSes: 5. Synch 52 Implementation v Represent each chopstick by a semaphore. Shared data: var chopstick : array[0..4] of semaphore := {1,1,1,1,1};  A chopstick is ‘picked up’ with: wait(chopstick[pos]) and ‘set down’ with: signal(chopstick[pos])

53 OSes: 5. Synch 53 Code for Philopospher i repeat wait( chopstick[i] ); wait( chopstick[(i+1) mod 5] ); /*... eat... */ signal( chopstick[i] ); signal( chopstick[(i+1) mod 5] ); /*... think... */ until false;

54 OSes: 5. Synch 54 Deadlock v This solution avoids simultaneous use of chopsticks (good) v But if all the philosophers pick up their left chopstick together, then they will deadlock while waiting for access to their right chopstick.

55 OSes: 5. Synch 55 Possible Fixes v Allow at most 4 philosophers to be at the table at a time. v Have a philosopher pick up their chopsticks only if both are available (in a critical section) v Alternate the order that chopsticks are picked up depending on whether the philosopher is seated at an odd or even seat

56 OSes: 5. Synch 56 6. Problems with Semaphores  The reversal of a wait() and signal() pair will break mutual exclusion  The omission of either a wait() or signal() will potentially cause deadlock v These problems are difficult to debug and reproduce

57 OSes: 5. Synch 57 Higher level Synchronization v These problems have motivated the introduction of higher level constructs: –critical regions –monitors –condition variables v These constructs are safer, and easy to understand

58 OSes: 5. Synch 58 7. Critical Regions v Shared variables are explicitly declared: var v : shared ItemType;  A shared variable can only be accessed within the code part ( S ) of a region statement: region v do S –while code S is being executed, no other process can access v Hoare, 1972; Brinch Hansen, 1972

59 OSes: 5. Synch 59 Conditional Critical Regions  region v when B do S –only execute S when the boolean expression B evaluates to true, otherwise wait until B is true –as before, while code S is being executed, no other process can access v

60 OSes: 5. Synch 60 Bounded Buffer Again v Shared data: var buffer : shared record pool : array[0..n-1] of Item; count, in, out : integer; end;

61 OSes: 5. Synch 61 Producer Code region buffer when (count < n) do begin pool[in] := itemP; in := (in+1) mod n; count := count + 1; end;

62 OSes: 5. Synch 62 Consumer Code region buffer when (count > 0) do begin itemC := pool[out]; out := (out+1) mod n; count := count - 1; end;

63 OSes: 5. Synch 63 8. Monitors Brinch Hansen, 1973 shared data initialization code operations var queues associated with condition variables entry queue of waiting processes Fig. 6.20, p.184

64 OSes: 5. Synch 64 Monitor Syntax type monitor-name = monitor variable declarations procedure entry p1(...) begin... end; : begin initialization code end.

65 OSes: 5. Synch 65 Features v When an instance of a monitor is created, its initialization code is executed v A procedure can access its own variables and those in the monitor’s variable declarations v A monitor only allows one process to use its operations at a time

66 OSes: 5. Synch 66 An OO View of Monitors v A monitor is similar to a class v An instance of a monitor is similar to an object, with all private data v Plus synchronization: invoking any operation (method) results in mutual exclusion over the entire object

67 OSes: 5. Synch 67 8.1. Condition Variables v Notation: var x : condition; x.wait; u suspend calling process x.signal;  resumes one of the suspended processes waiting on x

68 OSes: 5. Synch 68 Condition Variables in Monitors  What happens when signal is issued?  The unblocked process will be placed on the ready queue and resume from the statement following the wait. v This would violate mutual exclusion if both the signaller and signalled process are executing in the monitor at once.

69 OSes: 5. Synch 69 Three Possible Solutions  1. Have the signaller leave the monitor immediately after calling signal v 2. Have the signalled process wait until the signaller has left the monitor v 3. Have the signaller wait until the signalled process has left the monitor

70 OSes: 5. Synch 70 8.2. Dining Philosophers (Again)  Useful data structures:  Useful data structures: var state : array[0..4] of (thinking, hungry, eating); var self : array[0..4] of condition; /* used to delay philosophers */  The approach is to only set state[i] to eating if its two neigbours are not eating –i.e. state[(i+4) mod 5] = eating and state[(i+1) mod 5] = eating

71 OSes: 5. Synch 71 Using the dining-philosophers Monitor v Shared data: var dp : dining-philosopher; v Code in philosopher i: dp.pickup(i): /*... eat... */ dp.putdown(i);

72 OSes: 5. Synch 72 Monitor implementation type dining-philosophers = monitor var state : array[0..4] of (thinking, hungry, eating); var self : array[0..4] of condition; procedure entry pickup(i : 0..4) begin state[i] := hungry; test(i); if (state[i] /== eating) then self[i].wait; end; continued

73 OSes: 5. Synch 73 procedure entry putdown(i : 0..4) begin state[i] := thinking; test((i+4) mod 5); test((i+1) mod 5); end; continued

74 OSes: 5. Synch 74 procedure test(k : 0..4) begin if ((state[(k+4) mod 5] /== eating) and (state[k] == hungry) and (state[(k+1) mod 5] /== eating)) then begin state[k] := eating; self[k].signal; end; end; continued

75 OSes: 5. Synch 75 begin /* initialization of monitor instance */ for i := 0 to 4 do state[i] := thinking; end.

76 OSes: 5. Synch 76 8.3. Problems with Monitors v Even high level operations can be misused. v For correctness, we must check: –that all user processes always call the monitor operations in the right order; –that no user process bypasses the monitor and uses a shared resource directly –called the access-control problem

77 OSes: 5. Synch 77 9. Synchronization in Solaris 2 v Uses a mix of techniques: –semaphores using spinlocks –thread blocking –condition variables (without monitors) –specialised reader-writer locks on data

78 OSes: 5. Synch 78 10. Atomic Transactions v We want to do all the operations of a critical section as a single logical ‘unit’ of work –it is either done completely or not at all  A transaction can be viewed as a sequence of read s and write s on shared data, ending with a commit or abort operation  An abort causes a partial transaction to be rolled back

79 OSes: 5. Synch 79 10.1. Log-based Recovery v Atomicity is ensured by logging transaction operations to stable storage –these can be replayed or used for rollback if failure occurs v Log details: –transaction name, data name, old value, new value continued

80 OSes: 5. Synch 80 v Write-ahead logging: –log a write operation before doing it –log the transaction start and its commit

81 OSes: 5. Synch 81 Example begin transaction read X if (X >= a) then { read Y X = X - a Y = Y + a write X write Y } end transaction (VUW CS 305)

82 OSes: 5. Synch 82 Recovery v Operations: –undo( Transaction i ) –redo( Transaction i )  Possible states of Transaction i –committed, but were new values written? –aborted, but were old values restored? –unfinished

83 OSes: 5. Synch 83 10.2. Checkpoints v A checkpoint fixes state changes by writing them to stable storage so that the log file can be reset or shortened.

84 OSes: 5. Synch 84 10.3. Concurrent Atomic Transactions v We want to ensure that the outcome of concurrent transactions are the same as if they were executed in some serial order –serializability

85 OSes: 5. Synch 85 A Serial Schedule  Transaction 0Transaction 1 read A write A read B write B read A write A read B write B Fig. 6.23, p.195

86 OSes: 5. Synch 86 Conflicting Operations  Two operations in different transactions conflict if they access the same data and one of them is a write. v Serializability must avoid conflicting operations: –it can do that by delaying/speeding up when operations in a transaction are performed

87 OSes: 5. Synch 87 A Concurrent Serializable Schedule  Transaction 0Transaction 1 read A write A read A write A read B write B read B write B Fig. 6.24, p.196

88 OSes: 5. Synch 88 10.4. Locks v Serializability can be achieved by locking data items v There are a range of locking modes: –a shared lock allows multiple reads by different transactions –an exclusive lock allows only one transaction to do reads/writes

89 OSes: 5. Synch 89 10.5. Timestamping v One way of ordering transactions v Using the system clock is not sufficient when transactions may originate on different machines


Download ppt "OSes: 5. Synch 1 Operating Systems v Objectives –describe the synchronization problem and some common mechanisms for solving it Certificate Program in."

Similar presentations


Ads by Google