应用
实现进程的同步
要实现进程的同步就必须提供一种机制,该机制能把其他进程需要的消息发送出去,也能测试自己需要的消息是否到达。把能实现进程同步的机制称为同步机制。不同的同步机制实现同步的方法也不同。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。
(2)用PV操作表示对S临界区的申请和释放。在进入临界区之前,通过P操作进行申请,在退出临界区之后,通过V操作释放。
注意事项
1、使用PV操作实现进程互斥时应该注意的是:
⑴每个程序中用户实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。
⑵P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。
⑶互斥信号量的初值一般为1。
2、使用PV操作实现进程同步时应该注意的是:
⑴分析进程间的制约关系,确定信号量种类。在保持进程间有正确的同步关系情况下,哪个进程先执行,哪些进程后执行,彼此间通过什么资源(信号量)进行协调,从而明确要设置哪些信号量。
⑵信号量的初值与相应资源的数量有关,也与P、V操作在程序代码中出现的位置有关。
⑶同一信号量的P、V操作要成对出现,但它们分别在不同的进程代码中。