OS复习笔记ch5-3

引言

上一节我们学习了关于信号量机制的一些内容,包括信号量的含义,对应的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.mzph.cn/web/9203.shtml

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

相关文章

【Spring】JdbcTemplate

JdbcTemplate 是 Spring 提供的一个 JDBC 模板类,是对 JDBC 的封装,简化 JDBC 代码 也可以让 Spring 集成其它的 ORM 框架,例如:MyBatis、Hibernate 等 使用 JdbcTemplate 完成增删改查 一、环境准备 数据库: 准备…

Marin说PCB之如何快速打印输出整板的丝印位号图?

当小编我辛辛苦苦加班加点的把手上的板子做到投板评审状态的时候,坐在我旁边的日本同事龟田小郎君说让我把板子上的丝印也要调一下,我当时就急了,这么大的板子,将近1W多PIN 了都,光调丝印都要老半天啊,而且…

Docx文件误删除如何恢复?别再花冤枉钱了,4个高效恢复软件!

不管是工作还是学习,总是会与各种各样的文件打交道。文件量越多就越容易出现文件丢失、文件误删的情况。遇到这些情况,失去的文件还能找回来吗?只要掌握了一些数据恢复方法,是很有机会恢复回来的,下面我会将这些方法分…

[机器学习系列]深入探索回归决策树:从参数选择到模型可视化

目录 一、回归决策树的参数 二、准备数据 三、构建回归决策树 (一)拟合模型 (二)预测数据 (三)查看特征重要性 (四)查看模型拟合效果 (五) 可视化回归决策树真实值和预测值 (六)可视化决策树并保存 部分结果如下: 一、回归决策树的参数 DecisionTreeRegress…

NVIDIA_SMI has failed because it couldn’t communicate with the NVIDIA driver

参考:https://www.zhihu.com/question/474222642/answer/3127013936 https://blog.csdn.net/ZhouDevin/article/details/128265656 nvidia-smi查看报错,nvcc正常 1)查看nvidia版本 ls /usr/src | grep nvidia nvidia-550.78 2)…

暗区突围国际服pc端怎么获取测试资格 twitch掉落资格获取教程

《暗区突围》是由腾讯魔方工作室群开发的第一人称射击类手游。游戏以从暗区撤离并收集物资满载而归作为最终目的,带出的战利品可以存储在仓库中,又可以出售用以换取游戏金钱。游戏中玩家可以创建男性或女性角色,可以通过选择脸型、发型、发色…

C++ 动态内存管理

例如:动态内存和释放单个数据的存储区 一 用new运算符初始化单个数据的存储区 举例

【智能算法】人工原生动物优化算法(APO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.获取代码 1.背景 2024年,X Wang受到自然界原生动物启发,提出了人工原生动物优化算法( Artificial Protozoa Optimizer, APO)。 2.算法原理 2.1算法思想 AP…

压缩归档库-Snappy介绍

1.简介 Snappy 是一个 C 编写的压缩和解压缩库,由 Google 开发。它专为速度而设计,而不是最大压缩率或与其他压缩库的兼容性。 Snappy 通常用于需要快速压缩和解压缩的场景。 Snappy具有以下属性: 快速:压缩速度达到250 MB/秒及…

数智化快速开发平台

助力企业IT规划标准化,实现企业IT生态化 目前市场上有很多面向企业各种业务场景的产品,这些产品给企业管理带来便利性的同时,也带来了一系列问题,例如: 不同系统的后台管理功能基本一致,却需要重复建设&a…

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>…

[Collection与数据结构] Map与Set(一):二叉搜索树与Map,Set的使用

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏:🍕 Collection与数据结构 (91平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 🧀Java …

python socket通讯 学习记录

python socket 1. 初级实现2. 添加header3. 中级实现(引用pickle库)4. 高级实现(相互发送信息)5. 一点尝试5. 1个server对应2个client5.2个server对应1个client 名称版本python3.11 本文涉及到socket的server与client通讯从简单到…

LeetCode 257. 二叉树的所有路径

LeetCode 257. 二叉树的所有路径 1、题目 题目链接:257. 二叉树的所有路径 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root…

java.net.SocketInputStream.socketRead0 卡死导致 tomcat 线程池打满的问题

0 TL;DR; 问题与原因:某些特定条件下 java.net.SocketInputStream.socketRead0 方法会卡死,导致运行线程一直被占用导致泄露采用的方案:使用监控线程异步监控卡死事件,如果发生直接关闭网络连接释放链接以及对应的线程 1. 问题 …

nacos下载安装和nacos启动报错

nacos简介: Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您…

YOLOv9中模块总结补充|RepNCSPELAN4详图

专栏地址:目前售价售价69.9,改进点70 专栏介绍:YOLOv9改进系列 | 包含深度学习最新创新,助力高效涨点!!! 1. RepNCSPELAN4详图 RepNCSPELAN4是YOLOv9中的特征提取-融合模块,类似前几…

【数据结构-二叉搜索树的增删查改】

🌈个人主页:努力学编程’ ⛅个人推荐:基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 …

[虚拟机+单机]梦幻契约H5修复版_附GM工具

本教程仅限学习使用,禁止商用,一切后果与本人无关,此声明具有法律效应!!!! 教程是本人亲自搭建成功的,绝对是完整可运行的,踩过的坑都给你们填上了 视频演示 [虚拟机单…

vue2人力资源项目2登录接口、跳转主页

用户名和密码 解决跨域问题 1.在vue.config.js里配置 proxy: {// 如果请求地址里有api,就转成这个地址/api: {target: https://heimahr.itheima.net/}}// before: require(./mock/mock-server.js)}, axios封装 utils/request.js import axios from axios// creat…