分类:
2010-03-13 10:36:40
内容摘要 P操作和V操作是不可中断的程序段,称为原语.PV原语及信号量的概念都是由荷兰科学家E.W.Dijkstra提出的.信号量sem是一整数,sem大于等于零时代表可供并发进程使用的资源实体数,但sem小于零时则表示正在等待使用临界区的进程数.
中国源码网内相关主题链接
因为PV原语有两种表达,一个是:
V(s):[s = s + 1]
P(s): [while(s == 0)|wait|;s = s - 1]
还有另一种表达,更加广泛的被使用:
V(s): --s >= 0?go on:wait
P(s): ++s > 0?go on:wake up on
下面来自:
PV原语的含义
P操作和V操作是不可中断的程序段,称为原语.PV原语及信号量的概念都是由荷兰科学家E.W.Dijkstra提出的.信号量sem是一整数,sem大于等于零时代表可供并发进程使用的资源实体数,但sem小于零时则表示正在等待使用临界区的进程数.
P原语操作的动作是:
(1) sem减1;(PS:这个动作只是做一次,在等待过程不可能是自己唤醒自己而再做检测的)
(2) 若sem减1后仍大于或等于零,则进程继续执行;
(3) 若sem减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转进程调度.
V原语操作的动作是:
(1) sem加1;
(2) 若相加结果大于零,则进程继续执行;
(3) 若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程,然后再返回原进程继续执行或转进程调度.(PS:在等于0的时候唤醒一个等待的进程,这是因为进程已经释放了资源,而这个资源将被另一个进程使用,由于P操作的前置减1的操作,等于0表示有资源可以被自己利用了。)
PV操作对于每一个进程来说,都只能进行一次,而且必须成对使用.在PV原语执行期间不允许有中断的发生.
用PV原语实现进程的互斥
由于用于互斥的信号量sem与所有的并发进程有关,所以称之为公有信号量.公有信号量的值反映了公有资源的数量.只要把临界区置于P(sem) 和V(sem)之间,即可实现进程间的互斥.就象火车中的每节车厢只有一个卫生间,该车厢的所有旅客共享这个公有资源:卫生间,所以旅客间必须互斥进入卫生间,只要把卫生间放在P(sem) 和V(sem)之间,就可以到达互斥的效果.以下例子说明进程的互斥实现.
例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; end; process B begin L2:P(s); 拣白子; V(s); goto L2; end; coend; end; |
判断进程间是否互斥,关键是看进程间是否共享某一公有资源,一个公有资源与一个信号量相对应.确定信号量的值是一个关键点,它代表了可用资源实体数.如下实例:
例2 某车站售票厅,任何时刻最多可容纳20名购票者进入,当售票厅中少于20名购票者时,厅外的购票者可立即进入,否则需要在外面等待.每个购票者可看成一个进程.
分析:第一步:确定进程间的关系.售票厅是各进程共享的公有资源,当售票厅中多于20名购票者时,厅外的购票者需要在外面等待.所以进程间是互斥的关系.第二步:确定信号量及其值.只有一个公有资源:售票厅,所以设置一个信号量s.售票厅最多容纳20个进程,即可用资源实体数为20,s的初值就设为20.
end |
|
|