PV介绍
-
P,V原语中P是荷兰语的Passeren,相当于英文的pass, V是荷兰语的Verhoog,相当于英文中的increment
-
信号量为一个整数,我们设这个信号量为:sem。 规定在sem大于等于零的时候代表可供并发进程使用的资源实体数,sem小于零的时候,表示正在等待使用临界区的进程的个数。 根据这个原则,在给信号量附初值的时候,我们显然就要设初值大于零
-
p操作和v操作是不可中断的程序段,称为原语。P,V操作对于每一个进程来说,都只能进行一次。而且必须成对使用
-
P原语操作的动作是 :
(1) sem减1;
(2) 若sem减1后仍大于或等于零,则进程继续执行;
(3) 若sem减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转进程调度。V原语操作的动作是 :
(1) sem加1;
(2) 若相加结果大于零,则进程继续执行;
(3) 若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程,然后再返回原进程继续执行或转进程调度。 -
PV过程
procedure p(var s:samephore); { s.value=s.value-1; if (s.value<0) asleep(s.queue); } procedure v(var s:samephore); { s.value=s.value+1; if (s.value<=0) wakeup(s.queue); } 其中用到两个标准过程: asleep(s.queue);执行此操作的进程控制块进入s.queue尾部,进程变成等待状态 wakeup(s.queue);将s.queue头进程唤醒插入就绪队列 对于这个过程,s.value初值为1时,用来实现进程的互斥。
-
进程互斥
把临界区置于P(sem) 和V(sem)之间。当一个进程想要进入临界区时,它必须先执行P原语操作以将信号量sem减1,在进程完成对临界区的操作后,它必须执行V原语操作以释放它所占用的临界区。从而就实现了进程的互斥:
-
进程同步
异步环境下的一组并发进程因直接制约而互相发送消息、进行互相合作、互相等待,使得各进程按一定的速度执行的过程称为进程间的同步。具有同步关系的一组并发进程称为合作进程。合作进程间互相发送的信号称为消息或事件。如果我们对一个消息或事件赋以唯一的消息名,则我们可用过程 wait (消息名) 表示进程等待合作进程发来的消息,而用过程 signal (消息名) 表示向合作进程发送消息。
-
信号量
信号量机制是一种有效的进程同步和互斥工具。信号量有整形信号量、记录型信号量、二进制信号量等。常用整型信号量实现PV操作。P操作表示申请一个资源,V操作表示释放一个资源
信号量以及PV操作的进一步理解
信号量机制与PV操作的理解