OS复习笔记ch5-3

news2024/12/23 0:02:35

引言

上一节我们学习了关于信号量机制的一些内容,包括信号量的含义,对应的PV操作等。

image.png

如图所示,上一节主要是针对信号量的互斥,其实信号量机制还可以做很多事情,比如实现进程同步和前驱关系,这一节我们先复习一下进程互斥,然后将展开进程同步和前驱关系的相关知识。

进程互斥

进程的互斥:由于各进程要求共享资源,而有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥。


进程互斥对应的口诀是“前P后V”,进入区申请资源,退出去释放资源
image.png
看图说话,进程互斥的基本解决思路如下:

  1. 实现互斥首先就是要明确互斥访问的资源是什么,即划定临界区。
    e.g., 访问打印机,一般一台电脑只连接一台打印机,此时访问打印机的相关代码就是临界区。
  2. 然后,对于临界区要设置互斥量,一般记作mutex,初值为一(只有一台打印机)
  3. 进程1在进入临界区之前需要申请mutex(mutex–),mutex非负,那么进入临界区
  4. 进程2进入临界区申请(mutex–),mutex为-1,执行阻塞原语,放入等待队列
  5. 进程1执行完临界区代码,释放临界区资源(mutex++),mutex非正,那么唤醒阻塞在mutex的进程2
    上述过程可以推而广之,适用于多个进程访问同一个互斥资源。

进程同步

进程的同步:系统中的多个进程相互合作,某些进程发生的一些事件需要满足某种时序关系,从而共同完成任务。

image.png

如图所示,getcopyput对应三个进程动作

  • f是键盘输入流,属于无界缓冲区——可以放多个数据/取多个数据
  • get是拿数据(s从f拿)
  • s、t是单缓冲区(一次只能放一个数据,一次也只能读一个数据)
  • copy执行某些特定的运算。
  • g是显示器的输出缓冲区
  • put是送数据(t送给g)
    如果进程执行不同步,即异步执行,会存在以下的可能:
    image.png
    如图所示,如果getcopyput三个进程不顺序执行,进程会由于在错误时刻存取缓冲区导致结果错误。所以,进程必须等到对应前驱进程执行结束才能读/写数据,即保证进程同步。

那么我们应该如何利用信号量机制来解决进程同步问题呢?


王道课中总结了一个解决进程同步的口诀:“前V后P”
image.png
如图所示,我们一步步分析:

  1. 首先和进程互斥一样,我们要分析我们在哪里需要满足“同步”关系,这里“一前一后”,就是说哪个进程操作在前,哪个进程操作在后。
  2. 设置一个同步信号量S,初始为0(赋值为0保证该信号量必须先释放才能申请,不能先申请再释放)
  3. 在“前操作”之后执行V(S),即前驱进程操作结束后及时释放信号量
  4. 在“后操作”之前执行P(S),即后继进程执行之前需要先申请信号量。
    这个实现的原理其实很简单,就是卡一个信号量临界点,在前驱进程释放资源之前,后继进程不能执行,会阻塞在信号量上。这样,也就满足了进程同步必须要的前后关系。

前驱关系

基于进程同步,我们可以实现更复杂的前驱关系。
先来看一个问题,小伙伴们可以结合进程同步的知识点思考一下。
image.png


其实,道理是一样的。
既然我们S2执行之前需要S1,那么就要有一个进程同步量a,在S1执行结束后释放a,S2执行前申请a,同理S3执行之前也需要S1,再增加一个同步信号量b。
以此类推,S2是S4、S5的前驱,需要两个同步量c,d,S3、S4和S5是S6的前驱,需要三个同步量e,f,g,就可以得到如下的答案。
image.png

如图所示,在“前V后P”的位置添加对应的PV操作,就可以实现进程的前驱关系。

总结

image.png
最后,我们根据王道的ppt小结一下:
信号量机制解决了两个基本问题:进程互斥和同步。
实现进程互斥的关键是

  1. 找到临界区
  2. 设置互斥信号量,赋值为1
  3. 前P后V
    实现进程同步的关键是
  4. 找到前后关系
  5. 设置同步信号量,赋值为0
  6. 前V后P

而基于进程同步,又可以衍生出更加复杂的进程前驱关系。前驱关系本质是多个进程之间的同步,采用函数复用的思想就可解决。

本节是信号量机制实际应用的底层思维,在大题和小题中经常考察,大家一定要多看多理解,尽可能形成自己的知识体系,这样我们在后续讲解实际应用的时候就会更加游刃有余。

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

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

相关文章

leetcode每日一题第七十二天

class Solution { public:TreeNode* searchBST(TreeNode* root, int val) {if(!root) return root;if(root->val val) return root;else if(root->val > val) return searchBST(root->left,val);else return searchBST(root->right,val);} };

新能源汽车动力电池热管理方案直冷方案原理简介

前言 随着新能源汽车的快速发展,动力电池作为其核心部件之一,对于其性能和寿命具有重要影响。动力电池在工作过程中会产生大量的热量,如果不能有效地进行热管理,将会导致电池温度升高、性能下降甚至损坏。因此,热管理…

C语言【文件操作 2】

文章目录 前言顺序读写函数的介绍fputc && fgetcfputcfgetc fputs && fgetsfputsfgets fprintf && fscanffprintffscanf fwrite && freadfwritefread 文件的随机读写fseek函数偏移量ftell函数rewind函数 文件的结束判断被错误使用的feof 结语 …

哈希题目总结

以下列举了可以用哈希方法(包括但不限于用HashMap和HashSet)的题目,实质上是把东西丢给这些数据结构去维护。请注意有些题目中用哈希是最优解,有些题目中不是最优解,可以自行探索其时间复杂度和空间复杂度的区别&#…

【Java】还不会数组?一文万字全搞定

前言:前面两章我们详细讲解了Java基本程序设计结构中的基本知识,,包括:一个简单的Java应用,注释,数据类型,变量与常量,运算符,字符串,输入输出,控…

探索精酿啤酒:从经典到创新

Fendi club啤酒一直以来都以其卓着的品质和与众不同的口感深受消费者喜爱。而随着时代的变迁和消费者口味的不断变化,Fendi club啤酒也在不断地探索和创新,以满足市场的多样化需求。 在经典的口感和风味基础上,Fendi club啤酒不断地尝试新的原…

多线程学习D10 收尾了应该

线程安全集合类概述 重点介绍java.util.concurrent.* 下的线程安全集合类,可以发现它们有规律,里面包含三类关键词:Blocking、CopyOnWrite、Concurrent Blocking 大部分实现基于锁,并提供用来阻塞的方法 CopyOnWrite 之类容器修改…

探讨关于AutoPSA里CII算法的结构荷载

UKP3D,AutoPDMS导出应力计算文件至管道应力分析软件分析,如下图AutoPSA.用户咨询如图 1.如果计算时考虑水重,把工况中的w改为ww; 2.CAD表格中结构荷载不是单纯的1.5倍,是参照仿GLIF的算法,计算了水重的(根…

如何进行资产梳理

前言 为什么要进行资产梳理? 资产梳理方式一: 一、安全防护设备资产 二、对外开放服务项目资产 三、项目外包业务流程资产 资产梳理方式二: 一、业务资源梳理 二、设备资产梳理 三、第三方的服务信息梳理 风险梳理 风险有哪些? 一,账号权限风…

在windows下使用VS Code、CMake、Make进行代码编译

软件环境 Windows11VS CodeNoneCMake3.26.4-windows-x86_64MinGWNone 电脑系统配置 安装MinGW将MinGW安装文件夹中bin文件夹下的mingw32-make.exe复制并重命名为make.exe在文件夹中添加系统路径,具体位置为 系统->系统信息->高级系统设置->高级->环境…

Core_Air724UG学习

产品描述 Core_Air724UG核心板是基于Air724UG cat1模板制作的开发实验板。 该模块支持Lua二次开发或AT指令,方便开发者根据自己的需求灵活选择。 Core_Air724UG核心板专注于小型化,PCB尺寸4246mm,有12x22哥标准2.54mm排针管脚,其…

Android MediaCodec 简明教程(七):使用 MediaCodec 解码到 OES 纹理上

系列文章目录 Android MediaCodec 简明教程(一):使用 MediaCodecList 查询 Codec 信息,并创建 MediaCodec 编解码器Android MediaCodec 简明教程(二):使用 MediaCodecInfo.CodecCapabilities 查…

安装oh-my-zsh(命令行工具)

文章目录 一、安装zsh、git、wget二、安装运行脚本1、curl/wget下载2、手动下载 三、切换主题1、编辑配置文件2、切换主题 四、安装插件1、zsh-syntax-highlighting(高亮语法错误)2、zsh-autosuggestions(自动补全) 五、更多优化配…

FFmpeg常用命令详解与实战指南

下载地址:Releases BtbN/FFmpeg-Builds (github.com) 1. 获取视频信息 使用FFmpeg获取视频信息是最基本的操作之一。你可以使用-i选项指定输入文件,然后使用FFmpeg内置的分析器来获取视频的各种信息,包括视频编解码器、音频编解码器、分辨…

【bug记录】清除僵尸进程,释放GPU显存

目录 1. 为什么会出现这种情况?2. 解决方案方法一:使用 fuser 命令方法二: 3. 小贴士 在进行深度学习或其他需要GPU支持的任务时,我们有时会发现虽然没有可见的进程在执行,但GPU资源却意外地被占用。这种情况往往会阻碍…

Redis(无中心化集群搭建)

文章目录 1.无中心化集群1.基本介绍2.集群说明 2.基本环境搭建1.部署规划(6台服务器)2.首先删除上次的rdb和aof文件(对之前的三台服务器都操作)1.首先分别登录命令行,关闭redis2.清除/root/下的rdb和aof文件3.把上次的…

(23)实时采集微信消息(基于主窗体)-微信UI自动化(.Net+C#)

整理 | 小耕家的喵大仙 出品 | CSDN(ID:lichao19897314) Q Q | 978124155 往期知识回顾 (1)开启探索微信自动化之路-微信UI自动化(.NetC#) (2)初始化微信窗体UI自动化实例-微信UI自动化(.NetC#) (3)采用热键终止微信采集任务-微信UI自动…

linux调试

文章目录 1. 使用打印来调试1.1 重定向1.2 标准预定义宏1.3 日志代码 2. 内核异常2.1 内核打印2.1.1 打印级别2.1.2 跟踪异常2.1.3 动态打印2.1.4 RAM console 2.2 OOPS2.2.1 有源代码的情况2.2.2 没有源代码的情况 3 查看日志4 工具调试 1. 使用打印来调试 1.1 重定向 2>…

HDLbits 刷题 -- Exams/m2014 q3

Consider the function f shown in the Karnaugh map below. Implement this function. d is dont-care, which means you may choose to output whatever value is convenient. 译:考虑下面卡诺图中显示的函数f。 实现这个函数。D是dont-care,这意味着…

【数据结构】栈(Stack)和队列(Queue)

文章目录 栈一、栈的概念及结构二、栈的特点三、栈的实现1.初始化栈2.判断栈空3.入栈4.出栈5.取栈顶元素6.栈的元素个数7.销毁 队列一、队列的概念及结构二、队列的特点三、队列的实现1.初始化2.入队3.出队4.判断队空5.取队头元素6.取队尾元素 总结 栈 一、栈的概念及结构 栈…