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

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

    概念

同步

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

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

   互斥

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

       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操作的一个很好的例子典型。这些例子都是我们生活中实实在在存在的,理解起来比较容易,也比较容易接受,软考之路,未完待续......

软考之路--从生活着手,看PV如何操作的更多相关文章

  1. 软考之路--从生活着手,看PV怎样操作

    PV操作.是软考其中一个非常重要的考点,一听到这个名词,顿时赶脚高大上有么有,在软考的历年试题中,也不乏PV操作的身影,老师也对PV操作进行了一次讲课,那时年少.听得稀里糊涂,也不是非常理解,在小编的 ...

  2. 软考之路--J2SE,从HelloWorld到传世代码

    "Hello World"程序指的是只在计算机屏幕上输出"Hello, World!"(意为"世界,你好!")这行字符串的计算机程序.hel ...

  3. 软考之路(四)---软件project一 概念模型,逻辑模型,物理模型

    自从接触到数据库到如今这三个概念大家理解的还有些不清楚,今天来为大家解答疑惑,共同提高,结合生活理解 概念模型        概念模型就是在了解了用户的需求,用户的业务领域工作情况以后,经过分析和总结 ...

  4. 软考历程(5)——extend 与 include

    软考中涉及扩展与包括关系的辨认,先不说考试的事,扩展与包括关系是UML中非经常见.非常基础的一种关系,然而我发现非常多同学都特别easy混淆,甚至软考真题中都存在题目和答案有待商榷的地方.此篇博客实属 ...

  5. 软考之J2SE

    特别感谢软考让我如今就接触了神奇的java.曾经尽管真不知道java是个神马,看完马士兵的视频发现里面的东西并不陌生.有vb,c++,c#做基础加上这次的J2SE发现原来编程语言有非常多同样的特性.也 ...

  6. 软考之PV操作(同步)

    这几天,陆续有那么三两个同学跟我讨论了一下关于软考上的PV操作的题,吾虽不才,但还是把同学们讲通了,在此,特分享一下自己的思路和想法,愿对大家有点帮助! 下面,我们就通过自己做过的试卷上两道题来分析: ...

  7. 备战“软考”之软件project

    说到"软件project"就有一种非常纠结的感觉!为什么呢?由于刚进入软考复习阶段,大家都把它放到了"比較"次要的地位,由于已经学过两遍,再加上它没有非常难理解 ...

  8. 软考下午题详解---uml图

    在上篇博客中,小编主要简单的对软考下午题当中的数据流图设计进行了一系列总结,今天我们继续来看软考下午题当中大题部分,uml图的相关知识,在我们学习的过程中,我们也已经接触过,西安交大刘惠老师讲解过um ...

  9. 软考计算机网络原理之IP计算问题汇总

    转自 http://www.cnblogs.com/jyh317/archive/2013/04/14/3018650.html 1.IP地址 分类: ①A类IP地址 ②B类IP地址 ③C类IP地址 ...

随机推荐

  1. windows下cmd中命令操作

    windows下cmd中命令:   cls清空 上下箭头进行命令历史命令切换 ------------------------------------------------------------- ...

  2. 打印n阶菱形

    #打印n阶菱形 def print_rhombus(n): #打印正三角 for i in range(1,n+1): x_num = 2*i-1 #每一层的*数量 space_num = n - i ...

  3. Linux c readdir是非线程安全,需用readdir_r,要注意用静态变量当做返回值的函数的非线程安全性

    readdir函数: struct dirent *readdir(DIR *dirp); The  data  returned by readdir() may be overwritten by ...

  4. FJUT寒假作业第三周数蚂蚁(记录第一道并查集)

    http://210.34.193.66:8080/vj/Contest.jsp?cid=162#P7 思路:用并查集合并集合,最后遍历,找到集合的根的个数. 并查集是森林,森林中的每一颗树是一个集合 ...

  5. python打造一个分析网站SQL注入的脚本

    前言: 昨天晚上其实就已经写完代码.只不过向FB投稿了,打算延迟一晚上在写博客 所有才到今天早上写.好了,接下来进入正题. 思路: 1.从网站源码中爬取那些类适于:http://xxx.com/xx. ...

  6. python 常用镜像

    pip镜像https://pypi.tuna.tsinghua.edu.cn/simplehttps://pypi.douban.io.com/simple pip install python-qt ...

  7. try_files 居然有这种用法

    try_files 参考:https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/ Use the tr ...

  8. Redis监控工具,命令和调优

    Redis监控工具,命令和调优 1.图形化监控 因为要对Redis做性能测试,发现了GitHub上有个python写的RedisLive监控工具评价不错.结果鼓捣了半天,最后发现其主页中引用了Goog ...

  9. 自定义Java注解的方式与应用

    注解的作用 Annotation(注解)是JDK 5.0引入的特性,它的基本作用就是修饰编程元素. 注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记.编译器.开发工具或其他程序可以用反射 ...

  10. java获取ip的方式,注意多级代理的方式获取

    public String getIP() { String clientIP = ServletActionContext.getRequest().getHeader("x-forwar ...