第二章进程管理
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)在线全文阅读。
相关推荐: