首页>计算机>软件水平考试>复习指导>正文
PV操作释疑

www.zige365.com 2010-8-2 18:06:06 点击:发送给好友 和学友门交流一下 收藏到我的会员中心
    信号量
  信号量是最早出现的用来解决进程同步与互斥问题的机制,
  包括一个称为信号量的变量及对它进行的两个原语操作。
  一. 信号量的概念
  1.信号量的类型定义
  每个信号量至少须记录两个信息:信号量的值和等待该信号量的进程队列。它的类型定义如下:(用类PASCAL语言表述)
  semaphore = record
  value: integer;
  queue: ^PCB;
  end;
  其中PCB是进程控制块,是操作系统为每个进程建立的数据结构。
  s.value%26gt;=0时,s.queue为空;
  s.value%26lt;0时,s.value的绝对值为s.queue中等待进程的个数;
  2.PV原语
  对一个信号量变量可以进行两种原语操作:p操作和v操作,定义如下: procedure p(var s:samephore);
  {
  s.value=s.value-1;
  if (s.value%26lt;0) asleep(s.queue);
  }
  procedure v(var s:samephore);
  {
  s.value=s.value+1;
  if (s.value%26lt;=0) wakeup(s.queue);
  }
  其中用到两个标准过程:
  asleep(s.queue);执行此操作的进程的PCB进入s.queue尾部,进程变成等待状态
  wakeup(s.queue);将s.queue头进程唤醒插入就绪队列
  s.value初值为1时,可以用来实现进程的互斥。
  p操作和v操作是不可中断的程序段,称为原语。如果将信号量看作共享变量,则pv操作为其临界区,多个进程不能同时执行,一般用硬件方法保证。一个信号量只能置一次初值,以后只能对之进行p操作或v操作。
  由此也可以看到,信号量机制必须有公共内存,不能用于分布式操作系统,这是它最大的弱点。
  V原语的主要操作是:
  (1)sem加1;
  (2)若相加结果大于零,则进程继续执行;
  (3)若相加结果小于或等于零,则唤醒一阻塞在该信号量上的进程,然后再返回原进程继续执行或转进程调度。
  典型理解偏差:
  一,以V原语的1、2步来做,Sem不就永远大于0,那进程不就一直循环执行成为死循环了?
  二,Sem大于0那就表示有临界资源可供使用,为什么不唤醒进程?
  三,Sem小于0应该是说没有临界资源可供使用,为什么还要唤醒进程?
  析疑: 一,P操作对sem减1的。P、V原语必须成对使用!从而不会造成死循环。 二,Sem大于0的确表示有临界资源可供使用,而且这个时候没有进程被阻塞在这个资源上,也就是说没有进程因为得不到这类资源而阻塞,所以没有被阻塞的进程,自然不需要唤醒。 三,V原语操作的本质在于:一个进程使用完临界资源后,释放临界资源,使Sem加1,以通知其它的进程,这个时候如果Sem%26lt;0,表明有进程阻塞在该类资源上,因此要从阻塞队列里唤醒一个进程来“转手”该类资源。 比如,有2个某类资源,三个进程A、B、C、D要用该类资源,最开始Sem=2,当A进入,Sem=1,当B进入Sem=0,表明该类资源刚好用完, 当C进入时Sem=-1,表明有一个进程被阻塞了,D进入,Sem=-2。当A用完该类资源时,进行V操作,Sem=-1,释放该类资源,而这时Sem%26lt;0,表明有进程阻塞在该类资源上,于是唤醒一个。
  为了进一步加深理解,再引入二个问题: 四,如果是互斥信号量的话,应该设置信号量Sen=1,但是当有5个进程都访问的话,最后在该信号量的链表里会有4个在等待,也是说S=-4,那么第一个进程执行了V操作使S加1,释放了资源,下一个应该能够执行,但唤醒的这个进程在执行P操作时因S〈0 ,也还是执行不了,这是怎么回事呢? 五,Sem的绝对值表示等待的进程数,同时又表示临界资源,这到底是怎么回事? 析疑: 四,当一个进程阻塞了的时候,它已经执行过了P操作,并卡在临界区那个地方。当唤醒它时就立即进入它自己的临界区,并不需要执行P操作了,当执行完了临界区的程序后,就执行V操作。 五,当信号量Sem小于0时,其绝对值表示系统中因请求该类资源而被阻塞的进程数目.S大于0时表示可用的临界资源数。注意在不同情况下所表达的含义不一样。当等于0时,表示刚好用完。
我要投稿 新闻来源: 编辑: 作者:
相关新闻