第二章进程管理
V(mutex); V(fulla); V(availb); }
//通知工人3,箱子中多了个车架
}
process worker2( ) {
while (1) {
加工一个车轮; P(availb); P(avail); //看看箱子中是否还有放车架的位置 P(mutex);
车轮放入箱中; V(mutex); V(fullb); //通知工人3,箱子中多了个车架 V(availa); } }
process worker3( ) {
while (1) {
P(availa); P(mutex);
从箱中取一个车架; V(mutex); V(avail); P(availb); P(mutex);
从箱中取一个车轮; P(mutex); V(avail); P(availb); P(mutex);
从箱中再取一个车轮; V(mutex); V(avail);
组装为一台车; } } parend
21. 利用管程解决教科书上的生产者-消费者问题。
利用管程解决生产者-消费者问题,首先要为它们建立一个管程,命名为Produer_Consumer,简称为PC。其中包括两个过程:
① put(item)过程。生产者利用该过程将自己生产的产品投放到缓冲池中,并用整型变量count来表示在缓冲池中已有的产品数目,当count≥n时,表示缓冲池已满,生产者等待(阻塞)。
35
第二章进程管理
② get(item)过程。消费者利用该过程从缓冲池中取出一个产品,当count≤0时,表示缓冲池已无可取的产品,消费者应等待。 PC管程可描述如下: type PC=monitor
var in,out,count: integer; buffer: array[0..n-1] of item; full,empty: condition; procedure entry put(item) begin
if count≥n then empty.wait; //生产者进程阻塞 buffer[in] := nextp; in := (in+1) mod n; count := count+1;
if full.queue then full.signal; //若等待队列非空,则唤醒队首的一个消费者进程 end
procedure entry get(item) begin
if count≤0 then full.wait; nextc := buffer[out]; out := (out+10 mod n; count := count-1;
if empty.queue then empty.signal; //若等待队列非空,则唤醒队首的一个生产者进程 end begin
in :=out :=0; count :=0; //初始化内部数据 end
生产者和消费者可描述如下: process producer ( ) //生产者进程 begin repeat
produce an item in nextp; PC.put(item); until false; end
process consumer ( ) //消费者进程 begin repeat
PC.get(item);
consume the item in nextc; until false; end
22. (北邮1998年试题)某庙寺有小和尚、老和尚若干。有一水井和一个水缸,由小和尚提水入缸供老和
尚饮用。水缸可容纳10桶水,水取自同一井中。水井很窄,每次只能容一个水桶打水。水桶总数为3个。每次入水、取水仅为1桶水,且不可同时进行。试用一种同步机制,写出小和尚和老和尚入水、取水的活动过程。
36
第二章进程管理
解:采用信号量机制。
semaphore mutex, empty, full, S; mutex=1; //互斥信号量
empty=10; //小和尚的资源信号量,用于与老和尚同步,假设开始时水缸为空 full=0; //老和尚的资源信号量,用于与小和尚同步 S=3; //水桶资源信号量 parbegin
小和尚i (i=1, 2, ... , m) //m个小和尚进程 {
while (1) {
P(S); //取一水桶,准备入水
P(empty); //看看水缸是否还有空间入水 P(mutex); //互斥
从水井取水,倒入水缸中; V(mutex); V(full); //通知老和尚,水缸中已增加了一桶水 V(S); //释放水桶 } }
老和尚j (J-1, 2, ... , n) //n个老和尚进程 {
while (1) {
P(S); //取一水桶,准备取水 P(full); //看看水缸中是否有水 P(mutex);
从水缸中取一桶水; V(mutex);
V(empty); //水缸增加一个桶空间 V(S); //释放水桶 饮用水; } } parend
23. 有如图2-3所示的工作模型:
三个进程P0、P1、P2和三个缓冲区B0、B1、B2,进程间借助相邻缓冲区传递消息:P0每次从B0中取出一条消息经加工后送入B1中,P1每次从B1中取出一条消息经加工后送入B2中,P2每次从B2中取出一条消息经加工后送入B0中。B0,B1,B2分别可存放3,2,2个消息。初始时B0中有2个消息,B1,B2中各有1个消息。用P、V操作写出P0,P1,P2的同步及互斥流程。
B0 P0 P2 B2 P1
37 B1 第二章进程管理
图2-3
解:semaphore empty0,full0,empty1,full1,empty2,full2,mutex;
empty0=1;full0=2; //冲区B0有2个消息,还可放1个消息 empty1=1; full1=1; //冲区B1有1个消息,还可放1个消息 empty2=1; full2=1; //冲区B2有1个消息,还可放1个消息 mutex=1; //互斥信号量 parbegin Process P0 {
while (1) {
P(full0); //看看B0中是否有消息 P(mutex); //互斥访问B0 从缓冲区B0中取一个消息x; V(mutex);
V(empty0); //B0中空出一个存放消息的位置 加工消息x;
P(empty1); //看看B1中是否可放一个消息 P(mutex); //互斥访问B1 将加工后的x存入缓冲区B1; V(mutex); V(full1); //B1中增加一个消息 } }
Process P1 {
while (1) {
P(full1); //看看B1中是否有消息 P(mutex); //互斥访问B1 从缓冲区B1中取一个消息y; V(mutex); V(empty1); //B1中空出一个存放消息的位置 加工消息y; P(empty2); //看看B2中是否可放一个消息 P(mutex); //互斥访问B2 将加工后的x存入缓冲区B2; V(mutex); V(full2); //B2中增加一个消息 } }
Process P2 {
while (1) {
P(full2); //看看B2中是否有消息 P(mutex); //互斥访问B2
38
第二章进程管理
从缓冲区B2中取一个消息z; V(mutex);
V(empty2); //B2中空出一个存放消息的位置 加工消息z;
P(empty0); //看看B0中是否可放一个消息 P(mutex); //互斥访问B0 将加工后的z存入缓冲区B0; V(mutex); V(full0); //B0中增加一个消息 } }
parend
24. 现有3个生产者P1、P2、P3,他们都要生产桔子水,每个生产者都已分别购得两种不同原料,待购
得第三种原料后就可配制成桔子水,装瓶出售。有一供应商能源源不断地供应糖、水、桔子精,但每次只拿出一种原料放入容器中供给生产者。当容器中有原料时需要该原料的生产者可取走,当容器空时供应商又可以放入一种原料。假定:
生产者P1已购得糖和水; 生产者P2已购得水和桔子精; 生产者P3已购得糖和桔子精。
试用:1)管程;2)信号量和P、V操作,写出供应商和3个生产者之间能正确同步的算法。 解:(1) 采用管程机制
type PC=monitor //定义管程,命名为PC var flag : integer;
C : array[0..3] of condition; procedure entry put ( ) //供应商调用此过程向容器中放一种原料 begin
if (flag>0) then C[0].wait; //若容器不空,供应商阻塞 随机地向容器中放一种原料x; if (x是桔子精) then begin flag := 1; //置容器中是桔子精的标志 if C[1].queue then C[1].signal //若生产者P1正在等待桔子精,则唤醒之 end
else if (x是糖) then begin flag := 2; //置容器中是糖的标志 if C[2].queue then C[2].signal //若生产者P2正在等待糖,则唤醒之 end
else begin
flag := 3; //置容器中是水的标志 if C[3].queue then C[3].signal //若生产者P3正在等待水,则唤醒之 end end
procedure entry get (int k) //生产者调用此过程从容器中取一原料 begin
if (flag≠k) then C[k].wait; //若容器中没有自己想要的原料则等待 从容器中取出自己所需的原料;
39
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库操作系统分章习题(8)在线全文阅读。
相关推荐: