可能进入死锁状态。将P(full)与P(mutex)互换位置,系统也可能进入死锁状态。将V(full)与V(mutex)互换位置,系统不会出现什么问题,最多只是临界资源的释放推迟。
12. 假设有三个并发进程P,Q,R,其中P负责从输入设备上读入信息并传送给Q,Q将信息加工后传送给R,R则负责将信息打印输出。写出下列条件的并发程序:
(1)进程P、Q共享一个缓冲区,进程Q、R共享另一个缓冲区。
(2)进程P、Q共享一个由m个缓冲区组成的缓冲池,进程Q、R共享另一个由n个缓冲区组成的缓冲池。 参考答案:(1)
第一步:确定进程
3个进程P、Q、R P进程:
? 从输入设备上读入信息 ? 将信息放入缓冲区1 Q进程:
? 从缓冲区1取出信息 ? 将信息放入缓冲区2中 R进程:
? 从缓冲区2取出信息 ? 将信息打印输出
第二步:确定进程的同步、互斥关系
? 同步:P当缓存区1无数据时,才可以向缓冲区1写入信息 ? 同步:Q当缓存区1有数据时,才可以从缓冲区1读取信息 ? 同步:Q当缓存区2无数据时,才可以向缓冲区2写入信息 ? 同步:R当缓存区2有数据时,才可以从缓冲区2读取信息
第三步:设置信号量
? 缓存区1无数据,empty1,初值1 ? 缓存区1有数据,full1,初值0 ? 缓存区2无数据,empty2,初值1 ? 缓存区2有数据,full2,初值0
第四步:用伪代码描述
begin
empty1,empty2,full1,full2:semaphore; empty1 :=1; empty2 :=1; full1 :=0; full2 :=0;
cobegin
P ( ); Q ( );
R ( );
coend;
end;
process P ( )
begin
L1: 从输入设备上读入信息; P(empty1);
将信息放入缓冲区1; V(full1); goto L1 end;
process Q ( )
begin
L2:P(full1);
从缓冲区1取出信息;
V(empty1); P(empty2);
将信息放入缓冲区2;
V(full2); goto L2 end;
process R ( )
begin
L3:P(full2);
从缓冲区2取出信息;
V(empty2);
将信息打印输出 ;
goto L3 ; end;
(2)
第一步:确定进程
3个进程P、Q、R P进程:
? 从输入设备上读入信息
? 将信息放入缓冲池1中的一个空缓冲区中 Q进程:
? 从缓冲池1中的一个非空缓冲区中取出信息 ? 将信息放入缓冲池2中的一个空缓冲区中 R进程:
? 从缓冲池2中的一个非空缓冲区中取出信息 ? 将信息打印输出
第二步:确定进程的同步、互斥关系
? 同步:P当缓冲池1中有空的缓冲区时,才可以向缓冲池1写入信息
? 同步:Q当缓冲池1中有非空的缓冲区时,才可以从缓冲池1读取信息 ? 同步:Q当缓冲池2中有空的缓冲区时,才可以向缓冲池2写入信息 ? 同步:R当缓冲池2中有非空的缓冲区时,才可以从缓冲池2读取信息
第三步:设置信号量
? 缓冲池1中的空缓冲区的数量,empty1,初值m ? 缓冲池1中的非空缓冲区的数量,full1,初值0 ? 缓冲池2中的空缓冲区的数量,empty2,初值n ? 缓冲池2中的非空缓冲区的数量,full2,初值0
第四步:用伪代码描述
begin
empty1,empty2,full1,full2:semaphore; empty1 :=m; empty2 :=n; full1 :=0; full2 :=0;
cobegin
P ( ); Q ( );
R ( );
coend;
end;
process P ( )
begin
L1: 从输入设备上读入信息; P(empty1);
将信息放入缓冲池1中的一个空缓冲区中; V(full1); goto L1 end;
process Q ( )
begin
L2:P(full1);
从缓冲池1中的一个非空缓冲区中取出信息;
V(empty1); P(empty2);
将信息放入缓冲池2中的一个空缓冲区中;
V(full2); goto L2 end;
process R ( )
begin
L3:P(full2);
从缓冲池2中的一个非空缓冲区中取出信息;
V(empty2);
将信息打印输出 ;
goto L3 ; end;
13. 有四个并发进程:R1,R2,W1和W2,它们共享可以存放一个数的缓冲区。进程R1每次从磁盘读入一个数存放到缓冲区中,供进程W1打印输出;进程R2每次从键盘读一个数存放到缓冲区中,供进程W2打印输出。当缓冲区满时,不允许再向缓冲区中存放数据;当缓冲区空时,不允许再从缓冲区中取出数据打印输出。试用PV操作实现四个进程的协调运行。
参考答案:
第一步:确定进程
4个进程R1、R2、W1、W2 R1进程:
? 从磁盘上读入一个数 ? 将数存放到缓冲区中 W1进程:
? 将R1进程放进缓冲区中的数取出 ? 打印输出 R2进程:
? 从键盘读入一个数 ? 将数存放到缓冲区中 W2进程:
? 将R2进程放进缓冲区中的数取出 ? 打印输出
第二步:确定进程的同步、互斥关系
? 同步:R1当缓存区无数据时,才可以向缓冲区写入数据 ? 同步:R2当缓存区无数据时,才可以向缓冲区写入数据
? 同步:W1当缓存区中是R1写的数据时,才可以将数据从缓冲区中读出 ? 同步:W2当缓存区中是R2写的数据时,才可以将数据从缓冲区中读出
第三步:设置信号量
? 缓存区无数据,empty,初值1
? 缓存区中是R1写的数据,full1,初值0 ? 缓存区中是R2写的数据,full2,初值0
第四步:用伪代码描述
begin
empty, full1,full2:semaphore; empty :=1; full1 :=0; full2 :=0;
end;
cobegin
R1 ( ); R2 ( ); W1 ( ); W2 ( ); coend;
process R1 ( )
begin
L1: 从磁盘上读入一个数; P(empty);
将数存放到缓冲区中; V(full1); goto L1 end;
process R2 ( )
begin L2: 从键盘上读入一个数; P(empty);
将数存放到缓冲区中; V(full2); goto L2 end;
process W1 ( )
begin
L3:P(full1);
将缓冲区中的数取出; V(empty); 打印输出;
goto L3 end;
process W2 ( )
begin
L4:P(full2);
将缓冲区中的数取出; V(empty); 打印输出;
goto L4 end;
百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典教育范文操作系统复习题(2)在线全文阅读。
相关推荐: