信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV *** 作来改变。
一般来说,信号量S>=0时,S表示可用资源的数量。执行一次P *** 作意味着请求分配一个单位资源,因此S的值减1;
当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V *** 作意味着释放一个单位资源,因此S的值加1;
若S<=0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。
利用信号量和PV *** 作实现进程互斥的一般模型是:
进程P1 进程P2 …… 进程Pn
…… …… ……
P(S); P(S); P(S);
临界区; 临界区; 临界区;
V(S); V(S); V(S);
…… …… …… ……
其中信号量S用于互斥,初值为1。
使用PV *** 作实现进程互斥时应该注意的是:
(1)每个程序中用户实现互斥的P、V *** 作必须成对出现,先做P *** 作,进临界区,后做V *** 作,出临界区。若有多个分支,要认真检查其成对性。
(2)P、V *** 作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。
(3)互斥信号量的初值一般为1。
利用信号量和PV *** 作实现进程同步
PV *** 作是典型的同步机制之一。用一个信号量与一个消息联系起来,当信号量的值为0时,表示期望的消息尚未产生;当信号量的值非0时,表示期望的消息已经存在。用PV *** 作实现进程同步时,调用P *** 作测试消息是否到达,调用V *** 作发送消息。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)