中国读者常常不明白这一同步机制为什么叫PV操作,原来这是狄克斯特拉用荷兰文定义的,因为在荷兰文中,通过叫passeren,释放叫vrijgeven,PV操作因此得名。这是在计算机术语中不是用英语表达的极少数的例子之一。信号量
信号量是最早出现的用来解决
进程同步
与互斥问题的机制,
包括一个称为信号量的
变量
及对它进行的两个
原语
操作。
信号量的概念
1.
信号量
的类型定义
信号量(semaphore)的
数据结构
为一个值和一个
指针
,指针指向等待该信号量的下一个
进程
。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变。
一般来说,信号量S>=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S的值加1;若S<0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。
2.PV
原语
PV操作是典型的同步机制之一。用一个信号量与一个消息联系起来,当信号量的值为0时,表示期望的消息尚未产生;当信号量的值非0时,表示期望的消息已经存在。用PV操作实现
进程同步
时,调用P操作测试消息是否到达,调用V操作发送消息。
对一个信号量
变量
可以进行两种原语操作:p操作和v操作,定义如下: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);执行此操作的进程的PCB进入s.queue尾部,进程变成等待状态
wakeup(s.queue);将s.queue头进程唤醒插入就绪
队列
s.value初值为1时,可以用来实现进程的互斥。
p操作和v操作是不可中断的
程序段
,称为原语。如果将信号量看作共享变量,则pv操作为其
临界区
,多个进程不能同时执行,一般用硬件
方法
保证。一个信号量只能置一次初值,以后只能对之进行p操作或v操作。
由此也可以看到,
信号量机制
必须有公共内存,不能用于
分布式操作系统
,这是它最大的弱点。