P、V操作是由两个操作——P操作和V操作组成。这两个操作是两个不可中断的过程,它们在屏蔽中断的情况下连续执行。把不可中断的过程称作“原语”,于是P操作和V操作也可称为P操作原语和V操作原语,简称P、V操作。P\V操作是对信号量进行操作,它们的定义如下: · P操作P(S):将信号量S减去1,若结果小于0,则调用P(S)的进程被置成等待信号量S的状态。 · V操作V(S):将信号量S加1,若结果不大于0,则释放一个等待信号量S的进程。 P操作和V操作可表示成如下两个过程: procedure P (Var s: semaphore); begin s:=s-1; if s<0 then W(s) end;{p} procedure V(Var s:semaphore); begin s:=s+1; if s<=0 then R(S) end;{v} 其中,W(S)表示将调用过程的进程置成等待信号量S的状态;R(S)表示释放一个等待信号量S的进程,信号量S的初值为0或1或其他整数,它应在系统初始化时确定。
共享数据结构是: var barber,wait:semaphore;{初始值=0} entry:semaphore;{初始值=1} couter:integer; {初始值=0} 关于理发师的代码段: repeat p(barber); "share" until false; 关于顾客的代码段: p(entry); if count=n then exit; count:=count+1; if count>1 then begin v(eatry); p(wait); end else begin v(entry); v(barber); "share" p(entry); count:=count-1; if count>0 then v(wait); v(entry); end
设生产者消费者进程要设立的公用信箱B,假设现在信箱中放一封初始信件,表示物品已取走。 用进程通信管理生产者消费者问题的程序如下; begin : process producer : begin L1:produce a product; L2:receive (B,K) if {x中设有表示物品已取走} then go to L2; else begin {组织回信M}; '/M中含产品完成存放地点,产品说明,规格价格等 send(B,M); end; goto L1 end; process consumer begin L3:receive (B,Y); if{Y中表示产品已完成}then begin {按信件中地址取出物品}; {组织回信M}; '/回信中表示物品已取走,并反映对产品的评价和处理情况 send(B,M); goto L3 end; end; end;