zoukankan      html  css  js  c++  java
  • OS__信号量(semaphore)PV操作

    信号量的概念

    1.信号量的类型定义
    信号量(semaphore)的数据结构为记录型数据结构一个值和一个指针指针指向等待该信号量的下一个进程信号量的值与相应资源的使用情况有关,在操作系统中,信号量用以表示物理资源的实体,它是一个与队列有关的整型变量。。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变
    一般来说,信号量S>=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S<0时,表示已经没有可用资源,请求者必须等待(asleep)别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S的值加1;若S<0,表示有某些进程正在等待该资源,因此要唤醒(wakeup)一个等待状态的进程,使之运行下去。
    2.PV原语
    PV操作是典型的同步机制之一。用一个信号量与一个消 息联系起来,当信 号量的值为0时,表示期 望的消息尚未产生;当信号 量的值非0时,表示期望的消息已经存在。用P V操作实现进程同步时,调用P操作测试消息是否到达,调用V操作发送消息原语是操作系统中执行时不可中断的过程、即原子操作(atomicoperation)。Dijkstra 发明了两个信号量操作原语:P 操作和V 操作(荷兰语中“测试(Proberen)”和“增量(Verhogen)”的头字母),此外,还常用的符号有:wait 和signal;up 和down;sleep 和wakeup 等
    对一个信号量变量可以进行两种原语操作: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操作。
    由此也可以看到,信号量机制必须有公共内存,不能用于分布式操作系统,这是它最大的弱点。
    V原语的主要操作是:
    ⑴sem加1;
    ⑵若相加结果大于零,则进程继续执行;
    ⑶若相加结果小于或等于零,则唤醒一阻塞在该信号量上的进程,然后再返回原进程继续执行或转进程调度
    利用信号量和PV操作实现进程互斥的一般模型是:
    进程P1 进程P2 …… 进程Pn
    ……  ……  ……
    P(S);  P(S);  P(S);
    临界区;  临界区;  临界区;
    V(S);  V(S);  V(S);
    ……  ……  …… ……
    其中信号量S用于互斥,初值为1。
    使用PV操作实现进程互斥时应该注意的是:
    ⑴每个程序中用户实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。
    ⑵P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。
    ⑶互斥信号量的初值一般为1。
    利用信号量和PV操作实现进程同步:
    PV操作是典型的同步机制之一。用一个信号量与一个消息联系起来,当信号量的值为0时,表示期望的消息尚未产生;当信号量的值非0时,表示期望的消息已经存在。用PV操作实现进程同步时,调用P操作测试消息是否到达,调用V操作发送消息。
    使用PV操作实现进程同步时应该注意的是:
    ⑴分析进程间的制约关系,确定信号量种类。在保持进程间有正确的同步关系情况下,哪个进程先执行,哪些进程后执行,彼此间通过什么资源(信号量)进行协调,从而明确要设置哪些信号量。
    信号量的初值与相应资源的数量有关,也与P、V操作在程序代码中出现的位置有关。
    ⑶同一信号量的P、V操作要成对出现,但它们分别在不同的进程代码中。

    典型理解偏差

    三个问题:
    一,以V原语的1、2步来做,Sem不就永远大于0,那进程不就一直循环执行成为死循环了?
    二,Sem大于0那就表示有临界资源可供使用,为什么不唤醒进程
    三,Sem小于0应该是说没有临界资源可供使用,为什么还要唤醒进程
    析疑:
    一,P操作对sem减1的。P、V原语必须成对使用!从而不会造成死循环。
    二,Sem大于0的确表示有临界资源可供使用,而且这个时候没有进程被阻塞在这个资源上,也就是说没有进程因为得不到这类资源而阻塞,所以没有被阻塞的进程,自然不需要唤醒。
    三,V原语操作的本质在于:一个进程使用完临界资源后,释放临界资源,使Sem加1,以通知其它的进程,这个时候如果Sem<0,表明有进程阻塞在该类资源上,因此要从阻塞队列里唤醒一个进程来“转手”该类资源。比如,有两个某类资源,四个进程A、B、C、D要用该类资源,最开始Sem=2,当A进入,Sem=1,当B进入Sem=0,表明该类资源刚好用完, 当C进入时Sem=-1,表明有一个进程被阻塞了,D进入,Sem=-2。当A用完该类资源时,进行V操作,Sem=-1,释放该类资源,而这时Sem<0,表明有进程阻塞在该类资源上,于是唤醒一个。
    为了进一步加深理解,再引入二个问题:
    四,如果是互斥信号量的话,应该设置信号量Sem=1,但是当有5个进程都访问的话,最后在该信号量的链表里会有4个在等待,也是说S=-4,那么第一个进程执行了V操作使S加1,释放了资源,下一个应该能够执行,但唤醒的这个进程在执行P操作时因S〈0,也还是执行不了,这是怎么回事呢?
    五,Sem的绝对值表示等待的进程数,同时又表示临界资源,这到底是怎么回事?
    析疑:
    四,当一个进程阻塞了的时候,它已经执行过了P操作,并卡在临界区那个地方。当唤醒它时就立即进入它自己的临界区,并不需要执行P操作了,当执行完了临界区的程序后,就执行V操作。
    五,当信号量Sem小于0时,其绝对值表示系统中因请求该类资源而被阻塞的进程数目.S大于0时表示可用的临界资源数。注意在不同情况下所表达的含义不一样。当等于0时,表示刚好用完。
  • 相关阅读:
    smart client优势在那里? (草稿)
    MSN to expand free email storage to 250MB
    转移阵地了,新地址:http://spaces.msn.com/members/PuGong
    关于XMLHTTP object的OPEN方法
    创建第一个Windows Phone应用程序(一)
    Windows 平台下安装Cygwin后,sshd服务无法启动
    ASP.NET MVC3 Use Remote Validation
    ASP.NET MVC3中使用AllowHtml attribute
    HTML5 Canvas实现简单的俄罗斯方块
    创建第一个Windows Phone应用程序(二)
  • 原文地址:https://www.cnblogs.com/graceting/p/3677758.html
Copyright © 2011-2022 走看看