当前位置: 技术问答>linux和unix
很简单的PV原语问题
来源: 互联网 发布时间:2016-10-21
本文导语: 生产围棋的工人不小心把相等数量的黑子和白子混装载一个箱子里,现要用自动分拣系统把黑子和白子分开,该系统由两个并发执行的进程组成,功能如下: (1)进程A专门拣黑子,进程B专门拣白子; (2...
生产围棋的工人不小心把相等数量的黑子和白子混装载一个箱子里,现要用自动分拣系统把黑子和白子分开,该系统由两个并发执行的进程组成,功能如下:
(1)进程A专门拣黑子,进程B专门拣白子;
(2)每个进程每次只拣一个子,当一个进程在拣子时不允许另一个进程去拣子;
分析:
第一步:确定进程间的关系。由功能(2)可知进程之间是互斥的关系。
第二步:确定信号量及其值。由于进程A和进程B要互斥进入箱子去拣棋子,箱子是两个进程的公有资源,所以设置一个信号量s,其值取决于公有资源的数目,由于箱子只有一个,s的初值就设为1。
实现:
begin
s:semaphore;
s:=1;
cobegin
process A
begin
L1: P(s);
拣黑子;
V(s);
goto L1; //? 是不是每次执行完,就跳到L1,那怎么执行process B?
end;
process B
begin
L2:P(s);
拣白子;
V(s);
goto L2;
end;
coend;
end;
问题1:看代码的注释。
问题2:V原语操作的动作是:
(1)sem加1;
(2)若相加结果大于零,则进程继续执行;
(3)若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程,然后再返回原进程继续执行或转进程调度。
他要先加1 ,怎么可能出现小于或等于零的情况?
(1)进程A专门拣黑子,进程B专门拣白子;
(2)每个进程每次只拣一个子,当一个进程在拣子时不允许另一个进程去拣子;
分析:
第一步:确定进程间的关系。由功能(2)可知进程之间是互斥的关系。
第二步:确定信号量及其值。由于进程A和进程B要互斥进入箱子去拣棋子,箱子是两个进程的公有资源,所以设置一个信号量s,其值取决于公有资源的数目,由于箱子只有一个,s的初值就设为1。
实现:
begin
s:semaphore;
s:=1;
cobegin
process A
begin
L1: P(s);
拣黑子;
V(s);
goto L1; //? 是不是每次执行完,就跳到L1,那怎么执行process B?
end;
process B
begin
L2:P(s);
拣白子;
V(s);
goto L2;
end;
coend;
end;
问题1:看代码的注释。
问题2:V原语操作的动作是:
(1)sem加1;
(2)若相加结果大于零,则进程继续执行;
(3)若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程,然后再返回原进程继续执行或转进程调度。
他要先加1 ,怎么可能出现小于或等于零的情况?
|
问题1:我理解process A和process B是同时开始,并行执行的。cobegin和coend的前缀co-就有这个意思
问题2:别忘了P(s)的时候s要减1。如果A先P(s),s变成0,然后拣黑子,此时B也P(s),s就变成-1,然后A再V(s),s就是0了。
如果有多个进程比如A~E五个,A先P(s),然后BCDE都P(s),那么s就会变成-4,然后A结束操作再V(s)的时候就会出现小于0的情况了
若相加结果小于或等于零,就说明有其他进程做了P(s)操作之后在等待,所以就需要唤醒
问题2:别忘了P(s)的时候s要减1。如果A先P(s),s变成0,然后拣黑子,此时B也P(s),s就变成-1,然后A再V(s),s就是0了。
如果有多个进程比如A~E五个,A先P(s),然后BCDE都P(s),那么s就会变成-4,然后A结束操作再V(s)的时候就会出现小于0的情况了
若相加结果小于或等于零,就说明有其他进程做了P(s)操作之后在等待,所以就需要唤醒