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


中国读者常常不明白这一同步机制为什么叫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操作。
  由此也可以看到, 信号量机制 必须有公共内存,不能用于 分布式操作系统 ,这是它最大的弱点。

你可能感兴趣的:(多线程)