Synchronization
Download
Report
Transcript Synchronization
Course Syllabus
1. Introduction
- History; Views; Concepts; Structure
2. Process Management - Processes; State + Resources;
Threads; Unix implementation of Processes
3. Process Scheduling – Paradigms; Unix; Modeling
4. Process Synchronization - Synchronization primitives and
their equivalence; Deadlocks
5. Memory Management - Virtual memory; Page replacement
algorithms; Segmentation
6. File Systems - Implementation; Directory and space
management; Unix file system; Distributed file systems
(NFS)
7. Security – General policies and mechanisms; protection
models; authentication
8. Distributed issues – Synchronization; Mutual exclusion
Operating Systems, 2012, Danny Hendler & Roie Zivan
1
Mutual exclusion: motivation
Race Conditions:
Example: Spooler directory with slots; index variables; two
processes attempt concurrent access. In points to the next
empty slot, Out points to entry holding name of file to
print next.
4
...
5
abc.doc f.ps
Out = 4
6
7
Process A
...
paper.ps
In=7
Operating Systems, 2012, Danny Hendler & Roie Zivan
Process B
2
Code using reads/writes only
Add-file-to-print-spool (char *name)
1.
Local-in := In
2.
StoreName(Spool-dir[local-in], name)
3.
In := (local-in+1) mod DIR-LEN
A scenario proving the above code wrong
•
Process A performs line 1
•
Process A is preempted by Process B
•
Process B performs Add-file-to-print-spool to completion
•
Process A is re-scheduled, completes lines 2-3.
Process B's file is never printed.
Operating Systems, 2012, Danny Hendler & Roie Zivan
3
The mutual exclusion problem (Dijkstra, 1965)
How can we avoid such race conditions?
We need to devise a protocol that guarantees
mutually exclusive access by processes to a
shared resource (such as a file, printer, etc.) or,
more generally, a critical section of code
Operating Systems, 2012, Danny Hendler & Roie Zivan
4
The problem model
Multiple processes
Processes can apply read, write, or stronger operations to
shared memory
Completely asynchronous
We assume processes do not fail-stop
Operating Systems, 2012, Danny Hendler & Roie Zivan
5
Mutual exclusion: formal definition
loop forever
Remainder code
Entry code
Critical section (CS)
Exit code
end loop
Remainder code
Entry code
CS
Exit code
Operating Systems, 2012, Danny Hendler & Roie Zivan
6
Mutex Requirements
Mutual exclusion: No two processes are at the critical section (CS)
at the same time
Deadlock-freedom: If processes are trying to enter their critical
section, then some process eventually enters the critical section
Starvation-freedom: If a process is trying to enter its critical
section, then this process must eventually enter its critical section
Operating Systems, 2012, Danny Hendler & Roie Zivan
7
Mutual exclusion using critical regions
Operating Systems, 2012, Danny Hendler & Roie Zivan
8
Brute force solution: disabling interrupts
Disable interrupts
Do your stuff
Enable interrupts
Problems
User processes are not allowed to disable interrupts
Disabling interrupts must be done for a very short period of time
Does not solve the problem in a multi-processor system
Operating Systems, 2012, Danny Hendler & Roie Zivan
9
2-process Mutual Exclusion with a lock variable
initially: lock=0
Program for both processes
1.
2.
3.
4.
await lock=0
lock:=1
CS
lock:=0
No
Does it satisfy deadlock-freedom? Yes
Does it satisfy starvation-freedom? No
Does the algorithm satisfy mutex?
Operating Systems, 2012, Danny Hendler & Roie Zivan
10
Mutual Exclusion: strict alternation
initially: turn=0
Program for process 0
Program for process 1
1.
2.
3.
1.
2.
3.
await turn=0
CS
turn:=1
await turn=1
CS
turn:=0
Yes
Does it satisfy deadlock-freedom? No
Does it satisfy starvation-freedom? No
Does the algorithm satisfy mutex?
Operating Systems, 2012, Danny Hendler & Roie Zivan
11
Mutual Exclusion: flag array
bool flags[2] initially {false, false}
Program for process 0
Program for process 1
1.
2.
3.
4.
1.
2.
3.
4.
flags[0]:=true
await flags[1]=false
CS
flags[0]:=false
flags[1]:=true
await flags[0]=false
CS
flags[1]:=false
Yes
Does it satisfy deadlock-freedom? No
Does it satisfy starvation-freedom? No
Does the algorithm satisfy mutex?
Operating Systems, 2012, Danny Hendler & Roie Zivan
12
Peterson’s 2-process algorithm (Peterson, 1981)
initially: b[0]:=false, b[1]:=false, value of turn immaterial
Program for process 0
Program for process 1
1.
2.
3.
4.
5.
1.
2.
3.
4.
5.
b[0]:=true
turn:=0
await (b[1]=false or turn=1)
CS
b[0]:=false
b[1]:=true
turn:=1
await (b[0]=false or turn=0)
CS
b[1]:=false
Operating Systems, 2012, Danny Hendler & Roie Zivan
13
Schema for Peterson’s 2-process algorithm
Indicate participation
b[i]:=true
Barrier
turn:=i
Is there contention?
b[1-i]=true?
no
Critical Section
no, maybe
yes
First to cross barrier?
turn=1-i?
yes
Exit code
b[i]:=false
Operating Systems, 2012, Danny Hendler & Roie Zivan
Synchronization Algorithms and Concurrent Programming , Gadi Taubenfeld © 2006
14
Peterson’s 2-process algorithm
satisfies both mutual-exclusion
and starvation-freedom
Operating Systems, 2012, Danny Hendler & Roie Zivan
15
Observations
Shared register: turn (2-valued)
read & write by both processes
Two boolean registers: b[0], b[1]
process 0 can write b[0], process 1 can write b[1]
both can read b[0] & b[1]
Can the algorithm be modified to use only
single-writer registers ?
Operating Systems, 2012, Danny Hendler & Roie Zian
16
Kessels’ 2-process algorithm (1982)
encode
turn=0: as turn[0] = turn[1]
turn=1: as turn[0] ≠ turn[1]
initially: b[0]:=false, b[1]:=false, value of turn[i] immaterial
Program for process 0
Program for process 1
1.
2.
3.
4.
1.
2.
3.
4.
5.
6.
b[0]:=true
local[0]:=turn[1]
turn[0]:=local[0]
await (b[1]=false or
local[0] ≠ turn[1])
CS
b[0]:=false
5.
6.
b[1]:=true
local[1]:=1 – turn[0]
turn[1]:=local[1]
await (b[0]=false or
local[1] = turn[0])
CS
b[1]:=false
Operating Systems, 2012, Danny Hendler & Roie Zivan
17
Mutual exclusion for n processes:
A tournament tree
Level 2
0
Level 1
0
Level 0
1
0
Processes
0
1
1
2
2
3
4
3
5
6
7
A tree-node is identified by: [level, node#]
Operating Systems, 2012, Danny Hendler & Roie Zivan
Synchronization Algorithms and Concurrent Programming , Gadi Taubenfeld © 2006
18
N-process mutual exclusion: a tournament tree
Variables
Per node: b[level, 2node], b[level, 2node+1], turn[level,node]
Per process (local): level, node, id.
Program for process i
1.
node:=i
2.
For level = 0 to log n-1 do
3.
id:=node mod 2
4.
node:= node/2
5.
b[level,2node+id]:=true
6.
turn[level,node]:=id
7.
await (b[level,2node+1-id]=false or turn[level,node]=1-id)
8.
od
9.
CS
10.
for level=log n –1 downto 0 do
11.
node:= i/2level
12.
b[level,node]:=false
13. Operating
od
Systems, 2012, Danny Hendler & Roie Zivan
19
Fairness: First in First Out (FIFO)
Mutual Exclusion
Deadlock-freedom
Starvation-freedom
• FIFO: if process p is waiting
and process q has not yet
started the doorway, then q
will not enter the CS before p
remainder
doorway
waiting
entry code
critical
section
exit code
Operating Systems, 2012, Danny Hendler & Roie Zivan
Synchronization Algorithms and Concurrent Programming , Gadi Taubenfeld © 2006
20
Lamport’s Bakery Algorithm
entry
remainder
1
2
3
4
5
n
0
0
0
0
0
0
doorway
1
2
3
2
4
waiting
1
2
3
2
4
CS
1
2
2
exit
1
2
2
Operating Systems, 2012, Danny Hendler & Roie Zivan
Synchronization Algorithms and Concurrent Programming , Gadi Taubenfeld © 2006
time
21
Implementation 1
code of process i ,
i {1 ,..., n}
number[i] := 1 + max {number[j] | (1 j n)}
for j := 1 to n (<> i) {
await (number[j] = 0) (number[j] > number[i])
}
critical section
number[i] := 0
number
1
2
3
4
0
0
0
0
n
0
0
integer
Does this implementation work?
Answer: No, it can deadlock!
Operating Systems, 2012, Danny Hendler & Roie Zivan
Synchronization Algorithms and Concurrent Programming , Gadi Taubenfeld © 2006
22
Implementation 1: deadlock
entry
remainder
1
2
3
4
5
n
0
0
0
0
0
0
doorway
1
2
2
waiting
1
2
2
CS
1
deadlock
exit
1
Operating Systems, 2012, Danny Hendler & Roie Zivan
Synchronization Algorithms and Concurrent Programming , Gadi Taubenfeld © 2006
time
23
Implementation 2
code of process i ,
i {1 ,..., n}
number[i] := 1 + max {number[j] | (1 j n)}
for j := 1 to n (<> i) {
await (number[j] = 0) (number[j],j) < number[i],i)
// lexicographical order
}
critical section
number[i] := 0
number
1
2
3
4
0
0
0
0
n
0
0
integer
Does this implementation work?
Answer: It does not satisfy mutual exclusion!
Operating Systems, 2012, Danny Hendler & Roie Zivan
Synchronization Algorithms and Concurrent Programming , Gadi Taubenfeld © 2006
24
Implementation 2: no mutual exclusion
entry
remainder
1
2
3
4
5
n
0
0
0
0
0
0
doorway
0
1
0
2
0
2
waiting
1
2
2
CS
1
2
2
exit
1
Operating Systems, 2012, Danny Hendler & Roie Zivan
Synchronization Algorithms and Concurrent Programming , Gadi Taubenfeld © 2006
time
25
The Bakery Algorithm
code of process i, i {1 ,..., n}
1: choosing[i] := true
2: number[i] := 1 + max {number[j] | (1 j n)}
3: choosing[i] := false
4: for j := 1 to n do
5:
await choosing[j] = false
6:
await (number[j] = 0) (number[j],j) (number[i],i)
7: od
8: critical section
9: number[i] := 0
choosing
number
1
2
3
4
n
false
false
false
false
false
false
0
0
0
0
0
0
Operating Systems, 2012, Danny Hendler & Roie Zivan
bits
integer
26
Lamport’s bakery algorithm
satisfies mutual-exclusion,
starvation-freedom, and FIFO
Operating Systems, 2012, Danny Hendler & Roie Zivan
27
The test-and-set instruction
initially: v:=0
Test-and-set(w)
do atomically
prev:=w
w:=1
return prev
Program for process i
1.
2.
3.
await test&set(v) = 0
Critical Section
v:=0
Mutual exclusion? Yes
Deadlock-freedom? Yes
Starvation-freedom? No
Operating Systems, 2012, Danny Hendler & Roie Zivan
28
Starvation-free mutex using test-and-set
boolean lock initially 0, interested[n] initially false
program for process i
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
interested[i]:=true
await ( (test-and-set(lock) = 0) || (interested[i]=false) )
CS
interested[i]:=false
j:=(i+1) % n
while (j != i && !interested[j]) j:=++j % n
if (j=i)
lock:=0
else
interested[j]:=false
Operating Systems, 2012, Danny Hendler & Roie Zivan
29