Title: Concurrency
1Concurrency
2Bakery algorithm of Lamport
- Critical section algorithm for any ngt1
- Each time a process is requesting an entry to CS,
assign it a ticket which is - Unique and monotonically increasing
- Let the process into CS in the order of their
numbers
3Choosing a ticket
4Bakery algorithm for n processes
5Correctness
Lemma
Mutual exclusion is immediate from this lemma It
is easy to show that Progress and Fairness
hold as well (recitation)
6Hardware primitives
- Elementary building blocks capable of performing
certain steps atomically - Should be universal to allow for solving
versatile synchronization problems - Numerous such primitives were identified
- Test-and-set
- Fetch-and-add
- Compare-and-swap
7Test-and-Set (TS)
- boolean test-and-set(boolean lock)
-
- templock
- lockTRUE
- return temp
-
- reset(boolean lock)
-
- lockFALSE
8Critical section using TS
Shared boolean lock, initially FALSE do
while(test-and-set(lock)) critical
section reset(lock) reminder section
while(1)
- Check yourself!
- Is mutual exclusion satisfied?
- Is progress satisfied?
- Is fairness satisfied?
9Discussion
- Satisfies Mutual Exclusion and Progress
- Does not satisfies Fairness
- Provides exclusion among unbounded number of
processes - Process IDs and number are unknown
- Busy waiting
- Burning CPU cycles while being blocked
10Fetch-and-Add (FAA)
s shared, a local int FAA(int s, int
a) temps ssa return temp
FAA can be used as a ticket machine
11Critical section using FAA
Shared int s, turn Initially s 0
turn0 Process Pi code Entry me
FAA(s,1) while(turn lt me) // busy wait for my
turn Critical section Exit FAA(turn,1)
- Check yourself!
- Is mutual exclusion satisfied?
- Is progress satisfied?
- Is fairness satisfied?
12Discussion
- Satisfies all three properties
- Supports unbounded number of processes
- Unbounded counter
- Busy waiting
13Problems with studied synchronization methods
- Critical section framework is inconvenient for
programming - Performance penalty
- Busy waiting
- Too coarse synchronization
- Using hardware primitives directly results in
non-portable code
14Higher Level Abstractions
- Higher level software abstractions are
represented by - Semaphores
- Monitors
15Semaphores
- Invented by Edsger Dijkstra in 1968
- Interface consists of two primitives
- P() and V()
16Notes on the Language
- Dutch P Proberen, V Verhogen
- Hebrew P ????, V ????
- English P() wait(), V() signal()
17Semaphores initial value
- Initial value of a semaphore indicates how many
identical instances of the critical resource
exist - A semaphore initialized to 1 is called a mutex
(mutual exclusion)
18Programming with semaphores
- Semaphores is a powerful programming abstraction
- Define a semaphore for each critical resource
- E.g., one for each linked list
- Granularity?
- Concurrent processes access appropriate
semaphores when synchronization is needed
19Some examples
P(synch)
V(synch)
20Some examples
Do P(mutex) critical section V(mutex) Rema
inder section While(1)
21Implementing semaphores
- Semaphores can be implemented efficiently by the
system - P() is explicitly telling the system Hey, I
cannot proceed, you can preempt me - V() instructs the system to wake up a waiting
process
22Implementing Semaphores
type semaphore record count
integer queue list of
process end var S semaphore
S.count must be initialized to a nonnegative
value (depending on application)
23Implementing Semaphores
P(S) S.count-- if (S.countlt0) add
this process to S.queue block this process
V(S) S.count if (S.count lt 0)
remove a process P from S.queue place this
process P on ready queue
24Were still cheating
- P() and V() must be executed atomically
- In uniprocessor system may disable interrupts
- In multi-processor system, use hardware
synchronization primitives - TS, FAA, etc
- Involves a some limited amount of busy waiting
25Monitors
- Only a single process at a time can be active
within the monitor - gt other processes calling Pi() are queued
- Conditional variables for finer grained
synchronization - x.wait() suspend the execution until another
process calls x.signal()
monitor monitor-name shared variable
declarations procedure P1()
procedure Pn()