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.mfbz.cn/a/607959.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Selenium 自动化 —— 常用的定位器(Locator)

什么是定位器 定位器(Locator)是识别DOM中一个或多个特定元素的方法。 也可以叫选择器 Selenium 通过By类,提供了常见的定位器。具体语法如下: By.xxx("");我们选择单个元素时可以使用findByElement: Web…

ICode国际青少年编程竞赛- Python-2级训练场-坐标与列表练习

ICode国际青少年编程竞赛- Python-2级训练场-坐标与列表练习 1、 for i in range(6):Spaceship.step(Item[i].x - Spaceship.x)Dev.step(Item[i].y - Dev.y)Dev.step(Spaceship.y - Dev.y)2、 for i in range(5):Spaceship.step(Item[i].x - Spaceship.x)Flyer[i].step(Item[…

【MySQL数据库开发设计规范】之基础规范

欢迎点开这篇文章,自我介绍一下哈,本人笔名姑苏老陈,是一个JAVA开发老兵。 本文收录于 《MySQL数据库开发设计规范》专栏中,该专栏主要分享一些关于MySQL数据库开发设计相关的技术规范文章,定期更新,欢迎关…

《ESP8266通信指南》11-Lua开发环境配置

往期 《ESP8266通信指南》10-MQTT通信(Arduino开发)-CSDN博客 《ESP8266通信指南》9-TCP通信(Arudino开发)-CSDN博客 《ESP8266通信指南》8-连接WIFI(Arduino开发)(非常简单)-CSD…

机器学习(三) ----------线性回归算法(梯度下降+正则化)

目录 1 定义 2 损失函数(回归) 2.1 最小二乘函数(Least Squares Function) 2.2 均方误差(Mean Squared Error, MSE) 2.3 均方根误差(Root Mean Squared Error, RMSE) 2.4 平均绝…

自动驾驶纵向控制算法

本文来源——b站忠厚老实的老王,链接:忠厚老实的老王投稿视频-忠厚老实的老王视频分享-哔哩哔哩视频 (bilibili.com),侵删。 功率和转速之间的关系就是:功率P等于转矩M乘以转速ω。并不是油门越大加速度就越大。 发动机和电机的转…

GDAL:Warning 1: All options related to creation ignored in update mode

01 警告说明 首先贴出相关代码: out_file_name Rs_{:4.0f}{:02.0f}.tiff.format(year, month) out_path os.path.join(out_dir, out_file_name) mem_driver gdal.GetDriverByName(MEM) mem_ds mem_driver.Create(, len(lon), len(lat), 1, gdal.GDT_Float32) …

掌握用户全生命周期数据,Xinstall让App投放更科学

在数字化时代,App已成为企业与用户互动的重要窗口。然而,想要让App在众多竞争者中脱颖而出,吸引并留住用户,有效的广告投放策略至关重要。这就需要对广告投放效果进行精准分析,以便及时调整策略,实现最大化…

Kubernetes的基本概念

目录 一.基本内容 1.定义 2.作用 二.特性 1.弹性伸缩 2.自我修复 3.服务发现和负载均衡 4.自动发布(默认滚动发布模式)和回滚 5.集中化配置管理和密钥管理 6.存储编排,支持外挂存储并对外挂存储资源进行编排 7.任务批处理运行 三…

clickhouse mergeTree表引擎解析

参照 https://clickhouse.com/docs/zh/engines/table-engines/mergetree-family/mergetree https://clickhouse.com/docs/en/optimize/skipping-indexes Clickhouse中最强大的表引擎当属MergeTree(合并树)引擎及该系列(*MergeTree&#xff…

Springboot项目使用redis实现session共享

1.安装redis,并配置密码 这里就不针对于redis的安装约配置进行说明了,直接在项目中使用。 redis在windows环境下安装:Window下Redis的安装和部署详细图文教程(Redis的安装和可视化工具的使用)_redis安装-CSDN博客 2…

图片公式识别@文档公式识别@表格识别@在线和离线OCR工具

文章目录 abstract普通文字识别本地软件识别公式扩展插件下载小结 在线识别网站/API👺Quicker整合(推荐)可视化编辑和识别公式其他多模态大模型识别图片中的公式排版 开源模型 abstract 本文介绍免费图片文本识别(OCR)工具,包括普通文字识别,公式识别,甚至是手写公…

Linux网络——自定义序列化与反序列化

前言 之前我们学习过socket之tcp通信,知道了使用tcp建立连接的一系列操作,并通过write与read函数能让客户端与服务端进行通信,但是tcp是面向字节流的,有可能我们write时只写入了部分数据,此时另一端就来read了&#x…

ZYNQ MPSoC zcu102 PS端运行helloworld

文章目录 一、参考资料二、需要注意的步骤三、运行结果 一、参考资料 1.zcu102 zynq Mpsoc uart hello world——CSDN博客 2.zcu102自学 —— 第一个实验 (纯PS 串口打印 Hello world)——CSDN博客 3.【02】ALINX Zynq MPSoC XILINX FPGA视频教程 SDK 裸…

Linux:进程信号(一)信号的产生

目录 一、信号是什么? 二、Linux信号 三、信号处理方式 四、信号的产生 1、 通过终端按键产生信号 2、调用系统函数向进程发信号 3、 硬件异常产生信号 一、信号是什么? 在生活中,有许多信号,比如红绿灯,下课铃声…

如何使用Transformer-TTS语音合成模型

1、技术原理及架构图 ​ Transformer-TTS主要通过将Transformer模型与Tacotron2系统结合来实现文本到语音的转换。在这种结构中,原始的Transformer模型在输入阶段和输出阶段进行了适当的修改,以更好地处理语音数据。具体来说,Transformer-TT…

【Docker】新手教程的第一个demo:Wordpress

1 任务简单介绍 WordPress是什么: 是一个常用博客软件简单易部署,只需要两个容器(业务容器 数据库容器) 本文借鉴博客,使用自建 WordPress 容器方法在Docker上部署Wordpress,本地环境为Mac时使用该博客…

C语言leetcode刷题笔记2

C语言leetcode刷题笔记2 第4题:283.移动零互换直接移动 第5题:122.买卖股票的最佳时机‖递归(超时)动态规划贪心算法 第6题:49.字母异位词分组优化 第4题:283.移动零 给定一个数组 nums,编写一…

分布式事务Seata使用

我们要学习seata,首先需要具备如下技术储备: 数据库事务的基本知识;maven工具的使用;熟悉SpringCloudAlibaba技术栈;掌握SpringDataJPA简单使用; 一. Seata基本概念 1.seata是什么 Seata是阿里巴巴中间…

C++ 动态内存管理

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