PV大题--专题突破

news2024/10/1 20:39:21

写在前面:

PV大题考查使用伪代码控制进程之间的同步互斥关系,它需要我们一定的代码分析能力,算法设计能力,有时候会给你一段伪代码让你补全使用信号量控制的操作,请一定不要相信某些人告诉你只要背一个什么模板,记住什么套路就能拿下这个大题,这是不切实际的!!

在真题的考查中,题目是较为灵活的,需要我们临场分析,如果只要背一背就能拿满分没有区分度,那出题老头也没必要年年都考PV了对吧?因此在正式进入大题讲解之前,必须对一些 前置知识理解透彻,比如什么是同步与互斥,信号量的分类,以及考纲上的三个模型(生产者消费者、读者写者、哲学家进餐)尤其需要彻底搞懂!!

这里我会大家学习考查的最多的模型—消费者生产者模型,从真题来看,至少有三分之三以上的PV问题都是基于此模型进行拓展(比如加一些资源,多一些同步关系等)。并且大家在分析其他模型 的时候,也要达到一个标准:

  1. 能够理解清楚每一行PV的意义是什么,为什么这里需要同步,这里要互斥。
  2. 能够熟练手写考纲上三个模型的代码,不允许出错。
  3. 真题考查的问题,一定要想一下它和我们已经学过的模型的区别与联系,只有多思考才能在下一次考查到相同类型问题的时候能够熟练写出来。

前置知识🌟

  1. 临界资源:一次只允许一个进程去访问,比如打印机。
  2. 临界区:进程对于临界资源访问的程序成为临界区,一般需要加上"互斥信号量"(下面会讲)。
  3. 互斥关系:由于进程的并发性同时去访问同一个临界资源会出现问题,需要互斥地去访问。比如两个进程同时访问一个打印机,数据会错乱。
  4. 同步关系:进程之间的操作事件存在时序关系,比如先后关系,我们在真题会遇到这种说法"操作C必须在操作A、B之后完成",也就是在告诉你这里有一个同步关系,需要你用信号量去定义。
  5. 信号量:对于信号量,我们不要去研究其复杂的概念,它的核心就是:阻塞—唤醒,我们在程序设计的时候也只要思考:我这个信号量是为了阻塞什么操作,什么时候会被唤醒,因此PV总是成对出现,这是本质。
    1. 互斥信号量:初始值为1,取值只能为0或1,当有进程进入临界区时就要上锁,也就是P一下互斥信号量,离开的时候就V一下互斥信号量,千万不要忘记释放。
    2. 同步信号量:这个名字是我自己编的,仅仅是更利于我们做题。它的初始值需要根据题目去分析,本质是用来实现进程之间的同步操作,也就是阻塞—唤醒功能,当它的值≤0时,说明资源已经被分配完,此时进程就不能获取该资源,需要等待其他进程去唤醒。比如我们的盒子里能放三块巧克力了,杰尼龟投放巧克力,小火龙吃巧克力;当盒子里没有巧克力但是小红还想要吃,就会 被阻塞住,直到杰尼龟投放了一块巧克力去唤醒小火龙告诉她:“嘿小火龙,巧克力来了,可以享用了!”。
  6. 注意:初学的时候,我们可能会困惑与同步与互斥的区别,千万不要陷入进去,因为在黑书中明确定义了同步与互斥关系在一些复杂的问题中往往是交叉的,不用区分,只要能定义出信号量会做题即可。且这类题型的答案往往也不是 唯一的,大家设计的算法当然有所不同,合理即给分。

解题技巧

在大题中,我们只会用到者两种信号量,不要害怕,非此即彼。互斥信号量初始值恒为1,而同步信号量,需要我们去设计。

  • 有一些题会初始化为资源的个数,比如缓冲区有10个空位,empty信号量就定为10。
  • 有一些题会初始化为0,比如我们要实现一些**“强同步”**关系的时候,像等待叫号与叫号服务。
  • 有一些题我们画出一个前驱图即可快速解决(类似于数据结构的拓扑排序)。
  • 程序中PV数量必须相同(PV成对),请仔细检查。
  • 对于单个进程,往往进需要定义一个同步互斥量,而对于两个进程需要一对,三个进行就用三个,如生产者消费者模型,等会用例题和真题带大家感受。(不想思考的时候直接用,无敌!)
  • 同步信号量一定要写在互斥信号量外侧(否则会死锁)。
  • 尽可能的少拿资源,比如一个题他的逻辑是水缸里有水,才能用水桶打水,那么我们在写伪代码的时候,就可以去提前判断一下水缸里是否有水(P一下),如果没有那我们就不去拿水桶了。也就是说当出现多同步关系的时候,我们要去思考一下顺序。
  • 一个进程中,如果想实现“同步”关系,往往采用互斥信号量实现,这也是我为什么在前面就说在操作系统中同步和互斥有些情况是不做区分的,互斥就是特殊的同步。因此一个题中互斥信号量不一定只需要一个,不要教条。

当然这些都是我的经验之谈只能作为锦上添花,具体的还要在题目中才能分享给你们。

基本设计模板:

// 互斥访问临界区
A(){
    P(mutex);
    操作;
    V(mutex);
}
// 先A后B同步关系
A(){
    操作;
    V(同步信号量);
}

B(){
    P (同步信号量);
    操作;
}

生产者-消费者模型🌟🌟

分析方法:所有的PV大题,都按照以下步骤进行分析,这里用生产者消费者模型来举例。

  1. 找到题目中的进程个数,以及资源的个数
  2. 分析各个进程之间的同步关系,找到需要互斥访问的临界区
  3. 定义出互斥信号量和同步信号量
  4. 根据进程同步关系,写出伪代码
  5. 检查PV是否成对,是否有死锁问题(对mutex操作放在中间)
  6. 模拟一下自己的伪代码,看看是否有遗漏的信号量(如果自信可不做)

在这里插入图片描述

我们来看这个模型,如图所示有一个缓冲区,假设可以容纳n个产品,生产者负责投放产品,而消费者负载消费产品,图中的产品就是食物。请用PV操作,实现同步互斥关系,要求给出伪代码。

分析:

  1. 两类进程:生产者、消费者
  2. 两类资源:大小为n的缓冲区,产品(注意两类 资源不一定只需要两个信号量,需要根据关系而定)
  3. 关系分析:
    1. 互斥访问缓冲区
    2. 缓冲区有空位置才能生产,有产品才能消费
  4. 信号量定义,并写出伪代码(直接看我写的)

在这里插入图片描述

Q:想一想能不能把对于缓冲区上锁的操作与P(同步互斥量)的操作互换?

不行,会死锁。举个例子,小火龙没有判断盒子里有没有巧克力,就直接获取盒子,再去判断有没有巧克力,但是此时盒子里没有巧克力,因此小火龙被阻塞住了,也没有释放盒子;这时杰尼龟来了,准备投放巧克力,想获取盒子的时候发现盒子还没有被释放,因此也被阻塞住了,也就不能生产巧克力去唤醒小火龙,此时进程就死锁了。
Q:有同学可能会问了,判断缓冲区中有没有资源,和减一操作可以分开吗?是不可以的,这是原子性操作,不可分。请看大黑书《深入理解计算机系统》原话:
在这里插入图片描述

至此,我们已经搞懂了 PV大题的本质,学习了最常见的模型,剩下的就是通过真题的训练去摸索出套路,熟能生巧,同时也要多思考模型的设计,以不变应万变。

真题

在这里插入图片描述

在这里插入图片描述

讲解视频跳转:【操作系统 | PV】40min带你狠狠拿捏PV大题的所有核心知识与解题技巧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2183106.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java线程入门

目录 一.线程相关概念 1.程序(program) 2.进程 3.线程 4.其他相关概念 二.线程的创建 1.继承Thread 2.Runnable接口 3.多线程机制(重要) 4.start() 三.线程终止--通知 四.线程(Thread)方法 1.常…

fastAPI教程:数据库操作

FastAPI 六、数据库操作 FastAPI支持操作各种数据库,但本身并没有内置关于任何数据库相关的模块。因此我们可以根据需求使用任何数据库,包括关系型(SQL)数据库,例如:PostgreSQL、MySQL、SQLite、Oracle、…

【AGC005D】~K Perm Counting(计数抽象成图)

容斥原理。 求出f(m) ,f(m)指代至少有m个位置不合法的方案数。 怎么求? 注意到位置为id,权值为v ,不合法的情况,当且仅当 v idk或 v id-k 因此,我们把每一个位置和权值抽象成点 ,不合法的情况之间连一…

【JVM】基础篇

1 初识JVM 1.1 什么是JVM JVM 全称是 Java Virtual Machine,中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件。 Java源代码执行流程如下: 分为三个步骤: 1、编写Java源代码文件。 …

自动驾驶系列—深度剖析自动驾驶芯片SoC架构:选型指南与应用实战

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

认知杂谈74《远离渣女陷阱,拥抱健康情感》

内容摘要: 渣女在感情中使用甜言蜜语陷阱,利用男性渴望理解和关爱的心理,通过虚假承诺和情感操控来获得利益。 男性易陷入这种陷阱,因为他们可能因压力大、感性而易受感动。为了避免这种情况,男性需要辨别言行一致性&a…

【含文档】基于Springboot+Vue的国风彩妆网站(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

软件设计之SSM(4)

软件设计之SSM(4) 路线图推荐: 【Java学习路线-极速版】【Java架构师技术图谱】 尚硅谷新版SSM框架全套视频教程,Spring6SpringBoot3最新SSM企业级开发 资料可以去尚硅谷官网免费领取 学习内容: 基于配置类方式管理Bean 完全注解开发第三…

共模电感工作原理:【图文讲解】

共模电感,相信做电源较多的朋友用的比较多,而做消费级产品的朋友或许用的不是那么的多。但是还是有必要了解了解。 先上图,看看它长什么样子: (实物图) (结构图) 很显然&#xff0…

【Ubuntu】安装常用软件包-mysql

我的几个服务是部署在docker的同一个网络里,这样相互访问就可以通过docker容器的名字访问,比如容器A访问容器B,就可以http://B:8080/xxx 这样访问,不用关心ip是多少。 所以mysql前面文章给安装到主机里,感觉有点坑自己…

02.usePrevious

在 React 开发中,有时我们需要访问组件的前一个状态或属性。这在进行比较、动画或其他需要历史数据的操作时特别有用。usePrevious 钩子提供了一种简单而有效的方式来存储和访问前一个值。以下是如何实现和使用这个自定义钩子: const usePrevious valu…

【数据类型】C和C++的区别

文章目录 一、字符串二、布尔类型 bool三、数据的输入和输出 C和C在数据类型上打区别不大,下面就二者在这方面的部分区别做比较。 一、字符串 C语言和C在字符串的定义和书写风格上略有差异。 C风格字符串: char str[]"hello";C风格字符串 st…

社交内容电商中的新机遇:2+1链动模式AI智能名片商城小程序

在当今的电商世界里,社交内容电商正蓬勃发展。这种模式基于高质量内容,将有着共同兴趣爱好的用户聚集起来形成社群,随后引导用户进行裂变式的传播与交易。无论是像微信、微博、快手、抖音、今日头条这样的平台形式,还是网红、“大…

算法笔记(四)——模拟

文章目录 替换所有的问号提莫攻击Z字形变换外观数列数青蛙 模拟算法就是根据题目的要求,题目让干神马就做神马,一步一步来 替换所有的问号 题目:替换所有的问号 思路 从左到右遍历整个字符串,找到问号之后,就⽤ a ~ z…

QT系统学习篇(2)- Qt跨平台GUI原理机制

一、Qt工程管理 新建项目: 我们程序员新建项目对话框所有5类项目模板 Application: Qt的应用程序,包含Qt Quick和普通窗口程序。 Library: 它可以创建动态库、静态库、Qt Creator自身插件、Qt Quick扩展插件。 其他项目: 创建单元测试项目、子目录项目…

自动驾驶系列—自动驾驶MCU架构全方位解析:从单核到多核的选型指南与应用实例

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

五子棋双人对战项目(3)——匹配模块

一、分析需求 二、约定前后端接口 三、实现游戏大厅页面(前端代码) 四、实现后端代码 五、线程安全问题 六、忙等问题 一、分析需求 需求:多个玩家,在游戏大厅进行匹配,系统会把实力相近的玩家匹配到一起。 要想实…

使用cmake配置pcl环境

项目文件在https://pan.quark.cn/s/d347f72c7432 文件中包含CMakeLists.txt,一个pcd文件,一个cpp源文件。 这里的话,首先你需要下载好cmake软件,并将其添加到环境变量。 CMakeLists.txt文件内容如下 cmake_minimum_required(VER…

「漏洞复现」EDU 某智慧平台 PersonalDayInOutSchoolData SQL注入漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删…