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

软考之PV操作

软考期间,日子有些千篇一律,这时候不免有一些小小的“困扰”让我们抖擞抖擞精神了。PV操作不仅仅是我们软考的一个难点,在我们的操作系统的自考中更是一大大题之重。下面让我们来一起揭开它神秘的面纱。

    软考期间,日子有些千篇一律,这时候不免有一些小小的“困扰”让我们抖擞抖擞精神了。PV操作不仅仅是我们软考的一个难点,在我们的操作系统的自考中更是一大大题之重。下面让我们来一起揭开它神秘的面纱。

    我们对于P、V的含义肯定不陌生。

    P(S):①将信号量S的值减1,即S=S-1;
           ②如果S>=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
    V(S):①将信号量S的值加1,即S=S+1;
           ②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。

   概念理解的再透彻,也不过是纸上谈兵。

:看一道我们在软考中经常遇到的题,每次都束手无策的那道。



P操作,我们可以看作是获得或者请求、消耗一个信号量。

V操作,我们可以看作是释放或者发送一个信号量。


我们可以这样理解:看前驱图,

P1执行完之后,会向P2和P3分别发送两个信号S1和S2(所以a处填V(S1)V(S2);

然后是P2执行,P2执行之前,要先获得S1(所以b处填P(S1));

P2执行完之后,会向P3发送一个信号S3(所以b下一处为V(S3));

P3执行之前,要先获得P2发送给P3的信号,也要获得P1发送给P3的信号(所以c处填(P(S2)P(S3)));P3执行完后,会向P4发送一个信号S4(所以c下一处为V(S4));

P4执行之前,要先获得P3发送给P4的信号方可执行(所以d处填P(S4))。


对于著名的生产者-消费者问题,我们也可以这样理解。



首先,我们要明确:不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。

对于生产者:

首先,生产者要生产一个产品,此时P(S1),就是获得了一个缓冲区的空间,然后才可以送产品到缓冲区;执行V(S2),就是发送一个信号给消费者告知其可以取东西了。

对于消费者:

P(S2),就是获得了发送给他的信号,可以取东西了;从缓冲区取东西之后,执行V(S1),就是告知生产者可以送产品至缓冲区了,然后消费产品。


理解不当,还请多多指教!


推荐阅读
  • 本文探讨了 Spring Boot 应用程序在不同配置下支持的最大并发连接数,重点分析了内置服务器(如 Tomcat、Jetty 和 Undertow)的默认设置及其对性能的影响。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 本文探讨了哪些数据库支持队列式的写入操作(即一个键对应一个队列,数据可以连续入队),并且具备良好的持久化特性。这类需求通常出现在需要高效处理和存储大量有序数据的场景中。 ... [详细]
  • Netflix利用Druid实现高效实时数据分析
    本文探讨了全球领先的在线娱乐公司Netflix如何通过采用Apache Druid,实现了高效的数据采集、处理和实时分析,从而显著提升了用户体验和业务决策的准确性。文章详细介绍了Netflix在系统架构、数据摄取、管理和查询方面的实践,并展示了Druid在大规模数据处理中的卓越性能。 ... [详细]
  • 深入解析for与foreach遍历集合时的性能差异
    本文将详细探讨for循环和foreach(迭代器)在遍历集合时的性能差异,并通过实际代码示例和源码分析,帮助读者理解这两种遍历方式的不同之处。文章内容丰富且专业,旨在为编程爱好者提供有价值的参考。 ... [详细]
  • 全面解析运维监控:白盒与黑盒监控及四大黄金指标
    本文深入探讨了白盒和黑盒监控的概念,以及它们在系统监控中的应用。通过详细分析基础监控和业务监控的不同采集方法,结合四个黄金指标的解读,帮助读者更好地理解和实施有效的监控策略。 ... [详细]
  • 本文详细介绍了Grand Central Dispatch (GCD) 的核心概念和使用方法,探讨了任务队列、同步与异步执行以及常见的死锁问题。通过具体示例和代码片段,帮助开发者更好地理解和应用GCD进行多线程开发。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • 深入解析RDMA中的队列对(Queue Pair)
    本文将详细探讨RDMA架构中的关键组件——队列对(Queue Pair,简称QP),包括其基本概念、硬件与软件实现、QPC的作用、QPN的分配机制以及用户接口和状态机。通过这些内容,读者可以更全面地理解QP在RDMA通信中的重要性和工作原理。 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 本文详细介绍了数组和线性表这两种常见的数据结构。数组是一种由类型名、标识符及维度构成的复合数据类型,其元素类型由类型名决定,维数表示数组中元素的数量。线性表则是一种逻辑结构,其中的数据元素呈现一对一的关系,便于实现和操作。 ... [详细]
  • LeetCode: 实现队列与栈的高级应用
    本文介绍如何使用队列和栈实现特定功能,包括动态维护队列元素并计算其平均值,以及栈操作中的优化技巧。 ... [详细]
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • 深入理解Java多线程并发处理:基础与实践
    本文探讨了Java中的多线程并发处理机制,从基本概念到实际应用,帮助读者全面理解并掌握多线程编程技巧。通过实例解析和理论阐述,确保初学者也能轻松入门。 ... [详细]
author-avatar
初升的太阳1866
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有