wait(mutex);
wait(full); /* 应为 wait(empty),而且还应该在 wait(mutex)的前面 */ buffer(in):=nextp; /* 缓冲池数组游标应前移: in:=(in+1) mod n; */ signal(mutex); /* signal(full); */ until false; end
consumer: begin repeat
wait(mutex);
wait(empty); /* 应为 wait(full),而且还应该在 wait(mutex)的前面 */ nextc:=buffer(out);
out:=out+1; /* 考虑循环,应改为: out:=(out+1) mod n; */ signal(mutex); /* signal(empty); */ consumer item in nextc; until false; end
10 试利用记录型信号量写出一个不会出现死锁的哲学家进餐问题的算法.
设初始值为 1 的信号量 c[I]表示 I 号筷子被拿(I=1,2,3,4,...,2n),其中 n 为自然数. send(I): Begin
if I mod 2==1 then {
P(c[I]);
P(c[I-1 mod 5]); Eat;
V(c[I-1 mod 5]); V(c[I]); } else {
P(c[I-1 mod 5]); P(c[I]); Eat;
V(c[I]);
V(c[I-1 mod 5]); } End
11 在测量控制系统中的数据采集任务,把所采集的数据送一单缓冲区;计算任
务从该单缓冲中取出数据
进行计算.试写出利用信号量机制实现两者共享单缓冲的同步算法. int mutex=1; int empty=n; int full=0; int in=0; int out=0; main() {
cobegin send(); obtain(); coend }
send() {
while(1) { . .
collect data in nextp; . .
wait(empty); wait(mutex);
buffer(in)=nextp; in=(in+1) mod n; signal(mutex); signal(full); }
}//send obtain() {
while(1) {
wait(full); wait(mutex);
nextc:=buffer(out); out:=(out+1) mod n; signal(mutex); signal(empty);
culculate the data in nextc; }//while }//obtain
12 画图说明管程由哪几部分组成?为什么要引入条件变量?
管程由三部分组成:局部于管程的共享变量说明;对该数据结构进行操作的一组过程;对局部于管程的数
据设置初始值的语句. (图见 P80)
因为调用 wait 原语后,使进程等待的原因有多种,为了区别它们,引入了条件变量.
13 如何利用管程来解决生产者-消费者问题?(见 P82)
14 什么是 AND 信号量?试利用 AND 信号量写出生产者-消费者问题的解法. 为解决并行所带来的死锁问题,在 wait 操作中引入 AND 条件,其基本思想是将进程在整个运行过程中所
需要的所有临界资源,一次性地全部分配给进程,用完后一次性释放.解决生产者-消费者问题可描述如 下:
var mutex,empty,full: semaphore:=1,n,0; buffer: array[0,...,n-1] of item; in,out: integer:=0,0; begin parbegin
producer: begin repeat . .
produce an item in nextp; . .
wait(empty);
wait(s1,s2,s3,...,sn); //s1,s2,...,sn 为执行生产者进程除 empty 外其余的条件
wait(mutex);
buffer(in):=nextp; in:=(in+1) mod n; signal(mutex); signal(full);
signal(s1,s2,s3,...,sn); until false; end
consumer: begin repeat
wait(full);
wait(k1,k2,k3,...,kn); //k1,k2,...,kn 为执行消费者进程除 full 外其余的条件
wait(mutex);
nextc:=buffer(out); out:=(out+1) mod n; signal(mutex); signal(empty);
signal(k1,k2,k3,...,kn); consume the item in nextc; until false; end parend end
15 在单处理机环境下,进程间有哪几种通信方式? a. 共享存储器系统通信方式; b. 消息传递系统通信方式; c. 管道通信方式.
16 试比较进程间的低级通信工具与高级通信工具. 用户用低级通信工具实现进程通信很不方便,因为其效率低,通信对用户不透明,所有的操作都必须由程
序员来实现. 而高级通信工具则可弥补这些缺陷,用户可直接利用操作系统所提供的一组通信命令,高效 地传送大量的数据.
17 消息队列通信机制应有哪几方面功能? 略
18 试比较消息队列与管道通信机制.
a. 所谓管道,是指用于连接一个读进程和一个写进程,以实现它们之间通信的共享文件,又称 pipe 文件.
管道通信是属于共享存储器系统的.
b. 消息队列通信机制属于消息传递系统通信机制,存在通信链路,有消息的格式,有若干缓冲队列,采
用独特的发送原语和接收原语. (详见 P89-90)