zoukankan      html  css  js  c++  java
  • 软考之路--从生活着手,看PV怎样操作

           PV操作。是软考其中一个非常重要的考点,一听到这个名词,顿时赶脚高大上有么有,在软考的历年试题中,也不乏PV操作的身影,老师也对PV操作进行了一次讲课,那时年少。听得稀里糊涂,也不是非常理解,在小编的理解其中,PV操作与信号量的处理相关。P表示通过的意思,V表示释放的意思。做过几套软考试题,看过软考视频,对PV操作有了一点傻傻的理解,PV操作属于操作系统方面的知识,在前面的博文中,小编介绍过进程存储,这篇博文。小编主要和大家来学习一下PV操作的相关知识,小编会循着以下这张图的脉络,一一介绍,首先,我们来看一下总体的有关PV操作知识点的框架。

           

          接下来。小编就沿着上图的痕迹,对PV操作进行一一解剖,有不允许见的小伙伴欢迎讨论交流。

          概念

          同步

          关于同步,小编理解的意思是“协同合作。齐心协力”。换句话说就是我们的目标仅仅有一个。大家的目标都一致,就是在大家的努力下共同完毕某一件事情。看以下一张图:

           

           我们来简单分析一下这张图,A仓库有一些货物,然后我们须要把A仓库的货物搬运到B仓库,由搬运工甲和搬运工乙来完毕这个任务;那么他们的目标就仅仅有一个。就是把货物从A仓库搬到B仓库去,共同奔着这个方向去努力,这是一个典型的同步问题。


           相互排斥

            古语中有句话,能非常好的表达出相互排斥的概念--千军万马过独木桥。非常easy的一句话,把相互排斥的概念表达的淋漓尽致,就好比有一个大部队来到独木桥边,想要走过独木桥。首先要做的工作就是排好队。一个一个来。挨个走过独木桥。另一个非常好的样例能够说明相互排斥的概念,比方打印机,打印机这个工具就非常好的体现了相互排斥的概念,比方,前阵日子,大家自考。各种打印真题。打印知识点。假设你去打印的时候,已经有人正在使用打印机,那么你须要做的就是静静的等待,这也是生活中一个能非常好说明相互排斥概念的样例。在相互排斥中,还有两个重要的概念,临界资源和临界区,临界资源就是我们上文提到过的相互排斥,各个进程间须要相互排斥方式对其进行共享资源,如打印机。临界区就是进程訪问临界资源的那段代码。


            P?

    V? PV?

            P操作:使S=S-1。若S>=0,则该进程继续运行,否则该进程排入等待队列。
            V操作:使S=S+1,若S>0,唤醒等待队列中的一个进程。
            PV操作:解决相互排斥和同步的问题。这样理解起来,非常费解。也不知道是怎么个意思。我们还是从生活着手,看看PV是怎样操作。

           

            生活中的PV操作

            生产者--消费者问题

            首先我们来看以下一张图

             

            这是一个著名的同步问题。尽管生产者进程和消费者进程都是异步方式执行的,但它们之间必须保持同步,即不同意消费者进程到一个空缓冲区去取产品。也不同意生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。这是一个单缓冲区情况。那么这个单缓冲区的PV操作,应该是如何的呢?我们来看看:

           

          我们来分析一下这个流程,前提是S1初值为1,S2初值为0。我们须要明确P操作减1,V操作加1,然后这个分析就变得没有那么困难了,我们先对初值进行一下说明:

           a、我们把S1的初值设为1:是说明缓冲区另一个空间能够使用,对于生产者而言。每个缓冲区的一个空间就是一个资源,也就是说,一開始执行的时候,就同意生产者投放一个产品到缓冲区。

           b、然后投放到缓冲区之后,我们来看消费者进程。P(S2):首先我们要进程一个推断。推断缓冲区中是否有产品,对消费者而言,缓冲区中有产品,就代表有一个资源能够使用。可是最初状态那个缓冲区中是没有资源的。所以S2的初值应该是为0。我们刚才都提到了资源的问题,就是信号量的一个值应该是表示资源的数量,可是就消费者和生产者而言,对于他们的资源是不同的,概念是不同的,生产者:缓冲区有多少个空格,就有多少个资源。而对消费者来说。缓冲区有多少个满的格。就有多少个资源。是刚好是相反,所以当消费者从缓冲区取出一个产品之后。对于生产者而已。就多了一个资源。

           关于这个进程。我们能够这样来理解:
           1、生产者:P(S1),那么P(S1)。S1=S1-1。得到P(S1=0)这个进程还能进行,那么生产者把一个产品投放到缓冲区。


           2、V(S2)。S2=S2+1,S2初值为0。所以S2=S2+1>0,那么就激活了P(S2)。那么消费者就能取出一个产品。
           3、消费产品:消费产品之前。另一个V(S1),就激活了P(S1),让生产者继续投放产品到缓冲区。这是单缓冲区分析。
          
            我们接下来看一个相对来说,有点复杂一点点的--多缓冲区的PV操作,对照我们的单缓冲区的PV操作,我们还是来分析生产者和消费者的问题:
            

            相应的PV操作例如以下图

            

            有一点差别,就是要引用相互排斥的概念,由于缓冲区是一个临界资源。它始终仅仅能有一个进程对其进行操作。所以我们就能够用一个相互排斥信号量来完毕这一点,所以当某一个进程要使用到缓冲区之前。我们就进行下面推断,推断这个缓冲区如今是不是空暇呢?是不是有生产者或者消费者的进程在使用这个这个缓冲区呢?假设有,mute的初值为1,当有人使用这个缓冲区的时候,这个mute的值就由1变为0,这时,第二个进程向再来操作这个缓冲区,就不可能了,就会被堵塞。

            公交车司机与售票员的问题:

             

            我们来分析这个过程。我们把S1和S2的初值都设为0。我们来分析分析:
            1、P(S1):S1=S1-1=-1,那么司机进程就被暂停。等会售票员进程,售票员关车门。


            2、V(S1):S1=S1+1=0,激活了司机进程,那么司机就開始启动车辆、正常行驶、到站停车,当然售票员也 有可能同一时候在售票。
            3、P(S2):S2=S2-1,售票员在售票之后的进程就被暂停。等待司机进程。这样就避免了售票员售票之后就开车门了。

    由于这是不同意的。
            4、V(S2):S2=S2+1,司机到站停车之后,就激活了售票员P(S2)的进程,那么售票员就进程 开车门、上下客的操作。那么这个进程就完毕了。

           小编寄语:该博文小编主要浅显的讲述了一下PV操作的有关知识,分别三个方面对PV操作进行相关阐述,首先是概念。包含同步和相互排斥的概念,其次是什么是PV操作。最后。从生活入手,解说了两个PV操作的样例,生产者消费者问题和公交车司机和售票员的问题。另一个样例就是上次米老师上课提到的12306售票系统和顾客之间的关系。也是PV操作的一个非常好的样例典型。

    这些样例都是我们生活中实实在在存在的。理解起来比較easy。也比較easy接受,软考之路,未完待续......

  • 相关阅读:
    zabbix3.4报警队列过多清理
    k8s安装nexus并导入第三方jar包
    kubeadmin安装最新版本的kubenets
    aws相关知识
    mysql忘记root密码做法
    mysql实现读写分离(proxy)与高可用(MGR)
    jvm调优
    zabbix监控php-fpm的性能
    脚本
    opencv demo
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7071341.html
Copyright © 2011-2022 走看看