同步与互斥实例
提水入缸供老和尚饮用。水缸可以容纳10桶水,
水取自同一井水。水井狭窄,每次只能容一个
桶取水。水桶总数为 3 个。每次入、出水缸仅
一桶,且不可同时进行。试给出有关取水、入 水的算法描述。
process 小和尚: begin repeat P(empty); P(count); P(mutex1); 从井中取水;
V(mutex1);
P(mutex2); 送水入水缸;
V(mutex2);
V(count); V(full);
until false;
end
V(count);
until false;
习题
1.司机和售票员问题 问题描述: 在公共汽车上,司机和售票员的活动分别是: 司机的活动: 启动车辆 正常运行 到站停车 售票员的活动: 关车门 售票 开车门 在汽车不断的到站,停车,行驶过程中,这两个活动有 什么同步关系?用信号量和P,V操作实现.
Var S, S1, S2: semaphore; process (E-W)i: begin P(S1);
rc1,rc2: integer;
S, S1, S2:=1; rc1,rc2:=0;
process (W-E)j: begin
P(S2);
rc2:=rc2+1; if rc2=1 then P(S);
同步与互斥的解题思路
①分清哪些是互斥问题(互斥访问临界资源的),哪些是同步问 题(具有前后执行顺序要求的)。 ②对互斥问题要设置互斥信号量,不管有互斥关系的进程有几个 或几类,通常只设置一个互斥信号量,且初值为1,代表一次只允 许一个进程对临界资源访问。 ③对同步问题要设置同步信号量,通常同步信号量的个数与参与 同步的进程种类有关,即同步关系涉及几类进程,就有几个同步 信号量。同步信号量表示该进程是否可以开始或该进程是否已经 结束。 ④在每个进程中用于实现互斥的PV操作必须成对出现;用于实现 同步的PV操作也必须成对出现,但可以分别出现在不同的进程中; 在某个进程中如果同时存在互斥与同步的P操作,则其顺序不能颠 倒,必须先执行对同步信号量的P操作,再执行对互斥信号量的P 操作,00个人同时 购物,入口处备有篮子,每个购物者可持一个 篮子入内购物。出口处结账,并归还篮子(出、 入口仅容纳一人通过)。请用P、V操作完成 购物同步算法。
Var S, mutex1, mutex2: semaphore;
S:=100; mutex1:=1; mutex2:=1 process Pi:
rc1:=rc1+1;
if rc1=1 then P(S); V(S1);
V(S2);
过桥; P(S2);
过桥;
P(S1); rc1:=rc1-1; if rc1=0 then V(S); V(S1); end
rc2:=rc2-1;
if rc2=0 then V(S);
V(S2);
end
(1) A、B、C三个进程之间存在互斥的制约关系。因 为打印机属于临界资源,必须一个进程使用完之后另 一个进程才能使用。 (2)mutex:用于互斥的信号量,初值为1。 各进程的代码如下 : 进程A 进程B 进程C ... … ... ... … ... P(mutex) P(mutex) P(mutex) 申请打印机 申请打印机 申请打印机 使用打印机 使用打印机 使用打印机 V(mutex) V(mutex) V(mutex)
2.实例
设某台机挂有两个I/O通道:分别挂一 台输入机和一台打印机。卡片机上有 一叠数据卡片,现在要把这些数据逐 一输入到缓冲区 B1 ,然后再复制到缓 冲区B2,并在打印机上打印出来。 问:系统可设哪些进程来完成这个任 务?用P-V原语写这些进程的同步算法。
解:由上图可见,系统可设 3 个进程:输入进程、复制进 程、打印进程;分别用进程R、进程C、进程P来表示。 这些进程之间的相互制约关系: R受C的约束;C受R、P的约束;P受C的约束。 设4个信号量:S1=1,S2=0,S3=1,S4=0 同步算法如下:
互斥实例
有三个用户进程A、B和C,在运行过程中都要使 用系统中的一台打印机输出计算结果。 试说明A、B、C进程之间存在什么样的制约关 系? 为保证这三个进程能正确地打印出各自的结果, 请用信号量和P、V操作写出各自的有关申请、 使用打印机的代码。要求给出信号量的含义和 初值。
2.吸烟者问题 三个吸烟者在一间房间内,还有一个香烟 供应者。为了制造并抽掉香烟,每个吸烟者需 要三样东西:烟草、纸和火柴。供应者有丰富 的货物提供。三个吸烟者中,第一个有自己的 烟草,第二个有自己的纸,第三个有自己的火 柴。供应者将两样东西放在桌子上,允许一个 吸烟者进行对健康不利的吸烟。当吸烟者完成 吸烟后唤醒供应者,供应者再放两样东西(随 机地)在桌面上,然后唤醒另一个吸烟者。试 为吸烟者和供应者采用信号量机制解决问题。
3.理发师问题
理发店里有一位理发师、一把理发椅和 n 把供
等候理发的顾客坐的椅子
如果没有顾客,理发师便在理发椅上睡觉
一个顾客到来时,它必须叫醒理发师
如果理发师正在理发时又有顾客来到,则如果
有空椅子可坐,就坐下来等待,否则就离开
记 录 型 信 号 量 解 决 理 发 师 问 题
var waiting : integer; /*等候理发的顾客数*/ CHAIRS:integer; /*为顾客准备的椅子数*/ customers, barbers,mutex : semaphore; customers := 0; barbers := 0; waiting := 0; mutex := 1; Process barber; begin while(TRUE); /*理完一人,还有顾客吗?*/ P(cutomers); /*若无顾客,理发师睡眠*/ P(mutex); /*进程互斥*/ waiting := waiting – 1; /*等候顾客数少一个*/ V(barbers); /*理发师去为一个顾客理发*/ V(mutex); /*开放临界区*/ cut-hair( ); /*正在理发*/ end; process customer begin P(mutex); /*进程互斥*/ if waiting<CHAIRS begin /*看看有没有空椅子*/ waiting := waiting+1; /* 等候顾客数加1*/ V(customers); /*必要的话唤醒理发师*/ V(mutex); /*开放临界区*/ P(barbers); /*无理发师, 顾客坐着养神*/ get-haircut( ); /*一个顾客坐下等理发*/ end V(mutex); /*人满了,走吧!*/ end;
拣棋子问题。生产围棋的工人不小心把相等数 量的黑棋子和白棋混装在一个箱子里,先要用 自动分拣系统把黑棋子和白棋子分开,该系统 由两个并发执行的进程组成,系统功能如下: (1)进程A专门拣黑子,进程B专门拣白子; (2)每个进程每次只拣一个子,当一个进程在 拣子时不允许另一进程去拣子; (3)当一个进程拣了一个子(黑或白)以后, 必让另一个进程拣一个子(黑或白) 。 请用P、V操作管理两个并发进程,使其能正 确实现上述功能。
同步与互斥的解题步骤
( 1 )确定进程。包括进程的数量、进程的工 作内容,可以用流程图描述。 ( 2 )确定同步互斥关系。根据是否使用的是 临界资源,还是处理的前后关系,确定同步与 互斥,然后确定信号量的个数、含义,以及对 信号量的P、V操作。 (3)用类C语言描述同步或互斥算法。
Var mutex: semaphore;
process (E-W)i:
process (W-E)j: begin P(mutex); 过桥; V(mutex); end
begin
P(mutex); 过桥; V(mutex); end
.独木桥问题。某条河上只有一座独木桥,以 便行人过河。现在河的两边都有人要过桥,按 照下面的规则过桥。为了保证过桥安全,请用 P、V操作分别实现正确的管理。 过桥的规则是:同一方向的可连续过桥, 某方向有人过桥时另一方向的人要等待。
进程同步与互斥实例
同步实例
1.经典的生产者─消费者问题
生产者 消费者
1.经典的生产者─消费者问题
var B : integer; empty:semaphore; /* 可以使用的空缓冲区数 */ full:semaphore; /* 缓冲区内可以使用的产品数 */ empty := 1; /* 缓冲区内允许放入一件产品 */ full := 0; /* 缓冲区内没有产品 */ cobegin /*多个子进程并发执行函数*/ Process producer process consumer begin begin L1: L2: Produce a product; P(full); P(empty); 取产品 直到取为空 放产品; 直到为满; V(empty); V(full); Consume a product; Goto L1; Goto L2; end; end; coend
Var S1, S2: semaphore:=1,0; process A:
process B:
begin
repeat P(S1);
begin
repeat P(S2); 拣白子; V(S1); until false end
拣黑子;
V(S2); until false; end
某寺庙有小、老和尚若干,有一水缸,由小和尚
Var mutex1, mutex2, empty, full, count: semaphore; mutex1:=1; mutex2:=1; empty:=10; full:=0; count:=3;