码迷,mamicode.com
首页 > 其他好文 > 详细

软考复习——PV操作

时间:2014-10-07 17:55:09      阅读:364      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   使用   ar   strong   sp   div   2014   



   

    在操作系统中,进程之间经常会存在互斥(都需要共享独占性资源时)和同步(完成异步的两个进程的协作)两种关系。而信号量和PV操作完美有效的处理了这两种情况。

 

    互斥:就好比过独木桥,一次只能执行一个进程。

    同步:好比一个人骑车一个人步行,双方协作完成一件事情,速度快的每过一段时间就停下来等等速度慢的


    信号量是一种特殊的变量,表现形式是一个整型S和一个队列,根据控制对象的不同被赋予不同的值。分为以下两类:

    1,公用信号量。实现进程间的互斥,初值为1或资源的数目,

    2,私用信号量。实现进程间的同步,初值为0或某个正整数。

 

        S的物理意义:S>=0表示某资源的可用数,若S<0,则其绝对值表示阻塞队列中等待该资源的进程数。

 

         P操作:也称为down()wait()操作,使S=S-1,若S<0,进程暂停执行,放入信号量的等待队列。表示申请一个资源。

 

        V操作:也称为up()signal()操作,使S=S+1,S<=0,唤醒等待队列中的一个进程。表示释放一个资源。

 

利用PV操作实现进程的互斥


    令信号量S的初值为1,当进入临界区时执行P操作,退出临界区时执行V操作。这样,利用PV操作实现进程互斥的代码如下:

P(S)

   临界区

V(S)

 

利用PV操作实现进程的同步


    令信号量S的初值为0,进程A在进程B到达L2以前,不应前进到超过点L1

             进程A                       进程B

                                       

L1:P(S)                       L2: V(S)

                                   


    当进程A先执行到L1时,执行完P操作后,信号量S=S-1<0,停止执行。直到进程B执行到L2时,信号量S=S+1=1,唤醒进程A继续执行。达到了同步的目的。

 


最后通过一个实例分析来巩固一下


    例如,某仓库有一名保管员,该仓库可存放n箱零件。现有m名工人,只要仓库空闲,工人即可将生产好的零件放入仓库,并由保管员登记入库数量;另外有k名销售员,只要仓库的零件数满足顾客要求,便可提货并由保管员登记出库数量。

   规定:工人和销售员不能同时进入仓库,但是工人和工人,销售员和销售员可以同时进入仓库。设置信号量S1,初值为n,表示仓库空闲位置数;信号量S2,初值为0,表示仓库中零件箱数;信号量S3,初值为1,用于实现对保管员的互斥访问。则其管理系统流程图如下:

       

      bubuko.com,布布扣


    对于工人进程,首先执行P(S1)申请资源,看仓库中是否有空闲位置。若有,则将零件送入仓库,然后执行V(S2)表明仓库中已经有一箱零件,唤醒销售员进程,告知销售员可以提货了。然后执行PS3)申请资源,看是否有保管员空闲,若有,则登记入库数,然后执行VS3)释放保管员资源,使保管员处于空闲状态。


    对销售员进程,首先执行P(S2)申请资源,看仓库是否有货物,若有,进入仓库提货,然后执行V(S1)释放资源,使仓库空闲出一个位置,告知工人进程可以放置货物了,然后执行P(S3)申请资源,看是否有保管员空闲,若有,则登记出库数,然后执行VS3)释放保管员资源,使保管员处于空闲状态。

 

    通过上述实例可知,在现实生活中互斥和同步都是同时存在的,两者相辅相成。

 

    关于PV操作,相对来讲在软考的复习内容中是比较生疏的一部分,了解了它是什么,为什么使用它,它有什么优点以后,剩下的就是通过多多的实践练习来加深对理论的理解和吸收了。

 



软考复习——PV操作

标签:style   blog   http   使用   ar   strong   sp   div   2014   

原文地址:http://blog.csdn.net/u010773667/article/details/39854227

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!