PV操作(操作系统)

在操作系统中,进程之间经常会存在互斥(都需要共享独占性资源时) 和同步(完成异步的两个进程的协作)两种关系.为了有效的处理这两种情况,狄克斯特拉(W.Dijkstra)在1965年提出信号量 (semaphore)和PV操作.

PV操作是一种实现进程互斥与同步的有效方法。PV操作与信号量的处理相关,P表示通过的意思,V表示释放的意思。

PV操作是典型的同步机制之一。用一个信号量与一个消息联系起来,当信号量的值为0时,表示期望的消息尚未产生;当信号量的值非0时,表示期望的消息已经存在。用PV操作实现进程同步时,调用P操作测试消息是否到达,调用V操作发送消息。

原理

用PV操作来管理共享资源时,首先要确保PV操作自身执行的正确性。由于P(S)和V(S)都是在同一个信号量S上操作,为了使得它们在执行时不发生因交叉访问信号量S而可能出现的错误,约定P(S)和V(S)必须是两个不可被中断的过程,即让它们在屏蔽中断下执行。把不可被中断的过程称为原语。于是,P操作和V操作实际上应该是P操作原语和V操作原语。

P操作的主要动作是:
①S减1;
②若S减1后仍大于或等于0,则进程继续执行;
③若S减1后小于0,则该进程被阻塞后放入等待该信号量的等待队列中,然后转进程调度。

V操作的主要动作是:
①S加1;
②若相加后结果大于0,则进程继续执行;
③若相加后结果小于或等于0,则从该信号的等待队列中释放一个等待进程,然后再返回原进程继续执行或转进程调度。

PV操作对于每一个进程来说,都只能进行一次,而且必须成对使用。在PV原语执行期间不允许有中断发生。原语不能被中断执行,因为原语对变量的操作过程如果被打断,可能会去运行另一个对同一变量的操作过程,从而出现临界段问题。如果能够找到一种解决临界段问题的元方法,就可以实现对共享变量操作的原子性。

应用

实现进程的同步

要实现进程的同步就必须提供一种机制,该机制能把其他进程需要的消息发送出去,也能测试自己需要的消息是否到达。把能实现进程同步的机制称为同步机制。不同的同步机制实现同步的方法也不同。PV操作和管程是两种典型的同步机制。在这里,只介绍怎样用PV操作实现进程间的同步。

我们已经知道怎样用PV操作来实现进程的互斥。事实上,PV操作不仅是实现进程互斥的有效工具,而且还是一个简单而方便的同步工具。用一个信号量与一个消息联系起来,信号量的值为0表示期望的消息尚未产生;信号量的值为非0表示期望的消息已经存在。假定用信号量S表示某个消息,现在来看看怎样用PV操作达到进程同步的目的。
(1)调用P操作测试消息是否到达
任何进程调用P操作可测试到自己所期望的消息是否已经到达。若消息尚未产生,则S=0,调用P(s)后,P(S)一定让调用者成为等待信号量S的状态,即调用者此时必定等待直到消息到达;若消息已经存在,则S≠0,调用P(S)后,进程不会成为等待状态而可继续执行,即进程测试到自己期望的消息已经存在。
(2)调用V操作发送消息
任何进程要向其他进程发送消息时可调用V操作。若调用V操作之前S=0,表示消息尚未产生且无等待消息的进程,则调用V(S)后,V(s)执行S:=S+1使S≠0,即意味着消息已存在;若调用V操作之前S<0,表示消息未产生前已有进程在等待消息,则调用V(S)后将释放一个等待消息者,即表示该进程等待的消息已经到达,可以继续执行。
在用PV操作实现同步时,一定要根据具体的问题来定义信号量和调用P操作或V操作。一个信号量与一个消息联系在一起,当有多个消息时必须定义多个信号量;测试不同的消息是否到达或发送不同的消息时,应对不同的信号量调用P操作或V操作。

实现进程互斥

用PV操作可实现并发进程的互斥,其步骤如下。
(1)设立一个互斥信号量S,表示临界区,其取值为1,0,-1,…其中,S=1表示无并发进程进入S临界区;S=0表示已有一个并发进程进入了S临界区;S等于负数表示已有一个并发进程进入S临界区,且有|S|个进程等待进入S临界区,S的初值为1。 [1]
(2)用PV操作表示对S临界区的申请和释放。在进入临界区之前,通过P操作进行申请,在退出临界区之后,通过V操作释放。

进程通常分为就绪、运行和阻塞三种工作状态。

三种状态在某些条件下可以转换,具体转换关系如下:
在这里插入图片描述

进程三个状态之间的转换是通过PV操作和信号量来控制的,其中信号量起到了很重要的作用。

备注

中国读者常常不明白这一同步机制为什么叫PV操作,原来这是狄克斯特拉用荷兰文定义的,因为在荷兰文中,通过叫passeren,释放叫vrijgeven,PV操作因此得名。这是在计算机术语中不是用英语表达的极少数的例子之一。

这篇文章也很好:

https://blog.csdn.net/wuxy720/article/details/78936912

发布了131 篇原创文章 · 获赞 44 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_38769551/article/details/105019151