【操作系统】 PV操作

    在我们学习操作系统的时候,PV操作这一块有一些晦涩难懂,在对PV操作展开说明之前,首先了解一下进程的基本状态和临界区之后,形成了感官的认识,对PV操作会比较容易理解,否则看起来就是每一个都懂,连起来不知道说的是什么,或者知道它是这么干的,但是不知道为什么这么做。



1.进程的三种基本状态?


    进程有三种状态,分别是:等待态、就绪态、运行态(具体转化如下图所示)

    等待态:等待某一事件

    就绪态:等待系统分配处理器以便运行

    运行态:正在占有处理器运行


  

   这个类比于生活中很像运动员从候选区(或者观众席)走到起跑线上然后进入跑道开始跑步。在候选区就是等待态,直到某一事件的发生(裁判叫他下来比赛),运动员走到起跑线上(也就是所谓的就绪态),等发令枪一响,运动员进入跑道跑步(进入运行态)




2.并发进程带来的错误


    现有两个小程序,分别实现的功能就是加1和减1,可用来自动计数,代码如下:

    


    简单来说,进程PIN和进程POUT都是三步,分别是:

      PIN :把count现在存的值给R1;R1自己加1赋值给自己;把R1的现值赋给count

      POUT:把count现在存的值给R2;R2自己减1赋值给自己;把R2的现值赋给count


    按顺序执行的结果是(设count初值为1):

      把count现在存的值给R1(count为1);R1自己加1赋值给自己(R1为2);把R1的现值赋给count(count为2)

      把count现在存的值给R2(count为2);R2自己减1赋值给自己(R2为1);把R2的现值赋给count(count为1)

      经过一加一减,结果还为1,正确


    按并发执行的结果是(设count初值为1):

      把count现在存的值给R1(count为1);→现在打断,开始执行POUT,POUT执行完后继续执行PIN

      把count现在存的值给R2(count为1);R2自己减1赋值给自己(R2为0);把R2的现值赋给count(count为0)

      R1自己加1赋值给自己(R1为2);把R1的现值赋给count(count为2)

      经过并发执行, 结果为2,错误



3.临界区和PV操作


    这时候可以引出一个概念,临界区:并发进程中与共享变量有关的程序段称为临界区

    正如上面提到的两个小程序段,它们共享变量count,所以这两个程序段就是临界区,也可以说处在临界区的代码就是上面所示的两小段代码。


 那么如何解决刚才的问题呢?

 这里可以通过对临界区的管理来解决问题:

    1.一次最多一个进程进入临界区;

    2.不能让一个进程无限制的临界区执行;

    3.不能强迫一个进程无限制的等待进入它的临界区


 PV操作就可以实现以上管理的要求,具体为:

    P操作→P(S):将信号量S减去1,若结果小于0,则把调用P操作的这个进程置成等待信号量S的状态

    V操作→V(S):将信号量S加1,若结果不大于0,则释放一个等待信号量S的进程



4.PV操作的实现


    简单来说,通过PV操作就可以保证临界区只有一个进程能够去运行,代码实现就是在进程的开始实现P操作,进程完成后实现V操作。

    用运动员的例子来说,如果两个运动员都在起跑线上,已经进入了就绪态,随时准备开跑进入到运行态,但是我们要求只能有一个运动员去跑。那么现在引入一个信号量S就可以实现,这里我们把S的值设为1。

    两个运动员在开跑之前先执行P操作,先执行完P操作员的运动员使信号量S变为0,没有小于0,所以欢快的去跑了,后执行P操作的运动员,发现S从0变为-1,只好去等待了。直到先跑的运动员跑完后执行V操作,让S从0变为1,另一个运动员才可以顺利的执行P操作。如此,通过PV操作即可实现每次一个进程的运行。

    其实PV操作的原理就是引入一个公共信号量,每个进程在执行前通过修改信号量后的结果来判断是否可以执行,当然,在允许执行的进程执行完之后要把信号改回来。




5.实例讲解


    如果说有n个资源,共有m个进程竞争,那么信号量S的变化范围是多少?答案是:[ n-m , n ]

    换个简单一点的问法......

    如果说有3个资源,共有10个进程竞争,那么信号量S变化范围是多少?答案是:[ -7 , 3 ]


    为什么是这样???

    一句话  →  信号量S就是说可以给你的资源数


    来个契合度很高的生活例子!!

    银行去过吧,我家附近那个每次都得先取号,然后按号叫人,值得一提的是窗口上有个大大的LED屏,显示着有几个人在等待啦 ~~~  对了,那里一共三个窗口,这时,10个人想办理业务。(资源-窗口,人-进程,大屏幕-S,很符合了吧)

    没人在窗口办理业务,屏幕:3个窗口可以办理;

    1人在窗口办理业务,屏幕:2个窗口可以办理;

    2人在窗口办理业务,屏幕:1个窗口可以办理;

    3人在窗口办理业务,屏幕:0个窗口可以办理;

    又来一个人取号,屏幕:1人在等待;

    .

    .

    .

   第十个人来了,屏幕:7人在等待;


OK,以上是P操作,来人都得取号,取号就相当于对屏幕上的信号减一,减成负数之后,就在等待区等着吧...

接下来,办完业务都得给工作人员评价,评价完成就可以走了,这里的评价就是对屏幕信号的V操作了,加1。


    1人办理完业务,屏幕:6人在等待(同时,那个人会招呼等待区的一个人去办理)

    以后类似,只是想说,取号就是P操作,对屏幕的信号进行P操作,成了负数,你就等着,直到办理完业务做那个评价,也就是V操作,把屏幕信号加1,同时,召唤等待区的人去办理。



写在最后的话


    当然PV操作不仅可以用于进程的互斥,同时也可以用于进程之间的同步,也可以引入多个信号量。

    涉及到PV操作的代码,只要看看执行完P操作或者V操作之后的具体信号量是多少,随时关注信号的变化,就可以很好的理解程序了。

    总之,PV操作的原理很简单,运用到代码中可以实现不同的功能。



评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值