PV操作是利用火车信号灯(信号量 semaphore)提出的概念
P操作(荷兰文passeren,意为通过)
V操作(荷兰文vrijgeven,意为释放)
信号量s有一个关联的阻塞队列
P操作
- 1、对s进行减1
- 2、如果s>=0,则本进程继续执行
- 解释:因为是先减1,所以s_before=s+1,因为s>=0,所以s_before=s+1>=1,即之前存在至少1个可用的信号,所以本进程可以继续执行
- 3、如果s<0,则本进程加入阻塞队列
- 解释:因为是先减1,所以s_before=s+1,因为s<0,所以s_before=s+1<1,s_before=s+1<=0,即之前存在0个可用的信号,所以本进程需要阻塞,即加入阻塞队列
V操作
- 1、对s进行加1
- 2、如果s>0,则阻塞队列里没有进程,无需释放
- 解释:因为是先加1,所以s_before=s-1,因为s>0,所以s_before=s-1>-1,s_before=s-1>=0,即之前存在大于等于0个可用的信号,阻塞队列没有进程
- 2、如果s<=0,则释放1个阻塞队列里的进程
- 解释:因为是先加1,所以s_before=s-1,因为s<=0,所以s_before=s-1<=-1,即之前存在0个可用的信号,阻塞队列有>=1个任务,所以可以释放一个进程执行
总结:
- 如果s_before>0
- 可用信号s_before个,阻塞队列为空
- P操作的进程通过,V操作不释放
- 如果s_before=0
- 没有可用信号,阻塞队列为空
- P操作的进程阻塞,V操作不释放
- 如果s_before<0
- 没有可用信号,阻塞队列存在-s_before个进程
- P操作的进程阻塞,V操作释放1个阻塞的进程