第二章进程管理
END PB:BEGIN
L2:P(full1);
P(mutex1); get from buffer 1; V(avail1); V(mutex1);
P(avail2); P(mutex2); put to buffer 2; V(full2); V(mutex2); goto L2 ; END PC:BEGIN
L3:P(full2);
P(mutex2); get from buffer 2; V(avail2); V(mutex2); print RECORD goto L3 ; END PAREND END
3. 有三个进程,Reader进程读入数据number1,将其放入缓冲器B1,Executor进程将B1中数据取出,处
理成数据number2,将其放入缓冲器B2,Printer进程将number2数据取出打印,假设B1和B2只能存放一个数据,用P、V操作管理这三个进程的执行。 解:解:采用P、V操作的同步算法如下:
BEGIN
semaphore empty1, full1, empty2, full2 ; empty1.vale = empty2.value = 1 ; ful2.value = full2.value = 0 ; PARBEGIN Reader:BEGIN
L1:read number1 ;
P(empty1) ; B1=number1 ; V(full1) ; goto L1; END
Executor:BEGIN
L2:P(full1) ;
take number1 from B1 ;
15
第二章进程管理
V(empty1) ;
Process number1-->number2 ; P(empty2) ; B2=number2 ; V(full2) ; goto L2; END
Printer:BEGIN
L3:P(full2);
take number2 from B2 ; V(empty2) ; Print(number2) ; goto L3; END
COEND END
4. 假定系统有三个并发进程read, move和print共享缓冲器B1和B2。进程read负责从输入设备上读信息,
每读出一个记录后把它存放到缓冲器B1中。进程move从缓冲器B1中取出一记录,加工后存入缓冲器B2。进程print将B2中的记录取出打印输出。缓冲器B1和B2每次只能存放一个记录。要求三个进程协调完成任务,使打印出来的与读入的记录的个数,次序完全一样。请用PV操作,写出它们的并发程序。(注:本题与第3题是同一个题,与第5题类似) 解:参考程序如下: begin
SR, SM1, SM2, SP: semaphore; B1, B2 : record;
SR:=1; SM1:=0; SM2=1; SP:=0; cobegin
process read X : recoed; begin
R: X:=从输入设备上读入的一个记录; P(SR); B1:=X; V(SM1); goto R; end;
process move Y : record; begin
M: P(SM1); Y :=B1;
V(SR); 加工Y中的记录; P(SM2); B2 := Y;
16
第二章进程管理
V(SP); goto M; end; process print Z : record; begin P: P(SP);
Z := B2; V(SM2); 打印Z中的记录; goto P; end; coend; end;
5. 今有3个并发进程R、M、P,它们共享一个缓冲器B。进程R负责从输入设备读入信息,每读一个记
录后把它存放在缓冲器B中。进程M在缓冲器B中加工进程R存入的记录。进程P把加工后的记录打印出来。缓冲器B中每次只能存放一个记录,当记录被加工输出后,缓冲器B中又可以存放一个新的记录。为协调它们的工作,采用PV操作进行管理。 解:semaphore SR,SM,SP;
SR=1; SM=0; SP=0; parbegin Process R {
while (1) {
从输入设备读入信息X; P(SR); //看看缓冲区B是否是空的 B=X; //信息存入缓冲区B V(SM); //通知M,缓冲区B中已有记录 } }
Process M {
while (1) {
P(SM); //测试R是否已在B中存放信息 在缓冲器B中加工进程R存入的记录; V(SP); //通知P缓冲区B中的信息已可打印 } }
Process P {
while (1) {
P(SP); //测试M是否已将信息加工好 从B中取M加工后的信息Y;
V(SR); //通知R,缓冲区B已可房信息 Print(Y); //打印信息Y
17
第二章进程管理
} }
parend
6. 若一只盘子一次只能放一个水果,A只往盘中放苹果,B只往盘中放梨子,C只从盘中取苹果,D只
从盘中取梨子。试用:(1) 信号量和P、V操作;(2) 管程,写出同步算法。 解:(1) 采用P、V操作的同步算法如下:
semaphore SAB=1; //A、B的资源信号量,同时又是它们的互斥信号量 semaphore SC=0; //C的资源信号量(用于与A同步) semaphore SD=0; //D的资源信号量(用于与B同步) begin
parbegin
process A: //进程A的算法描述 {
while(true) { 取一个苹果;
wait(SAB); //测试盘子是否为空 将一苹果放入盘中;
signal(SC) //通知C盘中已有苹果(可能唤醒C) } }
process C: {
while(true) {
wait(SC); //测试盘子是否有苹果 从盘中取出苹果;
signal(SAB); //通知A(或B)盘子一空(可能唤醒A或B) 消费该苹果; } }
process B: //进程B的算法描述 {
while(true) { 取一个梨子;
wait(SAB); //测试盘子是否为空 将一梨子放入盘中;
signal(SD) //通知D盘中已有梨子(可能唤醒D) } }
process D: {
while(true) {
wait(SD); //测试盘子是否有梨子 从盘中取出梨子;
signal(SAB); //通知A(或B)盘子一空(可能唤醒A或B) 消费该梨子;
18
第二章进程管理
}
}
parend end
(2) 采用管程的同步算法如下:
首先定义管程MPC,该管程可描述如下: type MPC=monitor
var flag: integer; //flag=0:盘中无水果;=1盘中有苹果;=2盘中有梨子 empty: condition; //用于A或B等待空盘子
W: array[1..2] of condition //W[1]用于等待苹果,W[2]用于等待梨子 procedure entry put(integer k) begin
if flag>0 then empty.wait; //生产者A或B进程阻塞 flag=k;
放一k号水果入盘中; //设1号水果为苹果,2号水果为梨子 if W[k].queue then full.signal; //若有等待k号水果者,则唤醒之
end
procedure entry get(integer k) begin
if flag<>k then W[k].wait; //消费者C或D进程阻塞 从盘中取k号水果; flag := 0;
if empty.queue then empty.signal; //若等待队列非空,则唤醒队首的一个生产者进程 end begin
flag :=0; //初始化内部数据 end
A、B、C、D四个进程的同步算法可描述如下: parbegin Process A begin
任取一个苹果; MPC.put(1); end
Process B begin
任取一个梨子; MPC.put(2); end
Process C begin
MPC.get(1); 吃苹果; end
Process D
19
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库操作系统分章习题(4)在线全文阅读。
相关推荐: