ch02.4 - Process Synchronization
ch02.4 - Process Synchronization
2.4
Process Synchronization
Outline
Background
The Critical-Section Problem
Peterson’s Solution
Hardware Support for Synchronization
Mutex Locks
Semaphores
Monitors
Liveness
Evaluation
Operating System Concepts – 10th Edition 6.2 Silberschatz, Galvin and Gagne ©2018
1
Objectives
Describe the critical-section problem and illustrate a race condition
Illustrate hardware solutions to the critical-section problem using
memory barriers, compare-and-swap operations, and atomic
variables
Demonstrate how mutex locks, semaphores, monitors, and condition
variables can be used to solve the critical section problem
Evaluate tools that solve the critical-section problem in low-,
Moderate-, and high-contention scenarios
Operating System Concepts – 10th Edition 6.3 Silberschatz, Galvin and Gagne ©2018
Background
Processes can execute concurrently
• May be interrupted at any time, partially completing execution
Concurrent access to shared data may result in data inconsistency
Maintaining data consistency requires mechanisms to ensure the
orderly execution of cooperating processes
The Bounded Buffer problem with use of a counter that is updated
concurrently by the producer and consumer,. Which lead to race
condition.
Operating System Concepts – 10th Edition 6.4 Silberschatz, Galvin and Gagne ©2018
2
Race Condition
Processes P0 and P1 are creating child processes using the fork()
system call
Race condition on kernel variable next_available_pid which
represents the next available process identifier (pid)
Operating System Concepts – 10th Edition 6.6 Silberschatz, Galvin and Gagne ©2018
3
Critical Section
Operating System Concepts – 10th Edition 6.7 Silberschatz, Galvin and Gagne ©2018
Operating System Concepts – 10th Edition 6.8 Silberschatz, Galvin and Gagne ©2018
4
Classification of solutions
Interrupt-based Solution
Software Solution
• Software Solution 1
• Software Solution 2
• Peterson’s Algorithm
Hardware support for synchronization
• Memory barriers
• Special hardware instructions
Test-and-Set instruction
Compare-and-Swap instruction
Mutex lock
Semaphores
Monitors
Liveness
Operating System Concepts – 10th Edition 6.9 Silberschatz, Galvin and Gagne ©2018
Interrupt-based Solution
The critical-section problem could be solved simply in a single-core
environment if we could prevent interrupts from occurring while a
shared variable was being modified.
Entry section: disable interrupts
Exit section: enable interrupts
Will this solve the problem?
Operating System Concepts – 10th Edition 6.10 Silberschatz, Galvin and Gagne ©2018
5
Software Solution 1
Two process solution
Assume that the load and store machine-language instructions are
atomic; that is, cannot be interrupted
The two processes share one variable:
• int turn;
The variable turn indicates whose turn it is to enter the critical section
Initially turn = 0
Algorithm for Process Pi
while (true)
{
turn = i;
while (turn = = j) ;
/* critical section */
turn = j;
/* remainder section */
}
Operating System Concepts – 10th Edition 6.11 Silberschatz, Galvin and Gagne ©2018
6
Software Solution 2
Operating System Concepts – 10th Edition 6.13 Silberschatz, Galvin and Gagne ©2018
Operating System Concepts – 10th Edition 6.14 Silberschatz, Galvin and Gagne ©2018
7
Algorithm for Process Pi
The variable turn indicates whose turn it is to enter the critical section
The flag array is used to indicate if a process is ready to enter the critical
section.
• flag[i] = true implies that process Pi is ready!
while (true){
/* critical section */
flag[i] = false;
/* remainder section */
}
Operating System Concepts – 10th Edition 6.15 Silberschatz, Galvin and Gagne ©2018
Peterson’s Algorithm
while (true){ /* 0 wants in */
flag[0] = true;
turn = 1; /* 0 gives a change to 1 */
while (flag[1] && turn = = 1)
;
/* critical section */
/* 0 no longer wants in */
flag[0] = false;
/* remainder section */
}
8
Correctness of Peterson’s Solution
Three CS requirement are met:
1. Mutual exclusion is preserved
Pi enters CS only if: either flag[j] = false or turn = i
2. Progress requirement is satisfied
3. Bounded-waiting requirement is met
1. Prove: Pi and Pj are same time if: flag[i] = flag[j] == true and turn == i. => cannot occur
2,3. Prove: Note that a process can be prevented from entering the CS only if it is stuck in the while
loop with the condition flag[i] = true and turn = j, this loop is the only one possible.
If Pj is not ready to CS, then flag[j] == false, and Pi can enter its CS.
If Pj has set flag[j] = true and is also executing in its while statement, then either turn == i or j.
• If turn == i,then Pi will enter the CS.
• If turn == j, then Pj will enter the CS. (Pi continue)
However, once Pj exits its CS, it will reset flag[j] =false, allowing Pi to enter its CS.
If Pj resets flag[j] to true, it must also set turn to i.
Thus, since Pi does not change the value of the variable turn while executing the while statement,
Pi will enter the CS (progress) after at most one entry by Pj (bounded waiting)
Operating System Concepts – 10th Edition 6.17 Silberschatz, Galvin and Gagne ©2018
Peterson’s Solution
Solution works for 2 process.
What about modifying it to handle 10 processes?
Solution requires busy waiting
• Processes waste CPU cycles to ask if they can enter the critical section
Operating System Concepts – 10th Edition 6.18 Silberschatz, Galvin and Gagne ©2018
9
Modern Architecture Example
Two threads share the data:
boolean flag = false;
int x = 0;
Thread 1 performs
while (!flag)
;
print x
Thread 2 performs
x = 100;
flag = true
What is the expected output (Thread1)? 100
However, since the variables flag and x are independent of each
other, the instructions: (reorder the instructions for Thread 2)
flag = true;
x = 100;
If this occurs, the output may be (Thread1): 0
Operating System Concepts – 10th Edition 6.19 Silberschatz, Galvin and Gagne ©2018
This allows both processes to be in their critical section at the same time!
To ensure that Peterson’s solution will work correctly on modern computer
architecture we must use Memory Barrier
Operating System Concepts – 10th Edition 6.20 Silberschatz, Galvin and Gagne ©2018
10
Hardware Support for Synchronization
Operating System Concepts – 10th Edition 6.21 Silberschatz, Galvin and Gagne ©2018
Operating System Concepts – 10th Edition 6.22 Silberschatz, Galvin and Gagne ©2018
11
Memory Barrier Example
We could add a memory barrier to the following instructions to ensure
Thread 1 outputs 100:
Thread 1 now performs
while (!flag)
memory_barrier();
print x
Thread 2 now performs
x = 100;
memory_barrier();
flag = true
For Thread 1 we are guaranteed that that the value of flag is loaded
before the value of x.
For Thread 2 we ensure that the assignment to x occurs before the
assignment flag.
Operating System Concepts – 10th Edition 6.23 Silberschatz, Galvin and Gagne ©2018
Hardware Instructions
Special hardware instructions that allow us to either test-and-modify
the content of a word, or to swap the contents of two words atomically
(uninterruptedly.)
• Test-and-Set instruction
• Compare-and-Swap instruction
Operating System Concepts – 10th Edition 6.24 Silberschatz, Galvin and Gagne ©2018
12
The test_and_set Instruction
Definition
boolean test_and_set (boolean *target)
{
boolean rv = *target;
*target = true;
return rv:
}
Properties
• Executed atomically
• Returns the original value of passed parameter
• Set the new value of passed parameter to true
Operating System Concepts – 10th Edition 6.25 Silberschatz, Galvin and Gagne ©2018
/* critical section */
lock = false;
/* remainder section */
} while (true);
Operating System Concepts – 10th Edition 6.26 Silberschatz, Galvin and Gagne ©2018
13
The compare_and_swap Instruction
Definition
int compare_and_swap(int *value, int expected, int new_value)
{
int temp = *value;
if (*value == expected)
*value = new_value;
return temp;
}
Properties
• Executed atomically
• Returns the original value of passed parameter value
• Set the variable value the value of the passed parameter new_value
but only if *value == expected is true. That is, the swap takes
place only under this condition.
Operating System Concepts – 10th Edition 6.27 Silberschatz, Galvin and Gagne ©2018
/* critical section */
lock = 0;
/* remainder section */
}
Operating System Concepts – 10th Edition 6.28 Silberschatz, Galvin and Gagne ©2018
14
Bounded-waiting with compare-and-swap
while (true) {
waiting[i] = true;
key = 1;
while (waiting[i] && key == 1)
key = compare_and_swap(&lock,0,1);
waiting[i] = false;
/* critical section */
j = (i + 1) % n;
while ((j != i) && !waiting[j])
j = (j + 1) % n;
if (j == i)
lock = 0;
else
waiting[j] = false;
/* remainder section */
}
Operating System Concepts – 10th Edition 6.29 Silberschatz, Galvin and Gagne ©2018
Atomic Variables
Typically, instructions such as compare-and-swap are used as building
blocks for other synchronization tools (not used to provide mutual exclusion)
One tool is an atomic variable that provides atomic (uninterruptible)
updates on basic data types such as integers and Booleans.
For example:
• Let sequence be an atomic variable
• Let increment() be operation on the atomic variable sequence
• The Command: increment(&sequence);
ensures sequence is incremented without interruption:
void increment(atomic_int *v)
{
int temp;
do {
temp = *v;
}
while (temp !=
(compare_and_swap(v,temp,temp+1));
}
Operating System Concepts – 10 Edition
th 6.30 Silberschatz, Galvin and Gagne ©2018
15
Mutex Locks
Previous solutions are complicated and generally inaccessible to
application programmers
OS designers build software tools to solve critical section problem
Simplest is mutex lock
• Boolean variable indicating if lock is available or not
Two operations:
• acquire() a lock
• release() a lock
The acquire() and release()are executed atomically
• Usually implemented via hardware atomic instructions such as
compare-and-swap.
But this solution requires busy waiting
• This lock therefore called a spinlock
Operating System Concepts – 10th Edition 6.31 Silberschatz, Galvin and Gagne ©2018
while (true) {
acquire lock
critical section
release lock
remainder section
}
Operating System Concepts – 10th Edition 6.32 Silberschatz, Galvin and Gagne ©2018
16
Semaphore
Synchronization tool that provides more sophisticated ways (than Mutex locks)
for processes to synchronize their activities.
Semaphore S – integer variable
Can only be accessed via two indivisible (atomic) operations
• wait() and signal()
Originally called P() and V()
Definition of the wait() operation
wait(S) {
while (S <= 0)
; // busy wait
S--;
}
Definition of the signal() operation
signal(S) {
S++;
}
Operating System Concepts – 10th Edition 6.33 Silberschatz, Galvin and Gagne ©2018
Semaphore (Cont.)
Counting semaphore – integer value can range over an unrestricted
domain
Binary semaphore – integer value can range only between 0 and 1
• Same as a mutex lock
Can implement a counting semaphore S using binary semaphores
With semaphores we can solve various synchronization problems
Operating System Concepts – 10th Edition 6.34 Silberschatz, Galvin and Gagne ©2018
17
Semaphore Usage Example (Cont.)
Solution to the CS Problem
• Create a semaphore “mutex” initialized to 1
• Code:
wait(mutex);
CS
signal(mutex);
Consider P1 and P2 that with two statements S1 and S2 and the
requirement that S1 to happen before S2
• Create a semaphore “synch” initialized to 0
• Code: to synchronization
P1:
S1;
signal(synch);
P2:
wait(synch);
S2;
Operating System Concepts – 10th Edition 6.35 Silberschatz, Galvin and Gagne ©2018
Semaphore Implementation
Operating System Concepts – 10th Edition 6.36 Silberschatz, Galvin and Gagne ©2018
18
Implementation with no Busy waiting
OS provides 2 tasks:
• The wakeup(P) operation resumes the execution of process P
• The sleep() suspends the process that invoked it
Operating System Concepts – 10th Edition 6.37 Silberschatz, Galvin and Gagne ©2018
Operating System Concepts – 10th Edition 6.38 Silberschatz, Galvin and Gagne ©2018
19
Problems with Semaphores
Incorrect use of semaphore operations:
Operating System Concepts – 10th Edition 6.39 Silberschatz, Galvin and Gagne ©2018
Monitors
A high-level abstraction that provides a convenient and effective
mechanism for process synchronization
Abstract data type, internal variables only accessible by code within the
procedure
Only one process may be active within the monitor at a time
Pseudocode syntax of a monitor:
monitor monitor-name
{
// shared variable declarations
function P1 (…) { …. }
function P2 (…) { …. }
Operating System Concepts – 10th Edition 6.40 Silberschatz, Galvin and Gagne ©2018
20
Schematic view of a Monitor
Operating System Concepts – 10th Edition 6.41 Silberschatz, Galvin and Gagne ©2018
Condition Variables
condition x, y;
Two operations are allowed on a condition variable:
• x.wait() – a process that invokes the operation is suspended
until x.signal()
• x.signal() – resumes one of processes (if any) that invoked
x.wait()
If no x.wait() on the variable, then it has no effect on the
variable
Operating System Concepts – 10th Edition 6.42 Silberschatz, Galvin and Gagne ©2018
21
Monitor with Condition Variables
Operating System Concepts – 10th Edition 6.43 Silberschatz, Galvin and Gagne ©2018
Operating System Concepts – 10th Edition 6.44 Silberschatz, Galvin and Gagne ©2018
22
Monitor Implementation Using Semaphores
Variables
wait(mutex);
…
body of F;
…
if (next_count > 0)
signal(next)
else
signal(mutex);
Operating System Concepts – 10th Edition 6.45 Silberschatz, Galvin and Gagne ©2018
23
Resuming Processes within a Monitor
Operating System Concepts – 10th Edition 6.47 Silberschatz, Galvin and Gagne ©2018
R.acquire(t);
...
access the resurce;
...
R.release;
Operating System Concepts – 10th Edition 6.48 Silberschatz, Galvin and Gagne ©2018
24
A Monitor to Allocate Single Resource
monitor ResourceAllocator
{
boolean busy;
condition x; Usage:
void acquire(int time) {
acquire
if (busy)
...
x.wait(time);
busy = true; release
} Incorrect use of monitor operations
void release() { • release() … acquire()
busy = FALSE; • acquire() … acquire())
x.signal();
• Omitting of acquire() and/or
}
release()
initialization code() {
busy = false;
}
}
Operating System Concepts – 10th Edition 6.49 Silberschatz, Galvin and Gagne ©2018
Liveness
Operating System Concepts – 10th Edition 6.50 Silberschatz, Galvin and Gagne ©2018
25
Deadlock
Deadlock – two or more processes are waiting indefinitely for an event
that can be caused by only one of the waiting processes
Let S and Q be two semaphores initialized to 1
P0 P1
wait(S); wait(Q);
wait(Q); wait(S);
... ...
signal(S); signal(Q);
signal(Q); signal(S);
Operating System Concepts – 10th Edition 6.51 Silberschatz, Galvin and Gagne ©2018
Operating System Concepts – 10th Edition 6.52 Silberschatz, Galvin and Gagne ©2018
26
Chapter 2: Process Synchronization
Synchronization Examples
Outline
Operating System Concepts – 10th Edition 6.54 Silberschatz, Galvin and Gagne ©2018
27
Classical Problems of Synchronization
Classical problems used to test newly-proposed
synchronization schemes
• Bounded-Buffer Problem
• Readers and Writers Problem
• Dining-Philosophers Problem
Operating System Concepts – 10th Edition 6.55 Silberschatz, Galvin and Gagne ©2018
Bounded-Buffer Problem
Operating System Concepts – 10th Edition 6.56 Silberschatz, Galvin and Gagne ©2018
28
Bounded Buffer Problem (Cont.)
while (true) {
...
/* produce an item in next_produced */
...
wait(empty);
wait(mutex);
...
/* add next produced to the buffer */
...
signal(mutex);
signal(full);
}
Operating System Concepts – 10th Edition 6.57 Silberschatz, Galvin and Gagne ©2018
while (true) {
wait(full);
wait(mutex);
...
/* remove an item from buffer to next_consumed */
...
signal(mutex);
signal(empty);
...
/* consume the item in next consumed */
...
}
Operating System Concepts – 10th Edition 6.58 Silberschatz, Galvin and Gagne ©2018
29
Readers-Writers Problem
A data set is shared among a number of concurrent processes
• Readers – only read the data set; they do not perform any
updates
• Writers – can both read and write
Problem – allow multiple readers to read at the same time
• Only one single writer can access the shared data at the same
time
Several variations of how readers and writers are considered – all
involve some form of priorities
Operating System Concepts – 10th Edition 6.59 Silberschatz, Galvin and Gagne ©2018
Operating System Concepts – 10th Edition 6.60 Silberschatz, Galvin and Gagne ©2018
30
The Structure of a Writer Process
while (true) {
wait(rw_mutex);
...
/* writing is performed */
...
signal(rw_mutex);
}
Operating System Concepts – 10th Edition 6.61 Silberschatz, Galvin and Gagne ©2018
while (true){
wait(mutex);
read_count++;
if (read_count == 1) /* first reader */
wait(rw_mutex);
signal(mutex);
...
/* reading is performed */
...
wait(mutex);
read count--;
if (read_count == 0) /* last reader */
signal(rw_mutex);
signal(mutex);
}
Operating System Concepts – 10th Edition 6.62 Silberschatz, Galvin and Gagne ©2018
31
Readers-Writers Problem Variations
The solution in previous slide can result in a situation where
a writer process never writes. It is referred to as the “First
reader-writer” problem.
The “Second reader-writer” problem is a variation the first
reader-writer problem that state:
• Once a writer is ready to write, no “newly arrived reader”
is allowed to read.
Both the first and second may result in starvation, leading to
even more variations
Problem is solved on some systems by kernel providing
reader-writer locks
Operating System Concepts – 10th Edition 6.63 Silberschatz, Galvin and Gagne ©2018
Dining-Philosophers Problem
N philosophers’ sit at a round table with a bowel of rice in the middle.
Operating System Concepts – 10th Edition 6.64 Silberschatz, Galvin and Gagne ©2018
32
Semaphore Solution to Dining-Philosophers
signal (chopstick[i] );
signal (chopstick[ (i + 1) % 5] );
}
What is the problem with this algorithm?
Operating System Concepts – 10th Edition 6.65 Silberschatz, Galvin and Gagne ©2018
Operating System Concepts – 10th Edition 6.66 Silberschatz, Galvin and Gagne ©2018
33
Solution to Dining Philosophers (Cont.)
initialization_code() {
for (int i = 0; i < 5; i++)
state[i] = THINKING;
}
}
Operating System Concepts – 10th Edition 6.67 Silberschatz, Galvin and Gagne ©2018
DiningPhilosophers.pickup(i);
DiningPhilosophers.putdown(i);
Operating System Concepts – 10th Edition 6.68 Silberschatz, Galvin and Gagne ©2018
34
End of Chapter 2
2.4
Operating System Concepts – 10th Edition Silberschatz, Galvin and Gagne ©2018
35