PV操作:PV操作由P操作原语和V操作原语组成<br>(原语也叫原子操作Atomic Operation,是不<br>可中断的过程,对信号量进行操作。<br>
P(S):<br>1:将信号量S的值减1,即S=S-1;<br>2:如果S>=0,则该进程继续执行;<br>否则该进程置为等待状态。
V(S):<br>1:将信号量S的值加1,即S=S+1;<br>2:该进程继续执行;如果该信号的<br>等待队列中有等待进程就唤醒等待进程。
PV操作解决互斥问题:
设信号量为S,初值为1<br>PV操作如下:<br>进程P1: 进程P2 <br>{ {<br> P(S); P(S);<br> 访问资源; 访问资源;<br> V(S); V(S);<br>} }<br>
PV操作解决同步问题:<br>
设两个信号量:S生,S消。<br>初值为S生=1(代表仓库是否为空,只有仓库为空,生产者才能往里面放物品)<br>S消=0(代表仓库是否为满,只有仓库是满的,消费者才能从里面取物品)<br>PV操作如下:<br>生产者: 消费者:<br>while(true) while(true)<br>{ {<br> 生产一个产品; P(S消);//判断仓库是否为满<br> P(S生);//判断仓库是否为空 取走物品;<br> 产品送入仓库; V(S生);//通知生产者仓库已空<br> V(S消);//通知消费者仓库已满 消费者使用物品;<br>} }<br>
PV操作解决互斥加同步问题:
注意:在使用PV操
作之前,首先要分清<br>哪些是互斥问题(互斥访问临
界资源),<br>哪些是同步问题(具有前后执行顺序要求).
如何定义信号领的个数以及初值:
互斥问题:互斥问题要设互斥信号量,<br>不管有互斥关系的进程有几个和几类,<br>通常只设置一个信号量,且初值为1,<br>代表一次只允许一个进程对临界资源<br>访问。例外:当资源的种类有多种,<br>信号量的个数是由资源类数决定的,<br>初值由资源个数决定。
同步问题:同步问题要设同步信号量,<br>通常同步信号量的个数与参与同步的<br>种类有关,即同步关系涉及几类进程<br>,就有几个信号量。同步信号量表示<br>该进程是否可以开始或该进程是否已<br>经结束。<br>