Professional Documents
Culture Documents
6.2
Objectives
To introduce the critical-section problem, whose solutions can be used to ensure the consistency of shared data
6.3
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.
6.4
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++; }
6.5
Consumer
while (true) { while (counter == 0) ; // do nothing nextConsumed = buffer[out]; out = (out + 1) % BUFFER_SIZE; counter--; /* consume the item in nextConsumed }
6.6
Race Condition
6.7
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 Especially challenging with preemptive kernels
6.8
Critical Section
6.9
6.10
Semaphore
Synchronization tool
Semaphore S integer variable Two standard operations modify S: wait() and signal()
Less complicated Can only be accessed via two indivisible (atomic) operations
S++;
}
6.11
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
Can implement a counting semaphore S as a binary semaphore Provides mutual exclusion Semaphore mutex; do { wait (mutex); // Critical Section signal (mutex); // remainder section } while (TRUE); // initialized to 1
6.12
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 crtical section
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
6.13
With each semaphore there is an associated waiting queue Each entry in a waiting queue has two data items:
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
6.14
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 Essentials 8th Edition
6.15 Silberschatz, Galvin and Gagne 2011
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
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 higherpriority process Solved via priority-inheritance protocol
6.16
6.17
Bounded-Buffer 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
6.18
The structure of the producer process do { // produce an item in nextp wait (empty); wait (mutex); // add the item to the buffer signal (mutex); signal (full); } while (TRUE);
6.19
The structure of the consumer process do { wait (full); wait (mutex); // remove an item from buffer to nextc signal (mutex); signal (empty); // consume the item in nextc } while (TRUE);
6.20
Readers-Writers Problem
Readers only read the data set; they do not perform any updates Writers can both read and write
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 Shared Data
Data set Semaphore mutex initialized to 1 Semaphore wrt initialized to 1 Integer readcount initialized to 0
6.21
6.22
The structure of a reader process do { wait (mutex) ; readcount ++ ; if (readcount == 1) wait (wrt) ; signal (mutex) // reading is performed
wait (mutex) ; readcount - - ; if (readcount == 0) signal (wrt) ; signal (mutex) ; } while (TRUE);
Operating System Concepts Essentials 8th Edition
6.23 Silberschatz, Galvin and Gagne 2011
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
6.24
Dining-Philosophers Problem
Philosophers spend their lives thinking and eating Dont interact with their neighbors, occasionally try to pick up 2 chopsticks (one at a time) to eat from bowl
Shared data
do {
wait ( chopstick[i] ); wait ( chopStick[ (i + 1) % 5] ); // eat signal ( chopstick[i] ); signal (chopstick[ (i + 1) % 5] ); // think } while (TRUE);
6.26
P1 and P2 each hold one disk drive and each needs another one
Example
P0
wait (A); wait (B);
Operating System Concepts Essentials 8th Edition
P1
wait(B) wait(A)
6.27 Silberschatz, Galvin and Gagne 2011
6.28
System Model
Resource types R1, R2, . . ., Rm
CPU cycles, memory space, I/O devices
request
use release
6.29
Deadlock Characterization
Deadlock can arise if four conditions hold simultaneously
Mutual exclusion: only one process at a time can use a resource Hold and wait: a process holding at least one resource is waiting to acquire additional resources held by other processes No preemption: a resource can be released only voluntarily by the process holding it, after that process has completed its task
Circular wait: there exists a set {P0, P1, , Pn} of waiting processes such that P0 is waiting for a resource that is held by P1, P1 is waiting for a resource that is held by
P2, , Pn1 is waiting for a resource that is held by Pn, and Pn is waiting for a resource that is held by P0.
6.30
Resource-Allocation Graph
A set of vertices V and a set of edges E
V is partitioned into two types:
P = {P1, P2, , Pn}, the set consisting of all the processes in the system R = {R1, R2, , Rm}, the set consisting of all resource types in the system
6.31
Pi requests instance of Rj
Pi
Rj
Pi is holding an instance of Rj
Operating System Concepts Essentials 8th Edition
6.32
Pi
Rj
Silberschatz, Galvin and Gagne 2011
6.33
6.34
6.35
Basic Facts
If graph contains no cycles no deadlock If graph contains a cycle
if only one instance per resource type, then deadlock if several instances per resource type, possibility of deadlock
6.36
6.37
Deadlock Prevention
Restrain the ways request can be made
Require process to request and be allocated all its resources before it begins execution, or allow process to request resources only when the process has none Low resource utilization; starvation possible
6.38
If a process that is holding some resources requests another resource that cannot be immediately allocated to it, then all resources currently being held are released Preempted resources are added to the list of resources for which the process is waiting Process will be restarted only when it can regain its old resources, as well as the new ones that it is requesting
types, and require that each process requests resources in an increasing order of enumeration
6.39
Deadlock Avoidance
Requires that the system has some additional a priori information available
process declare the maximum number of resources of each type that it may need
The deadlock-avoidance algorithm dynamically examines
the resource-allocation state to ensure that there can never be a circular-wait condition
Resource-allocation state is defined by the number of
available and allocated resources, and the maximum demands of the processes
Operating System Concepts Essentials 8th Edition
6.40 Silberschatz, Galvin and Gagne 2011
End of Chapter 6