操作系统【OS】Ch2 进程同步与互斥机制

进程同步与互斥机制1:硬件和软件方法

硬件方法

  • 也称为低级方法、元方法
  • 不能实现让权等待

中断屏蔽

  • 使用开/关中断指令实现
  • 简单高效
  • 只适用于单处理机
  • 只适用于操作系统内核进程【因为关中断的权力不能交给用户】

TestAndSet

  • 实现简单
  • 适用于多处理机
  • 不满足让权等待

Swap

  • 实现简单
  • 适用于多处理机
  • 不满足让权等待

软件方法

  • 不能实现让权等待

单标志法

 

比如:1运行完了之后让2运行,2不想运行,此时turn一直是1,不会到0,故1想运行也运行不了

双标志先检查

  • 可能同时进入临界区
  • eg:一开始没有进程在运行,则,1和2都想进入的时候,就一起进入了

双标志后检查

  • eg:两个都把标志设为true,两个都卡在了while

Peterson算法

 

进程同步与互斥机制2:管程

定义

  • 用于解决信号量机制麻烦、易出错、大量同步操作分散的问题
  • 管程定义了共享数据结构和各种进程在该数据结构上的全部操作
  • 管程支持进程互斥【互斥的特性是由编译器负责的】
  • 任何时候只有一个进程在管程中执行
  • 管程不仅能实现进程间的互斥,还能实现进程间的同步
  • Java 采用管程机制
  • Java中管程常见的代码:synchronized关键字,wait()、notify()、notifyAll()
  • 管程是被进程调用的,管程是语法范围,无法创建和撤销

组成

PS这类题目如果看到是管程外这个字眼,那就是错误的,管程的组成都是基于管程内部的

  • 管程的名字
  • 局部于管程内部的共享数据结构或者共享变量说明
  • 对管程内的数据结构进行操作的一组过程
  • 对局部于管程内部的共享数据设置初始值的语句

特点

  • 局部于管程的数据只能被局部于管程的过程所访问
  • 一个进程只能通过调用管程内的过程才能进入管程访问共享数据
  • 每次仅允许一个进程在管程内执行某个内部过程

管程中设置的条件变量

定义

  • 阻塞原因定义为条件变量condition

有两种操作

  • x.wait:阻塞进程,将其插入到阻塞队列中
  • x.signal:唤醒进程,将其插入到就绪队列中

与信号量的相似点

  • wait/signal类似于信号量的P/V操作,实现进程的阻塞/唤醒

与信号量的不同点

  • 条件变量没有值,仅实现“排队等待”功能
  • 信号量有值,这个值反映了剩余资源数

 

进程同步与互斥机制3:互斥锁

定义

  • 解决临界区最简单的工具

特点

  • 通常采用硬件机制实现
  • 常用于多处理器系统【等待期间不用切换进程上下文,多处理器中,若上锁的时间短,则等待代价很低】

缺点

  • 缺点:违反“让权等待”

代码

  • acquire()获取锁
  • release()释放锁

 

 

进程同步与互斥机制4:信号量和PV操作

PV操作定义

P操作

  • 将信号量值S减 1,表示「申请占用一个资源」
  • 如果 s≤ 0,表示已经没有可用资源,则执行 P 操作的进程被阻塞
  • 如果 s>0,表示现有的资源足够使用,则执行 P 操作的进程继续执行
  • 举例:
    • 当信号量的值为2时,表示有 2 个资源可以使用;
    • 当信号量的值为-2的时候,表示有两个进程正在等待使用这个资源

V操作

  • 将信号量值S加 1,表示「释放一个资源」,即使用完资源后归还资源
  • 由于我们已经释放出一个资源了,因此需要唤醒阻塞进程
  • PV操作是低级进程通信语言

常见问题

1、S>0表示有临界资源可供使用,这个时候为什么不需要唤醒进程?

  • 所谓唤醒进程是从就绪队列(阻塞队列)中唤醒进程,而信号量的值大于 0 表示有临界资源可供使用
  • 也就是说这个时候没有进程被阻塞在这个资源上,所以不需要唤醒,正常运行即可

2、S=0表示没有临界资源可供使用,为什么还要唤醒进程?

  • V 操作是先执行S+1,也就是说,把信号量的值加1后才变成了0
  • 在此之前,信号量的值是-1,即有一个进程正在等待这个临界资源,我们需要唤醒它

信号量分类

整型信号量

  • 该信号量被定义为一个用于表示资源数目的整型量S
  • 该机制不遵循“让权等待”的准则

记录型信号量

  • 是一种不存在“忙等”现象的进程同步机制【遵循“让权等待”的准则
  • 需要一个用于代表资源数目的变量Value
  • 需要一个进程链表L,用于链接所有等待该资源的进程
  • wait操作 = P操作 = 请求一个资源
  • signal操作 = V操作 = 释放一个资源

 信号量应用

利用信号量实现同步
 

同步信号量初始值不确定,可以自行设置

信号量最大值 = 最多可以请求的资源数

信号量最小值 = 最大值/初始值 - 最大请求值

  • 用资源P操作;
  • 释放资源V操作;
  • 此时信号量表示资源量

利用信号量实现互斥

互斥信号量初始值 = 1,表示临界区只允许一个进程进入,从而实现互斥

互斥信号量=0,表示临界区已经有一个进程进入,临界区外还没有进程等待

互斥信号量<0,表示临界区中有一个进程,临界区外有进程等待,且|互斥信号量| 表示在临界区外等待进入的进程数

  • PV操作夹着互斥资源;
  • 此时信号量表示互斥量

利用信号量实现前驱关系

  • 描述程序之间或语句之间的前驱关系

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

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

相关文章

【GAMES101】Lecture 09 重心坐标

我们之前说着色过程中以及这个计算法线的时候需要用到这个插值&#xff08;Interpolation&#xff09;&#xff0c;然后插值是通过这个重心坐标&#xff08;Barycentric Coordinates&#xff09;来实现的 目录 重心坐标 插值 重心坐标 注意哈我们这里说的三角形的重心坐标并…

RT-DETR优化改进:IoU系列篇 | Focaler-IoU​​​​​​​更加聚焦的IoU损失Focaler-IoU |2024年最新发表

🚀🚀🚀本文改进:Focaler-IoU更加聚焦的IoU损失Focaler-IoU,能够在不同的检测任务中聚焦不同的回归样本,使用线性区间映射的方法来重构IoU损失 🚀🚀🚀RT-DETR改进创新专栏:http://t.csdnimg.cn/vuQTz 🚀🚀🚀学姐带你学习YOLOv8,从入门到创新,轻轻松松搞…

(2024,强化学习,扩散,奖励函数)扩散模型的大规模强化学习

Large-scale Reinforcement Learning for Diffusion Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3.1. 使用多步骤 MDP 的策略梯度 3.2. 基于分布的奖励函…

正则表达式初版

一、简介 REGEXP&#xff1a; Regular Expressions&#xff0c;由一类特殊字符及文本字符所编写的模式&#xff0c;其中有些字符&#xff08;元字符&#xff09;不表示字符字面意义&#xff0c;而表示控制或通配的功能&#xff0c;类似于增强版的通配符功能&#xff0c;但与通…

Docker部署

Docker简介 Docker是一个开源的容器引擎&#xff0c;它有助于更快地交付应用。 Docker可将应用程序和基础设施层隔离&#xff0c;并且能将基础设施当作程序一样进行管理。使用 Docker可更快地打包、测试以及部署应用程序&#xff0c;并可以缩短从编写到部署运行代码的周期。 &a…

数据结构奇妙旅程之二叉树题型解法总结

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

影响可变利差有几个因素,Anzo Capital先说两个

了解利差的变化规律&#xff0c;盈利赚钱还不是轻轻松松的事情&#xff0c;但Anzo Capital想问各位投资者&#xff0c;你们知道影响可变利差的价值有几个因素吗&#xff1f;今天就先抛砖引玉&#xff0c;先说两个影响可变利差的因素。 首先就是交易工具的流动性——商品快速买…

精通 VS 调试技巧,学习与工作效率翻倍!

​ ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ ​ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; ​ 所属专栏&#xff1a;C语言学习 ​ 贝蒂的主页&#xff1a;Betty‘s blog 1. 什么是调试 当我们写代码时候常常会遇见输出结果不符合我们预…

【三维重建】双目立体视觉

通过极几何可以求得极线&#xff0c;现在我们需要将左边的图变成右边的平行视图。 所有的极线都经过极点(e/e)&#xff0c;如果极点位于无穷远处&#xff0c;那所有的极线都平行。 (极几何的基础知识可以参考这篇文章&#xff1a;【三维重建】对极几何-CSDN博客) 平行视图中&…

modbus poll测试工具测试modbus tcp与PLC设备连接使用方法

socket默认端口是502&#xff0c;socket连上之后&#xff0c; 按照modbuspoll工具设置的读写参数 生成的RTU命令格式去组装读PLC的设备数据 modbuspoll工具配置&#xff0c;以v9.9.2中文破解版为例&#xff1a; 首先点连接菜单&#xff08;connection&#xff09;建立连接&…

基于springboot+vue的IT技术交流和分享平台系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

【latex】在Overleaf的IEEE会议模板中,快速插入参考文献

【LaTeX】在Overleaf的IEEE会议模板中&#xff0c;快速插入参考文献 写在最前面第一步&#xff1a;在文献检索网站导出引用文献的bib文件第二步&#xff1a;编辑overleaf模版方法二&#xff1a;EduBirdie生成参考文献&#xff08;补充&#xff09;使用LaTeX在Overleaf的IEEE会议…

《Linux高性能服务器编程》笔记07

Linux高性能服务器编程 本文是读书笔记&#xff0c;如有侵权&#xff0c;请联系删除。 参考 Linux高性能服务器编程源码: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服务器编程 文章目录 Linux高性能服务器编程第14章 多线程编程14.1 Linux线程概述14…

汇编实验报告

汇编实验 实验4 分支程序设计实验5 循环程序设计 实验4 分支程序设计 一、实验目的 理解分支程序结构的特点&#xff0c;掌握分支结构程序的编写。 二、实验内容 &#xff08;1&#xff09;验证单分支结构的字母判断程序&#xff08;教材例4-10&#xff09;&#xff0c;编写数…

基于蒙特卡洛模拟的家用电动汽车充电负荷预测(MATLAB实现)

采用蒙特卡洛模拟法&#xff0c;对家用电动汽车充电负荷进行预测&#xff0c;电动汽车分为快、中、慢三种充电功率&#xff0c;且分为一天一充、一天两充、一天三充三种类型。全部MATLAB代码在下方给出&#xff0c;可以直接运行。 %%%%%%%%%%%%%%%%%%%%%%%%输入电动汽车相关原…

前端开发WebStorm

WebStorm是一款功能强大的JavaScript集成开发环境&#xff0c;凭借智能代码补全、实时分析和代码重构、集成版本控制、强大的调试和测试工具、实时预览和集成前端工具以及自定义配置和插件支持等功能&#xff0c;成为开发者首选的利器。 前端开发WebStorm WebStorm是一款功能强…

使用POI生成word文档的table表格

文章目录 使用POI生成word文档的table表格1. 引入maven依赖2. 生成table的两种方式介绍2.1 生成一行一列的table2.2 生成固定行列的table2.3 table合并列2.4 创建多个table存在的问题 使用POI生成word文档的table表格 1. 引入maven依赖 <dependency><groupId>org.…

【QT】MDI应用程序设计

目录 1 MDI简介 2 文档窗口类QFormDoc的设计 3 MDI主窗口设计与子窗口的使用 3.1 主窗口界面设计 3.2 MDI子窗口的创建与加入 3.3 QMdiArea常用功能函数 3.4 MDI的信号 1 MDI简介 传统的应用程序设计中有多文档界面&#xff08;Multi-documentInterface&#xff0c;MDI…

Spring源码学习-Spring流程概述(一)

Spring启动的流程 public class Test {public static void main(String[] args) {ClassPathXmlApplicationContext context new ClassPathXmlApplicationContext("applicationContext.xml");Student bean context.getBean(Student.class);context.close();} }调用…

php低版本(7.4)配置过程中遇到的问题及基本解决手段

目前php不支持较低版本的安装&#xff0c;如果安装低版本必须借助第三方库shivammathur //将第三方仓库加入brewbrew tap shivammathur/php //安装PHPbrew install shivammathur/php/php7.4 可能出现的问题 像这样突然中止然后报错&#xff0c;一般是网络问题&#xff0c;或…