热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

软考之路--从生活着手,看PV如何操作

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

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


推荐阅读
  • 本文回顾了3.21开学以来的学习情况,包括javaWeb课程的迷糊感和未预习导致的不知所措,以及对VOJ题目的归类和解答。午饭前完成了阶乘相关的两道题目。下午的数据结构课听懂了队列的讲解,但有几个疑问未能及时复习。设计模式课程因预习效率低而感到困惑,同时也没搞清楚下节课的内容。晚上去图书馆学习。通过反思和总结,对自己的学习收获有了更深刻的认识。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文介绍了栈和队列的区别及其特点。栈是一种先进后出的线性表,只能在表的一端进行插入和删除操作;队列是一种先进先出的线性表,只能在表的一端进行插入和在另一端进行删除操作。栈和队列是两种广泛使用的线性数据结构,它们的基本操作具有特殊性。栈的遍历需要遍历整个栈才能取出数据,并需要为数据开辟临时空间,而队列基于地址指针进行遍历,可以从头或尾部开始遍历,但不能同时遍历,且无需开辟临时空间。栈和队列在程序设计中具有重要应用。 ... [详细]
  • Linux的uucico命令使用方法及工作模式介绍
    本文介绍了Linux的uucico命令的使用方法和工作模式,包括主动模式和附属模式。uucico是用来处理uucp或uux送到队列的文件传输工具,具有操作简单快捷、实用性强的特点。文章还介绍了uucico命令的参数及其说明,包括-c或--quiet、-C或--ifwork、-D或--nodetach、-e或--loop、-f或--force、-i或--stdin、-I--config、-l或--prompt等。通过本文的学习,读者可以更好地掌握Linux的uucico命令的使用方法。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 一、什么是闭包?有什么作用什么是闭包闭包是定义在一个函数内部的函数,它可以访问父级函数的内部变量。当一个闭包被创建时,会关联一个作用域—— ... [详细]
  • 本文讨论了读书的目的以及学习算法的重要性,并介绍了两个算法:除法速算和约瑟夫环的数学算法。同时,通过具体的例子和推理,解释了为什么x=x+k序列中的第一个人的位置为k,以及序列2和序列3的关系。通过学习算法,可以提高思维能力和解决问题的能力。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
author-avatar
大眼妹PS珺珺
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有