P(S13); P(S14); V(S36); V(S47); V(S38); END END
PROCESS M5: PROCESS M6: BEGIN BEGIN
V(S57); P(S26); END P(S36); END
PROCESS M7: PROCESS M8 BEGIN BEGIN
P(S47); P(S38); P(S57); P(S78); V(S78); END END COEND
3-16. 叉子是临界资源,在一段时间内只允许一个哲学家使用。一个信号量表示一把叉子,五个信号量构成信号量数组,这些信号量的初值为1。
int fork[0]=fork[1]=…=fork[4]=1; 第i个哲学家所执行的程序: do{ P(mutex); P(fork[i]);
P(fork[(i+1)mod5]); V(mutex); 吃饭
V(fork[i]);
V(fork[(i+1)mod5]); } while(1);
3-17.
(1)公平竞争(无写者时,读者仍遵循多个读者可以同时读) rmutex互斥共享readcount; rwmutex读写互斥,写写互斥; 读写进程在z上排队。
int rmutex=1,rwmutex=1,readcount=0;
6
reader: begin
p(z); //读写进程在z上排队。 p(rmutex);
if(readcount=0) then p(rwmutex); end if
++readcount; v(rmutex);
v(z); //无写者时,多个读者可以同时读. read data; p(rmutex); 写 --readcount;
if(readcount=0 then v(rwmutex);
end if; z 读 v(rmutex); 写 … 写 end 读 writer: 读 begin 读 p(z); //读写进程在z上排队。 写 p(rwmutex); write data; v(rwmutex); v(z); … end
(2)写者优先
int readcount,writecount;
semaphore rmutex=1,wmutex=1,rwmutex=1,z=1,x=1; reader:
//当来了一个写进程时,通过p(x)禁止其后读进程读,直到写进程写完为止。 while(1){
p(z); //其他读进程在z上排队
p(x); //一个读进程与一个写进程在x上竞争 p(rmutex); //读进程互斥访问readcount
7
++readcount;
if(readcount==1) p(rwmutex); v(rmutex); v(x); v(z);
read data; //临界区 p(rmutex); --readcount;
写 x rwmutex if(readcount==0) v(rwmutex); z 读 写 v(rmutex);
读 写 } 读 读
读 Writer: while(1){
p(wmutex); //写进程互斥访问writecount ++writecount;
if(writecount==1) p(x); //一个写进程与一个读进程在x上竞争 v(wmutex);
p(rwmutex); //其他写进程在rwmutex上排队 write data; //临界区 v(rwmutex); p(wmutex); --writecount;
if(writecount==0) v(x); //写进程都写完时,通过v(x)允许读进程读 v(wmutex); }
附加题:
读者优先,规定仅允许5个进程同时读,怎样修改程序?
解:增加一个资源信号量s,初值为5。 int s=5; Reader: begin
8
P(rmutex); readcount=readcount+1; if(readcount==1)then P(rwmutex); V(rmutex); P(s); read_file(); V(s); P(rmutex); readcount=readcount-1; if(readcount==0)then V(rwmutex); V(rmutex); end
writer: begin
p(rwmutex); write data; v(rwmutex); … end
3-18. int s1=0, s2=n; 顾客进程: 理发师进程:
P(s2); P(s1);
V(s1); 给顾客理发 坐椅子等理发 V(s2)
3-19.(2)和(4)会发生死锁。
3-20. P1/剩余 P2/剩余 P3/剩余 1 3/5 2 2/4 3 4(不安全) 4 5/3 5 2(不安全) 6 (5+3)/0
系统剩余 7 5 3 0(8) 9
7 4/3 4 8 (2+2)/2 2 9
(1) P1占有5个资源,剩余3个资源请求。 P2占有2个资源,剩余4个资源请求。 P3占有0个资源,剩余7个资源请求。 系统剩余3个资源。
(2)P1的请求最先满足。进程完成序列:P1,P2,P3。
3-21.
(1)
最大需求矩阵: 分配矩阵: 剩余请求矩阵:
0 0 1 2 0 0 1 2 0 0 0 0
1 7 5 0 1 0 0 0 0 7 5 0 Max = Allocation = Need = 2 3 5 6 1 3 5 4 1 0 0 2
0 6 5 2 0 6 3 2 0 0 2 0
0 6 5 6 0 0 1 4 0 6 4 2
剩余资源向量:Available=(1 5 0 2)
(2)当前系统是安全的。 判断系统是否安全,只要检查系统剩余资源向量能否对各进程的剩余请求向量找到一个进程完成序列,当按照这个序列为各进程分配资源时,各进程都能成功完成。若能找到,则系统是安全的,否则,为不安全。
先找到p0, 因为p0已满足最大资源请求,它可以完成,释放其占有的资源,使系统剩余资源向量为(1 5 1 4)
之后,系统剩余资源向量(1 5 1 4),可满足进程p2, 使p2 可以完成,释放其占有的资源,使系统剩余资源向量为(2 8 6 8)。
之后无论选哪一个进程都可成功完成。
故找到的进程完成序列可为:p0,p2,p4,p3,p1; 或 p0,p2,p3,p1,p4 等,故系统是安全的。
(3)因系统剩余可用向量为(1502),p2的剩余请求向量为(1002),即(1502)>(1002)。故,当p2提出(1001)请求时,能满足。进程完成序列:p0,p2,p4,p3,p1
10