天天看点

PV原语 稍微 详细点的表示方法

PV原语的边界条件写的太精简,所以我稍微详细点的表示。

PV原语

P原语:P是荷兰语Proberen(测试)的首字母。为阻塞原语,负责把当前进程由运行状态转换为阻塞状态,直到另一个进程唤醒它。具体操作为:申请一个空闲资源(把信号量减1),若成功,则退出;若失败,则该进程被阻塞。

V原语:V是荷兰语Verhogen(增加)的首字母。为唤醒原语,负责把一个被阻塞的进程唤醒,他有一个参数表,存放着等待被唤醒的进程信息。具体操作为:释放一个被占用的资源(把信号量加1),如果发现有被阻塞的进程,则选择一个唤醒。

表示方法

P(S):表示将信号量S的值减一,即S=S-1;如果S>=0,则该进程继续执行,否则该进程置为等待状态,排入等待队列(队列Q)。

V(S):表示将信号量S的值加一,即S=S+1;如果S>0,则该进程继续执行,否则释放队列(Q)中第一个等待信号量的进程。

我的稍微详细点表示方法

P(S):表示将信号量S的值减一,即S1= S; S2=S1-1;如果S2>=0,也就是S1>=1,说明有现成的资源直接可以用,不用等!,则该进程继续执行,否则(也就是S2<0变成负数)该进程置为等待状态,排入等待队列(队列Q)。

V(S):表示将信号量S的值加一,即S1=S; S2=S1+1;如果S2>0,也就是S1>-1也就是S1>=0,也就是说明V操作之前S1不是负数,说明根本不存在等待资源的进程,等待队列是空的!,则该进程继续执行,否则(也就是V操作之后释放了一个资源,又有至少一个正在等待资源的进程,那就去唤醒这个进程)释放队列(Q)中第一个等待信号量的进程。

继续阅读