0% found this document useful (0 votes)
19 views47 pages

Cs231 Ch6 Share

Chapter 6 discusses process synchronization in operating systems, highlighting the importance of maintaining data consistency during concurrent access to shared data. It covers critical section problems, solutions like Peterson's algorithm, and semaphore implementations to manage mutual exclusion and avoid deadlock. The chapter also addresses classical synchronization problems, including the bounded-buffer, readers-writers, and dining-philosophers problems.

Uploaded by

prateek.singh23b
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
19 views47 pages

Cs231 Ch6 Share

Chapter 6 discusses process synchronization in operating systems, highlighting the importance of maintaining data consistency during concurrent access to shared data. It covers critical section problems, solutions like Peterson's algorithm, and semaphore implementations to manage mutual exclusion and avoid deadlock. The chapter also addresses classical synchronization problems, including the bounded-buffer, readers-writers, and dining-philosophers problems.

Uploaded by

prateek.singh23b
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 47

Chapter 6: Process

Synchronization

Operating System Concepts – 8th Edition Silberschatz, Galvin and Gagne ©2009
Background

 Concurrent access to shared data may result in data


inconsistency
 Maintaining data consistency requires mechanisms to
ensure the orderly execution of cooperating processes
 Suppose that we wanted to provide a solution to the
consumer-producer problem that fills all the buffers. We
can do so by having an integer count that keeps track of
the number of full buffers. Initially, count is set to 0. It is
incremented by the producer after it produces a new buffer
and is decremented by the consumer after it consumes a
buffer.

Operating System Concepts – 8th Edition 6.2 Silberschatz, Galvin and Gagne ©2009
Producer

while (true) {

/* produce an item and put in nextProduced */


while (counter == BUFFER_SIZE)
; // do nothing
buffer [in] = nextProduced;
in = (in + 1) % BUFFER_SIZE;
counter++;
}

Operating System Concepts – 8th Edition 6.3 Silberschatz, Galvin and Gagne ©2009
Consumer

while (true) {
while (counter == 0)
; // do nothing
nextConsumed = buffer[out];
out = (out + 1) % BUFFER_SIZE;
counter--;

/* consume the item in nextConsumed */


}

Operating System Concepts – 8th Edition 6.4 Silberschatz, Galvin and Gagne ©2009
Race Condition
 counter++ could be implemented as
register1 = counter
register1 = register1 + 1
counter = register1
 counter-- could be implemented as
register2 = counter
register2 = register2 - 1
count = register2
 Consider this execution interleaving with “count = 5” initially:
S0: producer execute register1 = counter {register1 = 5}
S1: producer execute register1 = register1 + 1 {register1 = 6}
S2: consumer execute register2 = counter {register2 = 5}
S3: consumer execute register2 = register2 - 1 {register2 = 4}
S4: producer execute counter = register1 {count = 6 }
S5: consumer execute counter = register2 {count = 4}

Operating System Concepts – 8th Edition 6.5 Silberschatz, Galvin and Gagne ©2009
Critical Section Problem
 Consider system of n processes {p0, p1, … pn-1}
 Each process has critical section segment of code
 Process may be changing common variables, updating table,
writing file, etc
 When one process in critical section, no other may be in its
critical section
 Critical section problem is to design protocol to solve this
 Each process must ask permission to enter critical section in
entry section, may follow critical section with exit section, then
remainder section

Operating System Concepts – 8th Edition 6.6 Silberschatz, Galvin and Gagne ©2009
Critical Section
 General structure of process pi is

Operating System Concepts – 8th Edition 6.7 Silberschatz, Galvin and Gagne ©2009
Solution to Critical-Section Problem
1 . Mutual Exclusion - If process Pi is executing in its critical
section, then no other processes can be executing in their
critical sections
2. Progress –
 the processes that will enter the critical section next cannot
be postponed indefinitely
 If no process is executing in its critical section and
 Processes not executing in remainder section will participate
in deciding the next.

Operating System Concepts – 8th Edition 6.8 Silberschatz, Galvin and Gagne ©2009
3. Bounded Waiting - A bound must exist on the number of times that
other processes are allowed to enter their critical sections after a
process has made a request to enter its critical section and before
that request is granted.

Operating System Concepts – 8th Edition 6.9 Silberschatz, Galvin and Gagne ©2009
Peterson’s Solution
 Two process solution
 Assume that the LOAD and STORE instructions are
atomic; that is, cannot be interrupted
 The two processes share two variables:
 int turn;
 Boolean flag[2]
 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!

Operating System Concepts – 8th Edition 6.10 Silberschatz, Galvin and Gagne ©2009
Algorithm for Process Pi
do {
flag[i] = TRUE;
turn = j;
while (flag[j] && turn == j);
critical section
flag[i] = FALSE;
remainder section
} while (TRUE);
 Provable that
1. Mutual exclusion is preserved
2. Progress requirement is satisfied
3. Bounded-waiting requirement is met

Operating System Concepts – 8th Edition 6.11 Silberschatz, Galvin and Gagne ©2009
Synchronization Hardware
 Many systems provide hardware support for critical section
code
 Uniprocessors – could disable interrupts
 Currently running code would execute without
preemption
 Generally too inefficient on multiprocessor systems
 Operating systems using this not broadly scalable
 Modern machines provide special atomic hardware
instructions
 Atomic = non-interruptable

 Either test memory word and set value


 Or swap contents of two memory words

Operating System Concepts – 8th Edition 6.12 Silberschatz, Galvin and Gagne ©2009
Solution to Critical-section
Problem Using Locks

do {
acquire lock
critical section
release lock
remainder section
} while (TRUE);

Operating System Concepts – 8th Edition 6.13 Silberschatz, Galvin and Gagne ©2009
TestAndSet Instruction

 Definition:

boolean TestAndSet (boolean *target)


{
boolean rv = *target;
*target = TRUE;
return rv:
}

Operating System Concepts – 8th Edition 6.14 Silberschatz, Galvin and Gagne ©2009
Solution using TestAndSet

 Shared boolean variable lock, initialized to FALSE


 Solution:
do {
while ( TestAndSet (&lock ))
; // do nothing
// critical section
lock = FALSE;
// remainder section
} while (TRUE);

Operating System Concepts – 8th Edition 6.15 Silberschatz, Galvin and Gagne ©2009
Swap Instruction

 Definition:

void Swap (boolean *a, boolean *b)


{
boolean temp = *a;
*a = *b;
*b = temp:
}

Operating System Concepts – 8th Edition 6.16 Silberschatz, Galvin and Gagne ©2009
Solution using Swap
 Shared Boolean variable lock initialized to FALSE; Each process
has a local Boolean variable key
 Solution:
do {
key = TRUE;
while ( key == TRUE)
Swap (&lock, &key );
// critical section
lock = FALSE;
// remainder section
} while (TRUE);

Operating System Concepts – 8th Edition 6.17 Silberschatz, Galvin and Gagne ©2009
Bounded-waiting Mutual Exclusion
with TestandSet()
do {
waiting[i] = TRUE;
key = TRUE;
while (waiting[i] && key)
key = TestAndSet(&lock);
waiting[i] = FALSE;
// critical section
j = (i + 1) % n;
while ((j != i) && !waiting[j])
j = (j + 1) % n;
if (j == i)
lock = FALSE;
else
waiting[j] = FALSE;
// remainder section
} while (TRUE);

Operating System Concepts – 8th Edition 6.18 Silberschatz, Galvin and Gagne ©2009
Which one or more of the following CPU scheduling algorithms can potentially cause starvation?

Which one or more of the following CPU scheduling algorithms can


potentially cause starvation?

A • First-in First-Out

B • Round Robin

• Priority Scheduling

• Shortest Job First

Operating System Concepts – 8th Edition 6.19 Silberschatz, Galvin and Gagne ©2009
Semaphore
 Synchronization tool that does not require busy waiting (a process
repeatedly checks to see if a condition is true and so consumes CPU
time without doing useful work)
 Semaphore S – integer variable
 Two standard operations modify S: wait() and signal()
 Less complicated
 Can only be accessed via two indivisible (atomic) operations
 wait (S) {
while (S <= 0)
; // no-op
S--;
}
 signal (S) {
S++;
}
Operating System Concepts – 8th Edition 6.20 Silberschatz, Galvin and Gagne ©2009
Semaphore as
General Synchronization Tool
 Counting semaphore – integer value can range over an unrestricted
domain
 Binary semaphore – integer value can range only between 0
and 1; can be simpler to implement
 Also known as mutex locks
 Provides mutual exclusion
Semaphore mutex; // initialized to 1
do {
wait (mutex);
// Critical Section
signal (mutex);
// remainder section
} while (TRUE);

Operating System Concepts – 8th Edition 6.21 Silberschatz, Galvin and Gagne ©2009
Semaphore Implementation
 Must guarantee that no two processes can execute wait () and signal
() on the same semaphore at the same time

 Thus, implementation becomes the critical section problem where


the wait and signal code are placed in the critical section
 Could now have busy waiting in critical section implementation
 But implementation code is short
 Little busy waiting if critical section rarely occupied

 Note that applications may spend lots of time in critical sections and
therefore this is not a good solution

Operating System Concepts – 8th Edition 6.22 Silberschatz, Galvin and Gagne ©2009
Semaphore Implementation
with no Busy waiting

 With each semaphore there is an associated waiting queue


 Each entry in a waiting queue has two data items:
 value (of type integer)
 pointer to next record in the list

 Two operations:
 block – place the process invoking the operation on the
appropriate waiting queue
 wakeup – remove one of processes in the waiting queue and
place it in the ready queue

Operating System Concepts – 8th Edition 6.23 Silberschatz, Galvin and Gagne ©2009
Semaphore Implementation with
no Busy waiting (Cont.)
 Implementation of wait:
wait(semaphore *S) {
S->value--;
if (S->value < 0) {
add this process to S->list;
block();
}
}
 Implementation of signal:
signal(semaphore *S) {
S->value++;
if (S->value <= 0) {
remove a process P from S->list;
wakeup(P);
}
}
Operating System Concepts – 8 Edition
th 6.24 Silberschatz, Galvin and Gagne ©2009
Deadlock and Starvation
 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);
 Starvation – indefinite blocking
 A process may never be removed from the semaphore queue in which it is
suspended
 Priority Inversion – Scheduling problem when lower-priority process holds a
lock needed by higher-priority process
 Solved via priority-inheritance protocol

Operating System Concepts – 8th Edition 6.25 Silberschatz, Galvin and Gagne ©2009
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 – 8th Edition 6.26 Silberschatz, Galvin and Gagne ©2009
Bounded-Buffer Problem (Producer
Consumer Problem)

 N buffers, each can hold one item

 Semaphore mutex initialized to the value 1

 Semaphore full initialized to the value 0

 Semaphore empty initialized to the value N

Operating System Concepts – 8th Edition 6.27 Silberschatz, Galvin and Gagne ©2009
Semaphore Implementation with
no Busy waiting (Cont.)
 Implementation of wait:
Binary
wait(semaphore *S) { wait (S) {
S->value--; while S <= 0
if (S->value < 0) { ; // no-op
S--;
add this process to S->list; }
block(); signal (S) {
} S++;
}
}
 Implementation of signal:
signal(semaphore *S) {
S->value++;
if (S->value <= 0) {
remove a process P from S->list;
wakeup(P);
}
Operating System} Concepts – 8 Edition
th 6.28 Silberschatz, Galvin and Gagne ©2009
Bounded Buffer Problem (Cont.)

 Producer process  Consumer process


do { do {
wait (full);
// produce an item in nextp wait (mutex);
wait (empty); // remove an item from buffer
wait (mutex); signal (mutex);
// add the item to the buffer signal (empty);
signal (mutex); } while (TRUE);
signal (full);
} while (TRUE);

Operating System Concepts – 8th Edition 6.29 Silberschatz, Galvin and Gagne ©2009
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 treated – all
involve priorities

Operating System Concepts – 8th Edition 6.30 Silberschatz, Galvin and Gagne ©2009
Readers-Writers Problem Variations
 First variation – no reader kept waiting unless writer has permission to
use shared object

 Second variation – once writer is ready, it performs write asap

 Both may have starvation leading to even more variations

 Problem is solved on some systems by kernel providing reader-writer


locks

Operating System Concepts – 8th Edition 6.31 Silberschatz, Galvin and Gagne ©2009
Readers-Writers Problem (Cont.)

 The structure of a writer process

Shared Data
Data set do {
Semaphore wait (wrt) ;
mutex initialized to 1
wrt initialized to 1
Int readcount initialized to 0 // writing is performed

signal (wrt) ;
} while (TRUE);

Operating System Concepts – 8th Edition 6.32 Silberschatz, Galvin and Gagne ©2009
Readers-Writers Problem (Cont.)
 The structure of a reader process
 The structure of a writer process
do {
wait (mutex) ;
readcount ++ ; do {
if (readcount == 1) wait (wrt) ;
wait (wrt) ; // writing is performed
signal (mutex) signal (wrt) ;
// reading is performed
} while (TRUE);
wait (mutex) ;
readcount - - ;
if (readcount == 0)
signal (wrt) ;
signal (mutex) ;
} while (TRUE);
Operating System Concepts – 8th Edition 6.33 Silberschatz, Galvin and Gagne ©2009
Dining-Philosophers Problem

Five Philosophers on a table; Eat and think


alternately. Need 2 chopsticks to eat

Operating System Concepts – 8th Edition 6.34 Silberschatz, Galvin and Gagne ©2009
 Philosophers spend their lives thinking and eating
 Don’t interact with their neighbors, occasionally try to pick up 2
chopsticks (one at a time) to eat from bowl
 Need both to eat, then release both when done
 In the case of 5 philosophers
 Shared data
 Bowl of rice (data set)
 Semaphore chopstick [5] initialized to 1

Operating System Concepts – 8th Edition 6.35 Silberschatz, Galvin and Gagne ©2009
Dining-Philosophers Problem Algorithm
 The structure of Philosopher i:
do {
wait ( chopstick[i] );
wait ( chopStick[ (i + 1) % 5] );
// eat
signal ( chopstick[i] );
signal (chopstick[ (i + 1) % 5] );
// think
} while (TRUE);

 What is the problem with this algorithm?

Operating System Concepts – 8th Edition 6.36 Silberschatz, Galvin and Gagne ©2009
Problems with Semaphores

 Incorrect use of semaphore operations:

 signal (mutex) …. wait (mutex)

 wait (mutex) … wait (mutex)

 Omitting of wait (mutex) or signal (mutex) (or both)

 Deadlock and starvation

Operating System Concepts – 8th Edition 6.37 Silberschatz, Galvin and Gagne ©2009
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
 But not powerful enough to model some synchronization schemes
monitor monitor-name
{
// shared variable declarations
procedure P1 (…) { …. }

procedure Pn (…) {……}

Initialization code (…) { … }


}
}
Operating System Concepts – 8th Edition 6.38 Silberschatz, Galvin and Gagne ©2009
Schematic view of a Monitor

Operating System Concepts – 8th Edition 6.39 Silberschatz, Galvin and Gagne ©2009
Condition Variables

 condition x, y;

 Two operations 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 – 8th Edition 6.40 Silberschatz, Galvin and Gagne ©2009
Monitor with Condition Variables

Operating System Concepts – 8th Edition 6.41 Silberschatz, Galvin and Gagne ©2009
Condition Variables Choices
 If process P invokes x.signal (), with Q in x.wait () state, what should
happen next?
 If Q is resumed, then P must wait
 Options include
 Signal and wait – P waits until Q leaves monitor or waits for
another condition.
 Signal and continue – Q waits until P leaves the monitor or
waits for another condition
 Both have pros and cons – language implementer can decide
 Monitors implemented in Concurrent Pascal compromise
P executing signal immediately leaves the monitor, Q is
resumed

Operating System Concepts – 8th Edition 6.42 Silberschatz, Galvin and Gagne ©2009
Solution to Dining Philosophers
monitor DiningPhilosophers
{
enum { THINKING; HUNGRY, EATING) state [5] ;
condition self [5];

void pickup (int i) {


state[i] = HUNGRY;
test(i);
if (state[i] != EATING) self [i].wait;
}

void putdown (int i) {


state[i] = THINKING;
// test left and right neighbors
test((i + 4) % 5);
test((i + 1) % 5);
}

Operating System Concepts – 8th Edition 6.43 Silberschatz, Galvin and Gagne ©2009
Solution to Dining Philosophers (Cont.)

void test (int i) {


if ( (state[(i + 4) % 5] != EATING) &&
(state[i] == HUNGRY) &&
(state[(i + 1) % 5] != EATING) ) {
state[i] = EATING ;
self[i].signal () ;
}
}

initialization_code() {
for (int i = 0; i < 5; i++)
state[i] = THINKING;
}
}

Operating System Concepts – 8th Edition 6.44 Silberschatz, Galvin and Gagne ©2009
Solution to Dining Philosophers (Cont.)

 Each philosopher i invokes the operations pickup() and putdown() in


the following sequence:

DiningPhilosophers.pickup (i);

EAT

DiningPhilosophers.putdown (i);

 No deadlock, but starvation is possible

Operating System Concepts – 8th Edition 6.45 Silberschatz, Galvin and Gagne ©2009
Resuming Processes within a Monitor
 If several processes queued on condition x, and x.signal() executed,
which should be resumed?

 FCFS frequently not adequate

 conditional-wait construct of the form x.wait(c)


 Where c is priority number
 Process with lowest number (highest priority) is scheduled next

Operating System Concepts – 8th Edition 6.46 Silberschatz, Galvin and Gagne ©2009
End of Chapter 6

Operating System Concepts – 8th Edition Silberschatz, Galvin and Gagne ©2009

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy