77范文网 - 专业文章范例文档资料分享平台

操作系统分章习题(8)

来源:网络收集 时间:2019-01-03 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

第二章进程管理

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)在线全文阅读。

操作系统分章习题(8).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/402784.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: