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

操作系统分章习题(7)

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

第二章进程管理

int i=0; //生产者使用是缓冲区下标 int j=0; //消费者使用是缓冲区下标 parbegin

process producerm (m=1, 2, 3, ?) begin

int a,b,c; //该生产者使用的局部变量 repeat

生产者获得3个整数a, b, c ;

P(empty); P(empty); P(empty); //得到3个空缓冲区 P(mutex); //生产者互斥访问共享变量i buffer[i]=a; //整数a存入缓冲区 i=(i+1) mod 9; buffer[i]=b; //整数b存入缓冲区 i=(i+1) mod 9; buffer[i]=c; //整数c存入缓冲区 i=(i+1) mod 9; V(mutex);

V(full); V(full); V(full); //通知消费者缓冲区已有数据(满缓冲区数增3) until false end

process consumer k (k=1, 2, 3, ?) begin int x; repeat

P(full); //看看缓冲区是否有整数 P(mutex); //消费者互斥访问共享变量j x=buffer[j]; //从缓冲区取整数到x中 j=(j+1) mod 9 V(mutex); V(empty); //空缓冲区数增1 consume x; until false end parend

(2)采用管程机制解决上述问题。

首先定义管程PC,该管程可描述如下: type PC=monitor

var i, in,out,count: integer; buffer: array[0..8] of integer; full,empty: condition;

procedure entry put(integer a[ ]) begin

P: if count+3>n then{

empty.wait; //生产者进程阻塞 goto P;

30

第二章进程管理

}

for (i=0; i<3; i++) { //一次连续放3个整数

buffer[in] := a[i]; in := (in+1) mod 9; count := count+1;

}

for (i=0;i<3;i++)

if full.queue then full.signal; //若等待队列非空,则唤醒一个消费者(最多唤醒3个)

end

procedure entry get(int x) begin

if count≤0 then full.wait; //消费者进程阻塞 x := buffer[out];

out := (out+1) mod 9; count := count-1;

if empty.queue then empty.signal; //若等待队列非空,则唤醒队首的一个生产者进程 end begin

in :=out :=0; count :=0; //初始化内部数据 end

生产者和消费者进程可描述如下: process producer ( ) //生产者进程 begin

a: array[0..2] of integer; repeat

生成3个整数存于数组a中; PC.put(a); until false; end

process consumer ( ) //消费者进程 begin

var x:integer; repeat

PC.get(x); consume x; until false; end

18. 有n个输入进程、m个计算进程和p个输出进程,通过循环缓冲区A和循环缓冲区B进行数据传送,如

下图2-2所示。

输入进程1 输入进程2 计算进程1 计算进程2 输出进程1 输出进程2 ? 输入进程n 缓冲区A ? 计算进程m 缓冲区B ? 输出进程p 31

第二章进程管理

图2-2

已知缓冲区A有N个缓冲块,缓冲区B有M个缓冲块。输入进程每次输入1个数据块存入缓冲区A的1个缓冲块中;计算进程每次从缓冲区A取出1个数据块,处理后的数据块存入缓冲区B的1个缓冲块中;输出进程每次从缓冲区B中取出1个数据块进行输出操作。试用P、V操作实现进程间的同步与互斥。 【说明】n个输入进程和m个计算进程构成一对生产者-消费者问题;m个计算进程和p个输出进程构成另

一对生产者-消费者问题。计算进程担当双重较色,即既是消费者,又是生产者。

解:semaphore mutex1, mutex2, empty1, full1, empty2, full2;

int in1, out1, in2, out2; mutex1=1; //互斥信号量,用于互斥访问共享变量in1和out1 mutex2=1; //互斥信号量,用于互斥访问共享变量in2和out2 empty1=N; //同步信号量,表示缓冲区A的空缓冲区个数 empty2=M; //同步信号量,表示缓冲区B的空缓冲区个数 full1=0; //同步信号量,表示缓冲区A的满缓冲区个数 full2=0; //同步信号量,表示缓冲区B的满缓冲区个数 in1=out1=in2=out2=0; //共享变量,表示缓冲区的下标变量 parbegin

process inputi ( ) //n个输入进程,i=1, 2, ... , n {

while (1) {

读入一个数据块X; P(empty1); //判断缓冲区A是否有空闲位置放数据块,若无则等待 P(mutex1); //互斥访问共享变量in1和缓冲区A bufferA[in1]=X; in1=(in1+1)%M; V(mutex1); V(full1); //通知计算进程,缓冲区A中已有数据(可能唤醒计算进程) } }

process computej( ) //m个计算进程,j=1, 2, ... , m {

while (1) {

P(full1); //判断缓冲区A中是否有可取的数据块,若无则等待 P(mutex1); //互斥访问out1和缓冲区A Y=bufferA[out1]; 消费者

角色 out1=(out1+1)%M;

V(mutex1); V(empty1); //通知输入进程,缓冲区A中已被取走一个数据块 处理数据块Y; P(empty2); //判断缓冲区B是否有空位置存放数据块,若无则等待 P(mutex2); //互斥访问共享变量in2和缓冲区B bufferB[in2]=处理后的数据块Y; 生产者in2=(in2+1)%N; 角色 V(mutex2); V(full2); //通知输出进程,缓冲区B中已有数据(可能唤醒输出进程) }

32

第二章进程管理

}

process outputk( ) //p个输出进程,k=1, 2, ... , p {

while (1) {

P(full2); //判断缓冲区B中是否有可取的数据块,若无则等 P(mutex2); //互斥访问共享变量out2和缓冲区B Z=bufferB[out2]; out2=(out2+1)%N; V(mutex2); V(empty2); //通知计算进程,缓冲区B中已被取走一个数据块 } } parend

19. 假定有一个信箱可存放N封信。当信箱不满时,发信者可把信件送入信箱;当信箱中有信时,收信

者可以从信箱中取信。用指针r、k分别刻存信和取信的位置,请用管程(Monitor)来管理这个信箱,使发信者和收信者能正确工作。

解:引入条件变量empty和full,当信箱满时,发信者在empty上阻塞(调用empty.wait);当信箱空时,收信

者在full上阻塞。

发信者将一信件送入信箱后,若有收信者阻塞,则唤醒一个收信者(调用full.signal);收信者取走一信件后,若有法信者阻塞,则唤醒一个发信者(调用empty.signal)。 引入整型变量count,用于对信箱中信件计数。 //管程定义如下:

type MailBoxManager=monitor var r,k,count:integer;

mailbox: array[0..N-1] of message; full,empty: condition; procedure entry get( meg ) begin

if (count=0) then full.wait; //收信者阻塞 meg:=mailbox[r];

r:= (r+1) mod N; count:=count-1;

if empty.gueue then empty.signal;//唤醒一个发信者 end

procedure entry put( mg ) begin

if (count=N) then empty.wait;//发信者阻塞 mailbox[k]:=mg;

k:= (k+1) mod N; count:=count+1;

if full.queue then full.signal; //唤醒一个收信者 end

begin //初始化部分 r:=0; k:=0; count:=0; end

33

第二章进程管理

//发信者和收信者可描述为: Sender: //发信者进程 begin repeat

write a message in mg; //写信 MailBoxManager.put(mg); //发信 until false; end

Receiver: //收信者进程 begin repeat

MailBoxManager.get(msg); //收信 process the message in msg;//处理信件 until false; end

20. 设自行车生产线上有一只箱子,其中有N个位置(N≥3),每个位置可存放一个车架或一个车轮;又设

有三个工人,其活动分别为: 工人1活动工人2活动工人3活动 ↓↓↓ 加工一个车架加工一个车轮箱中取一个车架 ↓↓↓ 车架放入箱中车轮放入箱中箱中取两个车轮 ↓ 组装为一台车

试用PV操作实现三个工人的合作。

【分析】工人1和工人2向箱子中放车架或车轮的活动,除了受到箱子容量的限制外,还应考虑车架和车

轮的数量差,即不允许只放车架或只放车轮,因为那样可能会引起死锁(学生思考:为什么?)。显然,工人1放车架时至少应留出2个放车轮的空位;同样,工人2放车轮时至少应留出1个空位放车架。若count1和count2分别代表车架数和车轮数,则不妨规定-(N-1)≤count1-count2≤N-2 解:semaphore mutex, avail, availa, availb, fulla, fullb;

mutex=1; //互斥信号量,用于访问共享变量count1和count2 avail=N; //同步信号量,用于表示箱子中空闲位置数 availa=N-2; //同步信号量,用于表示箱子中可放车架的数量 availb=N-1; //同步信号量,用于表示箱子中可放车轮的数量 fulla=0; //同步信号量,用于表示箱子中已放的车架数量 fullb=0; //同步信号量,用于表示箱子中已放的车轮数量 parbegin

process worker1( ) {

while (1) {

加工一个车架; P(availa); P(avail); //看看箱子中是否还有放车架的位置 P(mutex);

车架放入箱中;

34

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库操作系统分章习题(7)在线全文阅读。

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