Download 第七章

Document related concepts

Scheduling (computing) wikipedia , lookup

Transcript
Chapter 7: Process Synchronization
 Background
 The Critical-Section Problem
 Synchronization Hardware
 Semaphores
 Classical Problems of Synchronization
 Critical Regions
 Monitors
 Synchronization in Solaris 2 & Windows 2000
Operating System Concepts
7.1
Silberschatz, Galvin and Gagne 2002
Background
 Concurrent access to shared data may result in
data inconsistency.
 Maintaining data consistency requires
mechanisms to ensure the orderly execution of
cooperating processes.
 Shared-memory solution to bounded-butter
problem (Chapter 4) allows at most n – 1 items in
buffer at the same time. A solution, where all N
buffers are used is not simple.
 Suppose that we modify the producerconsumer code by adding a variable counter,
initialized to 0 and incremented each time a
new item is added to the buffer
Operating System Concepts
7.2
Silberschatz, Galvin and Gagne 2002
Bounded-Buffer
 Shared data
#define BUFFER_SIZE 10
typedef struct {
...
} item;
item buffer[BUFFER_SIZE];
int in = 0;
int out = 0;
int counter = 0;
Operating System Concepts
7.3
Silberschatz, Galvin and Gagne 2002
Bounded-Buffer
 Producer process
item nextProduced;
while (1) {
while (counter == BUFFER_SIZE)
; /* do nothing */
buffer[in] = nextProduced;
in = (in + 1) % BUFFER_SIZE;
counter++;
}
Operating System Concepts
7.4
Silberschatz, Galvin and Gagne 2002
Bounded-Buffer
 Consumer process
item nextConsumed;
while (1) {
while (counter == 0)
; /* do nothing */
nextConsumed = buffer[out];
out = (out + 1) % BUFFER_SIZE;
counter--;
}
Operating System Concepts
7.5
Silberschatz, Galvin and Gagne 2002
Bounded Buffer
 The statements
counter++;
counter--;
must be performed atomically.(原子地)
 Atomic operation means an operation that
completes in its entirety without interruption. (原
子操作)
Operating System Concepts
7.6
Silberschatz, Galvin and Gagne 2002
Bounded Buffer
 The statement “count++” may be implemented in
machine language as:
register1 = counter
register1 = register1 + 1
counter = register1
 The statement “count—” may be implemented as:
register2 = counter
register2 = register2 – 1
counter = register2
Operating System Concepts
7.7
Silberschatz, Galvin and Gagne 2002
Bounded Buffer
 If both the producer and consumer attempt to
update the buffer concurrently, the assembly
language statements may get interleaved.
 Interleaving depends upon how the producer
and consumer processes are scheduled.
Operating System Concepts
7.8
Silberschatz, Galvin and Gagne 2002
Bounded Buffer
 Assume counter is initially 5. One interleaving of
statements is:
producer: register1 = counter (register1 = 5)
producer: register1 = register1 + 1 (register1 = 6)
consumer: register2 = counter (register2 = 5)
consumer: register2 = register2 – 1 (register2 = 4)
producer: counter = register1 (counter = 6)
consumer: counter = register2 (counter = 4)
 The value of count may be either 4 or 6, where the
correct result should be 5.
Operating System Concepts
7.9
Silberschatz, Galvin and Gagne 2002
Another example
two processes p0,p1, share a variable:int
total(initialized as 0 ) ;
Both of them execute the following program
concurrently:
p0,p1:
{
int count;
for (count=1; count <=50; count++)
total = total + 1 ;
}
Question: what is the probable result of “total”?(upper limit
and lower limit)
Operating System Concepts
7.10
Silberschatz, Galvin and Gagne 2002
Race Condition
 Race condition: The situation where several
processes access – and manipulate shared
data concurrently. The final value of the shared
data depends upon how these processes
interleave.
 To prevent race conditions, concurrent
processes must be synchronized.
Operating System Concepts
7.11
Silberschatz, Galvin and Gagne 2002
The Critical-Section Problem
 n processes all competing to use some shared
data
 The shared data can be accessed only by one
process at a time(we call this kind of data as
“critical resource”)
 Each process has a code segment, called
critical section, in which the shared data is
accessed.
 Problem – ensure that when one process is
executing in its critical section, no other process
is allowed to execute in its critical section.
Operating System Concepts
7.12
Silberschatz, Galvin and Gagne 2002
Solution to Critical-Section Problem
Three requirements must be satisfied: (三个必须)
1. Mutual Exclusion. If process Pi is executing in its critical
section, then no other processes can be executing in their
critical sections.(每次最多只有一个进程在CS)
2. Progress. If no process is executing in its critical section and
there exist some processes that wish to enter their critical
section, then the selection of the processes that will enter the
critical section next cannot be postponed indefinitely.(没有进
程在CS,若有多个进程申请进入CS,应在有限时间内让其中之一
进入,而不应互相阻塞,以至于各进程都无法进入)
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 been admitted to enter its critical section.
No starvation(进程允许进入CS后,将在有限时间内离开CS并允许
其他进程进入)
Two assumptions(二个前提)
 Assume that each process executes at a nonzero speed
 No assumption concerning relative speed of the n processes.
Operating System Concepts
7.13
Silberschatz, Galvin and Gagne 2002
Methods to solve the CS Problem
1. Software solution. To solve the CS problem by the user
processes themselves. No need of operating system
support or special programming language.
2. Hardware support. To rely on special hardware support (
e.g. interrupt disabling, special machine instructions)
3. Operating System support. OS provides
services(usually system calls) to solve the CS problem.
Operating System Concepts
7.14
Silberschatz, Galvin and Gagne 2002
Software solution: Initial Attempts to
Solve Problem
 Only 2 processes, P0 and P1
 General structure of process Pi (other process Pj)
do {
entry section
critical section
exit section
remainder section
} while (1);
 Processes may share some common variables to
synchronize their actions.
 Entry section: code requesting for entering CS
 Exit section: code releasing resources
Operating System Concepts
7.15
Silberschatz, Galvin and Gagne 2002
Algorithm 1
 Shared variables:
int turn;
initially turn = 0
turn = i  Pi can enter its critical
section
 Process Pi
do {
while (turn != i) ;
critical section
turn = j;
reminder section
} while (1);
 Satisfies mutual exclusion, but not progress(必须交替进入
)
Operating System Concepts
7.16
Silberschatz, Galvin and Gagne 2002
Algorithm 2
 Shared variables
boolean flag[2];
initially flag [0] = flag [1] = false.
flag [i] = true  Pi ready to enter its
critical section
 Process Pi
do {
flag[i] := true;
while (flag[j]) ;
critical section
flag [i] = false;
remainder section
} while (1);
 Satisfies mutual exclusion, but not progress requirement.(
互相谦让)
Operating System Concepts
7.17
Silberschatz, Galvin and Gagne 2002
Algorithm 3(Peterson)
 Combined shared variables of algorithms 1 and 2.
 Process Pi
do {
flag [ i ]:= true;
turn = j;
while (flag [ j ] and turn = j) ;
critical section
flag [ i ] = false;
remainder section
} while (1);
 Meets all three requirements; solves the critical-section
problem for two processes.
Operating System Concepts
7.18
Silberschatz, Galvin and Gagne 2002
Proof of Algorithm 3
 Mutual exclusion
1. Pi and Pj can enter CS almost simultaneously only if
turn=i and turn=j (impossible)
2. If Pi entered CS in advance, Pj must be loop in while
 Progress
1. If only Pi wants to enter CS, Pj does not want to enter CS,
then flag[ j ] = false. Pi will enter CS immediately.
2. If Pi and Pj all want to enter CS, they cannot both be
blocked in loop(turn = i or turn = j)
 Bounded-waiting
If Pj exits CS, it will reset flag[ j ]=false. If Pj has time to set
flag[ j ]=true, it must also set turn = j, allowing Pi to enter CS.
Operating System Concepts
7.19
Silberschatz, Galvin and Gagne 2002
Bakery’s Algorithm
Critical section for n processes
 Before entering its critical section, process
receives a number. Holder of the smallest
number enters the critical section.
 If processes Pi and Pj receive the same number,
if i < j, then Pi is served first; else Pj is served
first.
 The numbering scheme always generates
numbers in increasing order of enumeration;
i.e., 1,2,3,3,3,3,4,5...
Operating System Concepts
7.20
Silberschatz, Galvin and Gagne 2002
Bakery’s Algorithm (cont.)
 Notation : lexicographical order (ticket #,
process id #)
 (a,b) < (c,d) if a < c or if a = c and b < d
 max (a0,…, an-1) is a minimum number, k, such
that k  ai for i = 0,
…, n – 1
 Shared data
boolean choosing[n];
int number[n];
Data structures are initialized to false and 0
respectively
Operating System Concepts
7.21
Silberschatz, Galvin and Gagne 2002
Bakery’s Algorithm (cont.)
do {
choosing[i] = true;
number[i] = max(number[0], number[1], …, number [n – 1])+1;
choosing[i] = false;
for (j = 0; j < n; j++) {
while (choosing[j]) ;
while (number[j] != 0 && (number[j],j) < (number[i],i)) ;
}
critical section
number[i] = 0;
remainder section
} while (1);
Operating System Concepts
7.22
Silberschatz, Galvin and Gagne 2002
Synchronization Hardware
 Disabling interrupt: sometimes impossible(e.g. clock
interrupt, SMP)
 Test-and-set instruction: Test and modify the content of a
word atomically
.
boolean TestAndSet(boolean &target) {
boolean rv = target; // test first
tqrget = true;
// set next
return rv;
}
Operating System Concepts
7.23
Silberschatz, Galvin and Gagne 2002
Mutual Exclusion with Test-and-Set
 Shared data:
boolean lock = false;
 Process Pi
do {
while (TestAndSet(lock)) ;
critical section
lock = false;
remainder section
}
Operating System Concepts
7.24
Silberschatz, Galvin and Gagne 2002
Synchronization Hardware
 Swap instruction: Atomically swap two
variables.
void Swap(boolean &a, boolean &b) {
boolean temp = a;
a = b;
b = temp;
}
Operating System Concepts
7.25
Silberschatz, Galvin and Gagne 2002
Mutual Exclusion with Swap
-- No bounded-waiting
 Shared data (initialized to false):
boolean lock;
 Process Pi
do {
key = true;
while (key == true) //获得lock值为false的进程能进入
Swap(lock,key);
critical section
lock = false;
remainder section
}
Operating System Concepts
7.26
Silberschatz, Galvin and Gagne 2002
Hardware solution features




No limit on processes and CPUs
Simple and easy to verify
Busy-waiting is required
May cause starvation(do not satisfy bounded-waiting):
selection of ready process to run is arbitrarily
Operating System Concepts
7.27
Silberschatz, Galvin and Gagne 2002
Mutual Exclusion with TestAndSet
-- Bounded-waiting
 Shared data (initialized to false):
boolean lock;
boolean waiting[n];
 Process Pi
Operating System Concepts
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
Silberschatz, Galvin and
7.28
}
Gagne 2002
Operating system support: Semaphores
 Synchronization tool that does not require busy waiting.
 Semaphore S – integer variable
 can only be accessed via two indivisible (atomic)
operations
wait (S): //(也叫P操作)
while S 0 do no-op;
S--;
signal (S): //(也叫V操作)
S++;
Operating System Concepts
7.29
Silberschatz, Galvin and Gagne 2002
Critical Section of n Processes
 Shared data:
semaphore mutex; //initially mutex = 1
 Process Pi:
do {
wait(mutex);
critical section
signal(mutex);
remainder section
} while (1);
Operating System Concepts
7.30
Silberschatz, Galvin and Gagne 2002
Semaphore Implementation
 Define a semaphore as a record
typedef struct {
int value;
struct process *queue;
} semaphore;
 Assume two simple operations:
 block suspends the process that invokes it.
 wakeup(P) resumes the execution of a blocked
process P.
Operating System Concepts
7.31
Silberschatz, Galvin and Gagne 2002
Implementation
 Semaphore operations now defined as
wait(S):
S.value- -;
if (S.value < 0) {
add this process to S.queue;
block;
}
signal(S):
S.value++;
if (S.value <= 0) {
remove a process P from
S.queue;
wakeup(P);
}
Operating System Concepts
7.32
Silberschatz, Galvin and Gagne 2002
Semaphore as a General Synchronization Tool
 Execute B in Pj only after A executed in Pi
 Use semaphore flag initialized to 0
 Code:
Pi

A
signal(flag)
Operating System Concepts
Pj

wait(flag)
B
7.33
Silberschatz, Galvin and Gagne 2002
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.
Operating System Concepts
7.34
Silberschatz, Galvin and Gagne 2002
Two Types of Semaphores
 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
using binary semaphores.
Operating System Concepts
7.35
Silberschatz, Galvin and Gagne 2002
Binary semaphores(Mutex)
waitB(S):
if (S.value = 1) {
S.value := 0;
} else {
block this process
place this process in S.queue
}
signalB(S):
if (S.queue is empty) {
S.value := 1;
} else {
remove a process P from S.queue
place this process P on ready list
}
Operating System Concepts
7.36
Silberschatz, Galvin and Gagne 2002
Implementing S using Binary Semaphores
 Data structures:
binary-semaphore S1, S2;
int C:
 Initialization:
S1 = 1
S2 = 0
C = initial value of semaphore S
Operating System Concepts
7.37
Silberschatz, Galvin and Gagne 2002
Implementing S
 wait operation
wait(S1);
C--;
if (C < 0) {
signal(S1);
wait(S2);
}
signal(S1);
 signal operation
wait(S1);
C ++;
if (C <= 0)
signal(S2);
else
signal(S1);
Operating System Concepts
7.38
Silberschatz, Galvin and Gagne 2002
Classical Problems of Synchronization
 A semaphore represents a shared data, its
initialized value is the number of processes that
can access the shared data simultaneously(一
个信号量代表一个共享资源,其初值表示可以同
时访问该共享资源的进程数)
 Bounded-Buffer Problem
 Readers and Writers Problem
 Dining-Philosophers Problem
Operating System Concepts
7.39
Silberschatz, Galvin and Gagne 2002
Bounded-Buffer Problem
 Shared data
semaphore full, empty, mutex;
Initially:
full = 0, empty = n, mutex = 1
Operating System Concepts
7.40
Silberschatz, Galvin and Gagne 2002
Bounded-Buffer Problem Producer
Process
do {
…
produce an item in nextp
…
wait(empty);
wait(mutex);
…
add nextp to buffer
…
signal(mutex);
signal(full);
} while (1);
Operating System Concepts
do {
wait(full)
wait(mutex);
…
remove an item from buffer to nextc
…
signal(mutex);
signal(empty);
…
consume the item in nextc
…
} while (1);
7.41
Silberschatz, Galvin and Gagne 2002
Bounded-Buffer Problem Consumer
Process
do {
wait(full)
wait(mutex);
…
remove an item from buffer to nextc
…
signal(mutex);
signal(empty);
…
consume the item in nextc
…
} while (1);
Operating System Concepts
7.42
Silberschatz, Galvin and Gagne 2002
Readers-Writers Problem
 Problem description: 读者只能读取共享数据,写者可以读
写共享数据。写者只有一人,读者可以有多人。读者和写
者不能共存
 Shared data
semaphore mutex
semaphore wrt;
//互斥访问readcount
//读者和写者不能共存
Initially
mutex = 1, wrt = 1, readcount = 0 //读者人数
Operating System Concepts
7.43
Silberschatz, Galvin and Gagne 2002
Readers-Writers Problem Writer Process
wait(wrt);
//申请进入
…
writing is performed
…
signal(wrt);
//离开
Operating System Concepts
7.44
Silberschatz, Galvin and Gagne 2002
Reader Process
writer: wait(wrt);
//申请进入
…
writing is performed
…
signal(wrt);
//离开
reader:wait(mutex);
//申请访问readcount
readcount++;
if (readcount == 1) //如果是第一个读者,禁止写者进入
wait(wrt);
signal(mutex); //释放访问readcount的锁
…
reading is performed
…
wait(mutex);
//申请访问readcount
readcount--;
if (readcount == 0) //如果没有读者了,应该允许写者进入
signal(wrt);
signal(mutex): //释放访问readcount的锁
Operating System Concepts
7.45
Silberschatz, Galvin and Gagne 2002
Dining-Philosophers Problem
 Shared data
semaphore chopstick[5]:=1, count := 4
Operating System Concepts
7.46
Silberschatz, Galvin and Gagne 2002
Dining-Philosophers Problem
 Philosopher i:
do {
wait(count);
wait(chopstick[i])
//want to pick up left
chopstick
wait(chopstick[(i+1) % 5]) //the right one
…
eat
…
signal(chopstick[i]);
//release left
signal(chopstick[(i+1) % 5]);//release right
signal(count);
…
think
…
} while (1);
Operating System Concepts
7.47
Silberschatz, Galvin and Gagne 2002
例题
有n个进程(P1,P2,…,Pn)向容量为M的缓冲区写数据,每个进程一次写1
个数据,当缓冲区写满时,另一个读进程Pr一次将M个数据全部读完,如此反复。
请用信号量解决这些进程的同步互斥问题。
答:本题中需要定义下述变量和信号量:
data_type buffer[M]; /* data_type对应于所需要的数据类型,如int、float等 */
int in=0; /* 用来指示下一个可存放数据的缓冲区 */
semaphore empty=M; /* 对应空闲的缓冲区 */
semaphore full=0; /* 对应缓冲区中的数据 */
semaphore mutex=1; /* 用来实现Pi进程对变量in的互斥访问 */
进程Pi可描述为:
Pi(){
while(1){
P(empty);
P(mutex);
向缓冲区buffer[in]中写数据;
in=(in+1)%M; V(mutex);
V(full); } }
进程Pr可描述为:
Pr(){
int i;
while(1){
for(i=0;i<M;i++) P(full);
取出缓冲buffer[0]到buffer[M-1]中的数据;
for(i=0;i<M;i++) V(empty); } }
Operating System Concepts
7.48
Silberschatz, Galvin and Gagne 2002
思考题
 有一个仓库存放两种零件A和B,最大库容量各为m
个。有一车间不断地取A和B进行装配,每次各取一
个。有两种供应商分别不断地供应A和B。为保证齐
套和合理库存,当某种零件的数量比另一种的数量超
过n(n<m)个时,暂停对数量大的零件进货,集中补
充数量少的零件。试用信号量正确地实现之。
Operating System Concepts
7.49
Silberschatz, Galvin and Gagne 2002
Unix Semaphores
 Are a generalization of the counting semaphores (more




operations are permitted).
A semaphore includes:
 the current value S of the semaphore(non-negative
integer)
 number of processes waiting for S to increase
 number of processes waiting for S to be 0
We have queues of processes that are blocked on a
semaphore
The system call semget creates an array of semaphores
The system call semop performs a list of operations: one
on each semaphore (atomically)
Operating System Concepts
7.50
Silberschatz, Galvin and Gagne 2002
Unix Semaphores
 Each operation to be done is specified by a value sem_op.
 Let S be the semaphore value
 if sem_op > 0:
S is incremented and process awaiting for S to
increase are awaken
 if sem_op = 0:
If S=0: do nothing
if S!=0, block the current process on the event that
S=0
Operating System Concepts
7.51
Silberschatz, Galvin and Gagne 2002
Unix Semaphores
 if sem_op < 0 and |sem_op| <= S:
set S:= S + sem_op (ie: S decreases)
then if S=0: awake processes waiting for S=0
 if sem_op < 0 and |sem_op| > S:
current process is blocked on the event that S
increases
 Hence: flexibility in usage (many operations are permitted)
Operating System Concepts
7.52
Silberschatz, Galvin and Gagne 2002
Critical Regions(临界域)
 High-level synchronization construct
 A shared variable v of type T, is declared as:
v: shared T
 Variable v accessed only inside statement
region v when B do S
where B is a boolean expression.
 While statement S is being executed, no other
process can access variable v.
Operating System Concepts
7.53
Silberschatz, Galvin and Gagne 2002
Critical Regions
 Regions referring to the same shared variable
exclude each other in time.
 When a process tries to execute the region
statement, the Boolean expression B is
evaluated. If B is true, statement S is executed.
If it is false, the process is delayed until B
becomes true and no other process is in the
region associated with v.
Operating System Concepts
7.54
Silberschatz, Galvin and Gagne 2002
Example – Bounded Buffer
 Shared data:
struct buffer {
int pool[n];
int count, in, out;
}
Operating System Concepts
7.55
Silberschatz, Galvin and Gagne 2002
Bounded Buffer Producer Process
 Producer process inserts nextp into the shared
buffer
region buffer when( count < n) {
pool[in] = nextp;
in:= (in+1) % n;
count++;
}
Operating System Concepts
7.56
Silberschatz, Galvin and Gagne 2002
Bounded Buffer Consumer Process
 Consumer process removes an item from the
shared buffer and puts it in nextc
region buffer when (count > 0) {
nextc = pool[out];
out = (out+1) % n;
count--;
}
Operating System Concepts
7.57
Silberschatz, Galvin and Gagne 2002
Implementation region x when B do S
 Associate with the shared variable x, the following
variables:
semaphore mutex, first-delay, second-delay;
int first-count, second-count;
 Mutually exclusive access to the critical section is
provided by mutex.
 If a process cannot enter the critical section because the
Boolean expression B is false, it initially waits on the
first-delay semaphore; moved to the second-delay
semaphore before it is allowed to reevaluate B.
Operating System Concepts
7.58
Silberschatz, Galvin and Gagne 2002
Implementation
 Keep track of the number of processes waiting
on first-delay and second-delay, with firstcount and second-count respectively.
 The algorithm assumes a FIFO ordering in the
queuing of processes for a semaphore.
 For an arbitrary queuing discipline, a more
complicated implementation is required.
Operating System Concepts
7.59
Silberschatz, Galvin and Gagne 2002
Monitors(管程)
 High-level synchronization construct that allows the safe sharing
of an abstract data type among concurrent processes.
monitor monitor-name
{
shared variable declarations
procedure body P1 (…) {
...
}
procedure body P2 (…) {
...
}
procedure body Pn (…) {
...
}
{
initialization code
}
}
Operating System Concepts
7.60
Silberschatz, Galvin and Gagne 2002
Monitors
 Only one process at a time can be active within the monitor
 To allow a process to wait within the monitor, a condition
variable must be declared, as
condition x, y;
 Condition variable can only be used with the operations wait
and signal.
 The operation
x.wait();
means that the process invoking this operation is suspended
until another process invokes
x.signal();
 The x.signal operation resumes exactly one suspended
process. If no process is suspended, then the signal
operation has no effect.
Operating System Concepts
7.61
Silberschatz, Galvin and Gagne 2002
Monitor
 Awaiting processes are either





in the entrance queue or in a
condition queue
A process puts itself into
condition queue cn by issuing
cwait(cn)
csignal(cn) brings into the
monitor 1 process in condition
cn queue
Hence csignal(cn) blocks the
calling process and puts it in
the urgent queue (unless
csignal is the last operation of
the monitor procedure)
cwait(cn) equals to cn.wait()
csignal(cn)equals to cn.signal()
Operating System Concepts
7.62
Silberschatz, Galvin and Gagne 2002
Schematic View of a Monitor
Operating System Concepts
7.63
Silberschatz, Galvin and Gagne 2002
Monitor With Condition Variables
Operating System Concepts
7.64
Silberschatz, Galvin and Gagne 2002
Dining Philosophers Example
monitor dp
{
enum {thinking, hungry, eating} state[5];
condition self[5];
void pickup(int i)
void putdown(int i)
void test(int i)
void init() {
for (int i = 0; i < 5; i++)
state[i] = thinking;
}
}
Operating System Concepts
7.65
Silberschatz, Galvin and Gagne 2002
void pickup(int i) {
state[i] = hungry;
test[i];
Philosopher i:
…
if (state[i] != eating)
dp.pickup(i);
self[i].wait();
…
}
eat
void putdown(int i) {
…
state[i] = thinking;
dp.putdown(i);
// test left and right neighbors
test((i+4) % 5);
test((i+1) % 5);
No deadlock
}
May cause starvation
void test(int i) {
if ( (state[(i + 4) % 5] != eating) &&
(state[i] == hungry) &&
(state[(i + 1) % 5] != eating)) {
state[i] = eating;
self[i].signal();
}
}
Operating System Concepts
7.66
Silberschatz, Galvin and Gagne 2002
Monitor Implementation Using Semaphores
 Variables
semaphore mutex; // (initially = 1)
semaphore next; // (initially = 0)
int next-count = 0; //让位的进程数
 Each external procedure F will be replaced by
wait(mutex); //进入monitor
…
body of F;
…
if (next-count > 0) //离开前看有没有让
位进程,如有,激活它们中的一个,不让其他进程进入,
否则,释放mutex,让其他一个进程进入
signal(next)
else
signal(mutex);
 Mutual exclusion within a monitor is ensured.
Operating System Concepts
7.67
Silberschatz, Galvin and Gagne 2002
Monitor Implementation
 For each condition variable x, we have:
semaphore x-sem; // (initially = 0)
int x-count = 0;
//等待条件x的进程数
 The operation x.wait can be implemented as:
x-count++;
if (next-count > 0) //在进入等待队列前,看
有没有让位进程,如有,激活其中的一个,不让其他进程
进入,否则,释放mutex,让其他一个进程进入
signal(next);
else
signal(mutex);
wait(x-sem);
x-count--;
Operating System Concepts
7.68
Silberschatz, Galvin and Gagne 2002
Monitor Implementation
 The operation x.signal can be implemented as:
if (x-count > 0) {
next-count++; //自己变为让位进程
signal(x-sem); //释放等待队列中的一个进程
wait(next);
//自己进入让位进程队列
next-count--; //从让位进程队列出来,继续
执行
}
//如果没有等待该条件的进程,什么也不
做
Operating System Concepts
7.69
Silberschatz, Galvin and Gagne 2002
Monitor Implementation
 Conditional-wait construct: x.wait(c);
 c – integer expression evaluated when the wait operation
is executed.
 value of c (a priority number) stored with the name of the
process that is suspended.
 when x.signal is executed, process with smallest
associated priority number is resumed next.
 Check two conditions to establish correctness of system:
 User processes must always make their calls on the
monitor in a correct sequence.
 Must ensure that an uncooperative process does not
ignore the mutual-exclusion gateway provided by the
monitor, and try to access the shared resource directly,
without using the access protocols.
Operating System Concepts
7.70
Silberschatz, Galvin and Gagne 2002
Solaris 2 Synchronization
 Implements a variety of locks to support
multitasking, multithreading (including real-time
threads), and multiprocessing.
 Uses adaptive mutexes for efficiency when
protecting data from short code segments.
 Uses condition variables and readers-writers locks
when longer sections of code need access to data.
 Uses turnstiles(十字转门) to order the list of
threads waiting to acquire either an adaptive mutex
or reader-writer lock.
Operating System Concepts
7.71
Silberschatz, Galvin and Gagne 2002
Windows 2000 Synchronization
 Uses interrupt masks to protect access to global
resources on uniprocessor systems.
 Uses spinlocks(旋转锁) on multiprocessor
systems.
 Also provides dispatcher objects which may act
as mutexes and semaphores.
 Dispatcher objects may also provide events. An
event acts much like a condition variable.
Operating System Concepts
7.72
Silberschatz, Galvin and Gagne 2002
Spin lock
 Spin lock(旋转锁) on multiprocessor systems.
× 利用busy waiting 而非blocking来阻止进程前进;
× CPU不会去做其他事情,虽然浪费了部分CPU时间,但
省去了进程切换;
× 适合短代码的加锁
wait(S):
S--;
while S<0 do{};
signal(S):
S++;

与spin lock相对应的就是suspend lock(挂起锁),即一般
的锁,会挂起(阻塞)进程的执行
Operating System Concepts
7.73
Silberschatz, Galvin and Gagne 2002
Exercises
 7.3
if Pi in CS, and Pk has chosen number[k]
then (number[I],I) < (number[k],k)
(1) Pk选择number时,Pi已经在CS,则number[k]>number[I]
(2) Pk选择number时,Pi未进入CS
A)Pi正在执行for循环,则number[I]<number[k]
B)Pi未执行for循环,则(number[k],k)>(number[I],I),否则
Pi无法进入
Operating System Concepts
7.74
Silberschatz, Galvin and Gagne 2002
7.4Dekker算法
while(1) {
flag[ i ] = true;
while (flag[j]) {
if (turn==j) {
flag[ i ] = false;
while ( turn == j );
flag[ i ] = true;
}
Exercises
1.互斥(mutual exclusion)
A) Pi和Pj不可能同时进入CS:
turn==j 和turn==I不会同时满足
B)一个进程(如Pi)先进入CS,则flag[ i ]为
true,则Pj无法进入
2.前进(progress)
A)Pi申请进入,Pj不想进入,则flag[ i
]==false,Pi顺利进入
B)Pi和Pj都想进入,则turn==j时Pj进入,
turn==i时Pi进入
}
3.有限等待(bounded waiting)
CS
Pi离开CS后,置turn=j,flag[ i ]=false,这
时Pj可以进入,如果Pj没有进入,Pi又执行
了falg[ i ]=true,则由于turn==j,所以Pi无
法进入,而Pj可以进入
turn = j;
flag[ i ] = false;
RS
}
Operating System Concepts
7.75
Silberschatz, Galvin and Gagne 2002
Exercises
1.互斥(mutual exclusion)
7.5Eisenberg and McGuire’s algorithm
A) 两个进程Px和Py不可能同时进入CS:
While(1) {
while(1) {
turn==x 和turn==y不会同时满足,故Px和Py
的两个if 条件不会都满足
flag[i] = want_in;
j = turn;
while (j !=i) {
if (flag[j]!=idle) j = turn
B)一个进程(如Px)先进入CS,则turn==x,
flag[turn]==in_cs,则其他进程无法进入
2.前进(progress)
else j = (j+1)%n;
}
flag[i] =in_cs; j = 0;
while ((j<n)&&(j ==i || flag[j]!=in_cs)
A)Px申请进入,其他进程不想进入,则其他进
程flag均为idle,则Px的j>=n成立,if条件成立,
跳出while,进入CS
j ++ ;
B)若干进程想进入,如Pturn也想进入,则
if ((j>=n)&&(turn==i||flag[turn]==idle)) Pturn优先进入;否则,编号在turn后的最小号
break;
的想进入的进程进入CS
}
turn = i ;
3.有限等待(bounded waiting)
CS
j = (turn+1)%n;
while(flag[j]==idle) j=(j+1)%n;
turn=j; flag[i]=idle;
} Operating System Concepts
RS
Pi离开CS时,置turn为想进入的进程中大于
turn的最小欲进入之进程号,该进程就进入。
进程Pk不会饿死,最多等待(k-turn)个进程的
CS执行
Silberschatz, Galvin and Gagne 2002
7.76
Exercises
7.9抽烟问题
Semaphore smoker[3];
Semaphore material[3];
Semaphore agent;
Int turn;
//初始0,三个抽烟者
//初始0,三种原料
//初始1,供应商
//初始0,轮到谁
Agent:
While(1){
wait(agent);
signal(smoker[turn]);
signal(material[(turn+1)%3]);
signal(material[(turn+2)%3]);
turn= (turn+1)%3;
}
Smoker-i:
While(1){
wait(smoker[i]);
wait(material[(i+1)%3]);
wait(material[(i+2)%3]);
signal(agent);
}
Operating System Concepts
7.77
Silberschatz, Galvin and Gagne 2002
7.11
Exercises
Monitor bounded_buffer
{
item pool[n];
int count, in, out;
Producer process:
While(1) {
produce an item;
bounded_buffer.put_item();
}
condition full, empty;
void get_item()
{
if (count==0) full.wait();
get_from_buffer();
count--;
empty.signal();
}
void put_item()
{
if (count==n) empty.wait();
put_to_buffer();
count++;
full.signal();
}
void init() { count=in=out=0;}
Consumer process:
While (1) {
bounded_buffer.get_item();
consume the item;
}
}
Operating System Concepts
7.78
Silberschatz, Galvin and Gagne 2002
Exercises
7.8 理发问题
Semaphore max;
//初始n+1,表示理发店可以容纳总人数
Semaphore chair;
//初始n,空闲的椅子
Semaphore barber; //初始1,表示理发椅空闲
Semaphore finished; //初始0,表示一次理发结束
Semaphore ready;
//初始0,表示客人准备就绪
Customer:
While(1){
wait(max); wait(chair);
wait(barber); signal(chair); signal(ready);
… barbered …
wait(finished); signal(max);
}
Barber:
While(1){
wait(ready);
… barbering…
signal(finished);
signal(barber);
}
Operating System Concepts
7.79
Silberschatz, Galvin and Gagne 2002
Lab
实验1(a):进程间通讯
要求:
1.写一个程序,通过fork创建一个子进程。父进程与子进程间通过共享存储器(
shared memory)进行通讯:
2.父进程读取一个指定的文本文件,将文件中的每一行读入到共享存储器中,然后等
待子进程结束。
3.子进程判断由父进程读入的存放在共享存储器中的各行是否是回文(指顺读和倒读
都一样的字串,忽略空格),并将各行内容及判断结果(yes or no)输出到屏幕上。
提示:
a.父进程在创建子进程前通过系统调用shmget先向内核申请创建一个共享存储段,申
请时给它一个key值(整数);
b.子进程利用与父进程相同的key值去申请使用该共享存储段;
请通过Linux的man工具查询shmget, shmat,shmdt的用法。
Key_t key; int shmid;
Key = 5678;
申请创建:shmid = shmget(key,100,IPC_CREAT|0666);
申请使用:semid = shmget(key,100,0666);
Operating System Concepts
7.80
Silberschatz, Galvin and Gagne 2002
Lab
实验1(b):进程间通讯
要求:
1.在实验1(a)的基础上,实现生产者/消费者问题,要求不是父子进程而是两个独立
的进程进行通讯(两个独立的进程单独运行);
2.将共享存储器作为一个环形缓冲区来管理,生产者进程往里面放消息(一个消息
是一行字符串),消费者进程一次从里面读取一个消息,再如1(a)一样判断其是否
为一回文,并输出;
3. 因为两进程可能同时访问该共享存储段,因而需要通过信号量进行同步。
注:信号量的使用:两个进程通过相同的key值向OS申请,一个进程(生产者)申
请创建,另一个进程(消费者)申请使用。方法与共享存储器的使用类似。
请通过Linux的man工具查询semget, semop的用法。
Key_t key; int semid;
Key = 5678;
申请创建:semid = semget(key,1,IPC_CREAT|0666);
申请使用:semid = semget(key,1,0666);
Operating System Concepts
7.81
Silberschatz, Galvin and Gagne 2002