当前位置:文档之家› 进程同步问题实例

进程同步问题实例


4
读者-作者问题
一个数据对象可以为多个并发进程所共享。其 中有的进程可能只需要读共享对象的内容,而 其他进程可能要更新共享对象(即读和写)。
将只对读感兴趣的进程称为读者 其他则称为作者
第一读者-作者问题
仅当无读者等待时,才允许写者执行
第二读者-作者问题
在读者与作者同时申请资源的时候,写者优先。
8
2 缓冲区问题(生产者-消费者问题)
三个进程P1、P2、P3 互斥使用一个包含N(N>0)个单 元的缓冲区。P1 每次用produce()生成一个正整数并 用put()送入缓冲区某一个空单元中;P2 每次用 getodd()从该缓冲区中取出一个奇数并用countodd() 统计奇数个数;P3 每次用geteven()从该缓冲区中取 出一个偶数并用counteven()统计偶数个数。请用信号 量机制实现这三个进程的同步与互斥活动,并说明所 定义的信号量的含义。要求用伪代码描述。
的吸烟。当吸烟者完成吸烟后唤醒供应者,供应者再放两样东西 (随机地)在桌面上,然后唤醒另一个吸烟者。 试为吸烟者和供应者用同步法解决问题。
14
4 吸烟者问题
供应者需要3个进程 X:提供tobacco和match Y:提供match和wrapper Z:提供wrapper和tobacco
3个吸烟者进程 A:只有tobacco B:只有match C:只有wrapper
9
缓冲区问题求解
(1) 缓冲区是一互斥资源,因此设互斥信号量mutex。 (2) 同步问题:P1、P2 因为奇数的放置与取用而同步,设同步信号量odd;P1、
P3 因为偶数的放置于取用而同步,设同步信号量even;P1、P2、P3 因为共享 缓冲区,设同步信号量empty。
semaphore mutex = 1,odd = 0,even = 0,empty = N;
P(Sa);
从plate中取苹果;
V(S); 吃苹mutex);
getodd();
V(mutex);V(empty);
countodd();
}
Process P3:
while(true){
P(even); P(mutex);
geteven();
V(mutex);V(empty);
counteven();
}
11
3 嗜睡理发师问题
signal(wrt); signal(mutex);
6
哲学家就餐问题
7
共享数据 semaphore chopstick[5];
哲学家i结构 do { wait(chopstick[i]); wait(chopstick[(I + 1) % 5]); … eat … signal(chopstick[i]); signal(chopstick[(I + 1) % 5]); … think … } while (1);
Barber进程: while(TRUE){
P(cutomers); //若无顾客,理发师睡眠 P(mutex); //进程互斥,要求顾客等候 waiting = waiting – 1;//等候顾客数少一个 V(barbers); //理发师去为一个顾客理发 V(mutex); //开放临界区 cut-hair( ); //正在理发(非临界区操作)
13
4 吸烟者问题
三个吸烟者在一间房间内,还有一个香烟供应者。 (1)为了制造并抽掉香烟,每个吸烟者需要三样东西:烟草、纸和火
柴。 (2)供应者有丰富的货物提供。 (3)三个吸烟者中,第一个有自己的烟草,第二个有自己的纸,第三
个有自己的火柴。 (4)供应者将两样东西放在桌子上,允许一个吸烟者进行对健康不利
则 一次只能有X,Y,Z中的一个执行(供应);X,Y,Z只能在 消耗完一个后才能供应下一个
15
4 吸烟者问题
Semaphore tobacco=0, match=0, wrapper=0, mutex=1;
Process X: P(mutex); V(tobacco); V(match);
Process Y: P(mutex); V(match); V(wrapper);
5
第一读者-作者问题
wait(wrt); … writing is performed … signal(wrt);
wait(mutex); readcount ++; if (readcount == 1)
wait(wrt); signal(mutex); … reading is performed … wait(mutex); readcount --; if (readcount == 0)
一个理发店里有一个理发师,一张理发椅子, 多张等候的椅子,当没有顾客的时候,理发师 就睡觉。当一个顾客来到店里时,如果理发师 在睡觉,则叫醒理发师;否则便坐着等;如果 等待的椅子都满了就离开。
12
3 嗜睡理发师问题
int waiting=0 ; //等候理发的顾客数 int chairs=5; //为顾客准备的椅子数 semaphore customers=0, barbers=0,mutex=1;
}
Customer进程: P(mutex); //进入临界区 if (waiting<chairs){
waiting = waiting+1; //等候顾客数加1 V(customers); //必要的话唤醒理发师 V(mutex); //开放临界区 P(barbers); //无理发师, 顾客坐着养神 get-haircut( ); //一个顾客坐下等候服务 } else V(mutex); //人满了,上自习去!
操作系统概念
进程同步问题实例
本章主要内容
经典同步问题 生产者-消费者问题:缓冲区问题 嗜睡理发师问题 吸烟者问题 吃水果问题
2
1 经典同步问题
有限缓冲问题 读者-作者问题 哲学家进餐问题
3
有限缓冲问题(生产者-消费者问题)
do { … produce an item in nextp … wait(empty); wait(mutex); … add nextp to buffer … signal(mutex); signal(full);
Process Z: P(mutex); V(wrapper); V(tobacco);
Process A: P(match); P(wrapper); Smoke; V(mutex);
Process B: P(wrapper); P(tobacco); Smoke; V(mutex);
Process C: P(tobacco); P(match); Smoke; V(mutex);
Process P1:
while(true){
number = produce();
P(empty);P(mutex);
put();
V(mutex);
If number % 2 == 0
V(even);
else
V(odd);
}
10
缓冲区问题求解
Process P2:
while(true){
Semaphor S=1, So=Sa=0;
Process father: Process mother: Process son:
Process daughter:
P(S);
把苹果放入plate;
V(So);
P(S);
把橘子放入plate;
V(Sa);
P(So);
从plate中取橘子;
V(S); 吃橘子;
} while (1);
do { wait(full); wait(mutex); … remove an item from buffer to nextc … signal(mutex); signal(empty); … consume the item in nextc …
} while (1);
16
5 吃水果问题
桌上有一空盘,允许存放一只水果。爸爸向盘中放苹 果,妈妈向盘中放桔子,儿子专等吃盘中的桔子,女 儿专等吃盘中的苹果。规定当盘空时一次只能放一只 水果供吃者取用,请用P、V原语实现爸爸、妈妈、儿 子、女儿三个并发进程的同步。
爸爸 儿子
plate
妈妈 女儿
17
5 吃水果问题
应设置三个信号量S、So、Sa,信号量S表示盘子是否为空,其初值 为1;信号量So表示盘中是否有桔子,其初值为0;信号量Sa表示盘 中是否有苹果,其初值为0。同步描述如下:
相关主题