您的位置:首页 > 其它

PV操作与信号灯的处理相关,P表示通过的意思,V表示释放的意思

2012-10-14 16:54 344 查看
中国读者常常不明白这一同步机制为什么叫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操作。

  由此也可以看到,信号量机制必须有公共内存,不能用于分布式操作系统,这是它最大的弱点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: