当前位置: 首页 > news >正文

OS_同步与互斥

2024-07-04:操作系统同步与互斥学习笔记

第9节 同步与互斥

  • 9.1 同步互斥的基本概念
    • 9.1.1 同步关系
    • 9.1.2 互斥关系
    • 9.1.3 临界资源
    • 9.1.4 临界区
    • 9.1.5 同步机制应遵循规则
  • 9.2 软件同步机制
    • 9.2.1 单标志法
    • 9.2.2 双标志先检查法
    • 9.2.3 双标志后检查法
    • 9.2.4 peterson算法
  • 9.3 硬件同步机制
    • 9.3.1 关中断
      • (1) 关中断的定义
      • (2) 关中断的缺点
    • 9.3.2 Test-and-Set 指令(TS指令)
    • 9.3.3 Swap指令
  • 9.4 信号量机制
    • 9.4.1 整型信号量
    • 9.4.2 记录型信号量
      • (1) 利用信号量实现进程互斥
      • (2) 利用信号量实现进程同步


并发的进程或者程序在执行的时候会失去封闭性,也就是说如果有两个程序分别地区使用一个共享的资源,可能会导致每一次运行的结果都不一样
在这里插入图片描述
原因就是我们没有保护程序a和程序b都要去访问的这个共享资源x


9.1 同步互斥的基本概念

9.1.1 同步关系

相互制约的关系就是同步,同步通俗一点理解就是它们进程之间执行的时候要有一个次序
在这里插入图片描述


9.1.2 互斥关系

间接相互制约的关系就称为互斥关系,eg.打印机
在这里插入图片描述


9.1.3 临界资源

  • 在一段时间内只允许一个进程访问的资源,称为临界资源(或独占资源)
  • 对于临界资源的共享,各进程之间应该采用互斥方式

“生产者和消费者模型”
在这里插入图片描述counter+ +

首先把变量放到寄存器里面
register1 = counter;
接下来对寄存器进行一个自增
register1 = register1 + 1;
再把结果返回到counter里
counter = register1;

counter- -

首先把变量放到寄存器里面
register2 = counter;
接下来对寄存器进行一个自减
register2 = register2 - 1;
再把结果返回到counter里
counter = register2;

在这里插入图片描述

解决办法:把counter当做临界资源处理,令进程互斥地访问变量counter(后面会学到同步机制)


9.1.4 临界区

不管是硬件临界资源还是软件的临界资源,多个进程必须互斥地访问
在这里插入图片描述
这些区本质都是代码

  • 进入区
  • 临界区
  • 退出区
  • 剩余区

9.1.5 同步机制应遵循规则

  • 空闲让进

无进程处于临界区时,表明临界区资源空闲,应允许一个请求进入临界区的进程立即进入自己的临界区,有效利用资源。

  • 忙则等待

已有进程进入临界区时,表明临界资源正在被访问,因而其他试图进入临界区的进程必须等待,以保证对临界资源的互斥访问

  • 有限等待

对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区,避免陷入”等死“状态

  • 让权等待

进程不能进入自己的临界区时,应立即释放处理机(CPU),以免进程陷入”忙等“状态


9.2 软件同步机制

9.2.1 单标志法

  • 设置一公用整型变量来标明是否有进程在临界中,如果已有进程在临界区,则在进入区通过循环检查进行等待,进程离开临界区后则在退出区修改标志
  • 单标志法设置一个公用整型变量turn,指示允许进入临界区的进程编号,turn=0时允许进程P0进入临界区
  • turn=1时允许进程P1进入临界区,退出临界区将临界区使用权赋予另一个进程(Pi推出临界区时,令turn=j)

在这里插入图片描述
在这里插入图片描述
两个进程必须交替进入临界区,若一个进程不再进入临界区,则另一个进程也无法进入临界区,违背了“空闲让进”准则


9.2.2 双标志先检查法

双标志先检查法设置一个布尔型数组flag[2],用来标记各个进程想进入临界区的意愿,flag[i]=true,表示Pi想进入临界区。

  • Pi进入临界区前,先检查对方是否进入临界区,若想,则等待
  • 否则,将flag[i]设置为true后,再进入临界区
  • 当Pi退出临界区时,将flag[i]设置为false

在这里插入图片描述

在这里插入图片描述

  • while循环相当于红绿灯机制
  • 设置对方的flag相当于改对方的红绿灯
  • 但由于两个进程都是先检查flag[先看红绿灯],初始时均为false[均为绿灯],所以可能两个进程同时通过红绿灯,一起进入临界区

9.2.3 双标志后检查法

双标志后检查法会检查对方的标志再设置自己的,这俩操作无法一气呵成,于是两个进程可能同时进入临界区;所以想出了后检查法,先设置自己的标志,再检查对方的标志,若对方标志位true则等待;否则进入临界区

在这里插入图片描述
在这里插入图片描述


9.2.4 peterson算法

peterson算法结合了单标志法双标志后检查法的思想,利用flag[]解决互斥访问问题,在利用turn解决饥饿问题。

若双方都争着进入临界区,则可让进程将进入临界区的机会让给对方。
每个进程进入临界区之前,设置自己的flag标志,在设置允许进入turn标志,之后,再同时检测对方的flag和turn,以保证双方同时要求进⼊临界区时,只允许⼀个进程进入
在这里插入图片描述
没有做到让权等待
在这里插入图片描述


9.3 硬件同步机制

软件解决各个进程互斥进入临界区的问题有难度,而且有很大的局限性,所以计算机提供一些特殊的硬件指令来解决问题

9.3.1 关中断

(1) 关中断的定义

  • 关中断在计算机组成原理里面接触过,它指的是去修改CPU中PSW这个寄存器里面的一位,这一位会去控制现在CPU会不会去相应中断,这个中断只能挡住可屏蔽中断,不可屏蔽中断挡不住
  • 操作系统里面进程的调度都是依赖中断去实现的,比如时钟中断
  • 有进程再临界区执行期间,计算机系统关中断,从而不会引发调度,也就不会有进程或线程切换

(2) 关中断的缺点

  • 滥用终端会导致严重后果
  • 关中断时间过长,会影响系统效率
  • 关中断方法不适用于多CPU系统,在一个处理器上关中断不能防止进程在其他处理器上执行相同临界代码

9.3.2 Test-and-Set 指令(TS指令)

在这里插入图片描述

TS指令可以看作一个执行过程不可分割的函数过程(原语)

  • lock有两种状态:
    • *lock=FALSE表示资源空闲
    • *lock=TRUE表示资源正被使用

使用TS管理临界区,要为每个临界资源设置一个lock

  • 初值为FALSE,表示临界资源空闲
  • 进程进入临界区之前,先用TS测试lock,如果是FALSE,则可以进入,并将TRUE值赋给lock,关闭了临界资源

9.3.3 Swap指令

在这里插入图片描述
称为对换指令,用于交换两个字的内容

  • 为每个临界资源设置一个全局布尔变量lock,初值FALSE
  • 利用上面的硬件指令完成进程互斥
  • 但是这种方法也会造成访问进程不断进行测试,处于“忙等”状态,不符合“让权等待”原则

9.4 信号量机制

9.4.1 整型信号量

被定义为一个用于表示资源数目的整型量S,对于这个整型信号量的操作只有三种:初始化(赋初值)、wait(自减)、signal(自增)
在这里插入图片描述

  • wait和signal均为原子操作,执行时不可中断
  • 当一个进程在修改某信号量时,没有其他进程可以同时对该信号量进行修改

9.4.2 记录型信号量

不存在“忙等”现象的进程同步机制

  • 除了一个用于代表资源数目的整型变量value外
  • 还需要增加一个进程链表L,用于链接所有等待该资源的进程

在这里插入图片描述

  • wait操作等价于P操作
  • signal操作等价于V操作
  • 只是两种不同的称呼,功能完全一致
  • wait(A) = P(A)
  • signal(B) = V(A)

(1) 利用信号量实现进程互斥

设置一个互斥信号量mutex=1,然后把各进程访问临界资源的临界区放在wait(mutex)和signal(mutex)之间
在这里插入图片描述


(2) 利用信号量实现进程同步

设置一个同步信号量S=0,让需要先执行的语句signal(S),后执行的wait(S)
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Xcode15报错: SDK does not contain ‘libarclite‘
  • Python 给存入 Redis 的键值对设置过期时间
  • 红酒与城市探索:品味都市的多元风情
  • 初学SpringMVC之接收请求参数及数据回显
  • 神经网络和安全结合:一种基于神经网络的智能攻击检测与防御系统;构建攻击行为预测模型
  • SD卡讲解
  • 347. 前 K 个高频元素(中等)
  • 【Spring Boot】Spring原理:Bean的作用域和生命周期
  • 【CT】LeetCode手撕—8. 字符串转换整数 (atoi)
  • 建立共享linux第三方软件仓库
  • STM32利用FreeRTOS实现4个led灯同时以不同的频率闪烁
  • C++:组合和继承的区别
  • LeetCode HOT100(三)滑动窗口
  • 【Spring】springSecurity中WebSecurityConfigurerAdapter类中configure方法(5版本以下)
  • 2022 RoboCom省赛题目解析
  • AHK 中 = 和 == 等比较运算符的用法
  • Codepen 每日精选(2018-3-25)
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • flask接收请求并推入栈
  • git 常用命令
  • 阿里研究院入选中国企业智库系统影响力榜
  • 从零开始在ubuntu上搭建node开发环境
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 强力优化Rancher k8s中国区的使用体验
  • 区块链技术特点之去中心化特性
  • 全栈开发——Linux
  • 通过git安装npm私有模块
  • 为视图添加丝滑的水波纹
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • MyCAT水平分库
  • 数据可视化之下发图实践
  • 选择阿里云数据库HBase版十大理由
  • # 职场生活之道:善于团结
  • #{}和${}的区别是什么 -- java面试
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (南京观海微电子)——COF介绍
  • (区间dp) (经典例题) 石子合并
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)Unity3DUnity3D在android下调试
  • (自适应手机端)行业协会机构网站模板
  • ****三次握手和四次挥手
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .form文件_一篇文章学会文件上传
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET Framework .NET Core与 .NET 的区别
  • .Net FrameWork总结
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .NET多线程执行函数
  • ??myeclipse+tomcat
  • @Builder注释导致@RequestBody的前端json反序列化失败,HTTP400
  • @RequestMapping处理请求异常
  • @SuppressWarnings注解
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname