王道操作系统笔记(四)——— 进程同步与互斥

news2024/9/22 1:41:32

文章目录

  • 一、同步与互斥的概念
    • 1.1 同步与互斥的基本概念
    • 1.2 临界资源与共享资源
    • 1.3 独占设备与共享设备
  • 二、实现临界区互斥的基本方法
    • 2.1 软件实现方法
      • 2.1.1 单标志法
      • 2.1.2 双标志先检查法
      • 2.1.3 双标志后检查法
      • 2.1.4 Peterson 算法
      • 2.1.5 软件实现方法总结
    • 2.2 硬件实现方法
      • 2.2.1 中断屏蔽法
      • 2.2.2 硬件指令法
      • 2.2.3 硬件实现方法总结
      • 2.2.4 补充:互斥锁
  • 四、信号量
    • 4.1 整型信号量
    • 4.2 记录型信号量
    • 4.3 信号量实现进程同步、互斥与前驱关系
      • 4.3.1 实现进程同步
      • 4.3.2 实现进程同步
      • 4.3.3 实现前驱关系(多级同步)
      • 4.3.4 同步、互斥和前驱关系总结(★)


一、同步与互斥的概念

  异步性 是指,各并发执行的进程以各自独立的、不可预知的速度向前推进。进程具有 异步性 的特征,因此操作系统要提供 进程同步机制 来解决异步问题。此外,有些资源 一个时间段内只允许一个进程访问,操作系统要使得进程 互斥的访问 来该资源。

1.1 同步与互斥的基本概念

  • 进程同步
    同步,亦称 直接制约关系进程同步 是指在某些时刻为完成某种任务而使得多个进程协调工作而产生的 制约关系。(如:管道通信中,一定是先写在读)

  • 进程互斥
    互斥,亦称 间接制约关系进程互斥 是指当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待。当前访问临界资源的进程访问结束,释放该资源之后,另一个进程才能去访问临界资源。(如:访问打印机)


1.2 临界资源与共享资源

  • 临界资源
    将一次只允许一个进程使用 的资源称为 临界资源。许多物理设备都属于临界资源,如:打印机、摄像头。

    临界资源的访问过程分成 4 个部分:
     ① 进入区:负责检查是否可进入临界区,若可进入需要上锁。
     ② 临界区进程中访问临界资源的那段代码,又称临界段。
     ③ 退出区:负责解锁。
     ④ 剩余区:代码中其余部分。

  • 共享资源
    将一次允许多个进程同时使用 的资源称为 共享资源。如:输出一行字符。
    进程之间往往 宏观 上同时共享使用该资源,而 微观 上交替使用

  • 两种资源共享方式
    共享方式有两种,分别是:互斥共享方式同时共享方式。其中,互斥共享方式 对应 临界资源,同时共享方式 对应 共享资源
    互斥共享方式:一个时间段内 只允许一个进程 访问。
    同时共享方式:允许一个时间段内 可由多个进程 “同时” 访问。

  • 常见的临界资源与共享资源
    临界资源:打印机、共享变量、共享缓冲区、公用队列。
    共享资源:磁盘、非共享变量、可重入的代码。

    共享变量 x 初值等于 1,现假设 x 值代表可用资源数量(如:打印机),当 x = 0 时,进程处于阻塞态。
    正常的执行顺序是:①②③④⑤⑥。当执行到 ④ 时,x=0,进程B处于阻塞态,不会去和A争抢打印机。
    有问题的执行顺序:①②④⑤③⑥。当执行到 ④ 时,由于进程A没有存变量,因此进程B也会申请到打印机的使用权,这会导致打印出错。
    在这里插入图片描述
    综上:共享变量 是 临界资源,非共享变量(如常量) 是 共享资源。

  • 同步机制要遵循的原则

    为了实现对临界资源的互斥访问,同时保证系统整体性能,需要遵循以下原则:
     ① 空闲让进:临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区;
     ② 忙则等待:当已有进程进入临界区时,其他试图进入临界区的进程必须等待;
     ③ 有限等待:对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿);
     ④ 让权等待:当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。


1.3 独占设备与共享设备

独占设备 对应 临界资源,共享设备 对应 共享资源 。

  • 独占设备一个时间段只能分配给一个进程,如:打印机。
  • 共享设备一个时间段可同时分配给多个进程,如:磁盘。各进程往往是宏观上同时共享使用设备,而微观上交替使用。

磁盘是共享设备,但在每个时刻(至多能由一个)作业启动它。
解析:共享设备某时间段内可由多个作业进行访问,但在某一时刻只能有一个作业可以访问。


二、实现临界区互斥的基本方法

2.1 软件实现方法

2.1.1 单标志法

  算法基本思想:设置一个 公用变量 turn,用于指示被允许 进入临界区的进程编号,即若 turn = 0,则允许 P0 进程进入临界区。算法可保证同一时刻只允许一个进程进入临界区,但两个进程必须交替进入临界区。
在这里插入图片描述

  存在问题:若某个进程不再进入临界区,则另一个进程也无法进入临界区,即 每个进程进入临界区的权限只能被另一个进程赋予,违背 “空闲让进” 原则


2.1.2 双标志先检查法

  算法基本思想:设置 一个布尔型数组 flag[],数组中各个元素用来标记各进程想 进入临界区的意愿,比如 flag[0] = ture 意味着 0 号进程 P0 现在想要进入临界区。每个进程在进入临界区之前先检查当前有没有其他进程想进入临界区,如果没有,则把自身对应的标志 flag[i] 设为 true,之后开始访问临界区
在这里插入图片描述

  存在问题:若按照 ①⑤②⑥…. 的顺序执行,P0 和 P1 将会同时访问临界区,违背 “忙则等待” 原则。原因在于,进入区的 检查上锁 两个处理不是 一气呵成先检查后上锁,在 检查后 和 上锁前 可能发生进程切换。


2.1.3 双标志后检查法

  算法基本思想:双标志先检查法的改版,与前一个算法不同,采用 先上锁后检查,来避免上述问题。

在这里插入图片描述

  存在问题:若按照 ①⑤②⑥…. 的顺序执行,P0 和 P1 将都无法进入临界区。因此,双标志后检查法虽然 解决了 “忙则等待” 的问题,但是 又违背了 “空闲让进”和“有限等待” 原则,会因各进程都长期无法访问临界资源而产生 饥饿 现象。两个进程都争着想进入临界区,但是谁也不让谁,最后谁都无法进入临界区。


2.1.4 Peterson 算法

  算法基本思想:结合双标志法、单标志法的思想。如果双方都争着想进入临界区,那可以让进程尝试 孔融让梨(谦让),做一个有礼貌的进程。进程在进入区要做的步骤: ① 主动争取 ② 主动谦让 ③ 检查对方是否也想使用,且最后一次是不是自己说了客气话
在这里插入图片描述
  存在问题:Peterson 算法用软件方法解决了进程互斥问题, 遵循 “空闲让进”、“忙则等待”、“有限等待” 三个原则,但是依然 未遵循 “让权等待” 的原则。


2.1.5 软件实现方法总结

在这里插入图片描述


2.2 硬件实现方法

硬件实现方法实际上以硬件的方式将检查和上锁绑在一起。

2.2.1 中断屏蔽法

  中断屏蔽法利用 “开/关中断指令” 实现,其与原语的实现思想相同,即在某进程开始访问临界区到结束访问为止都不允许被中断,也就不能发生进程切换,因此也不可能发生两个进程同时访问临界区的情况。

在这里插入图片描述
优点: 简单、高效
缺点: 不适用于多处理机只适用于 OS内核进程,不适用于用户进程。(因为开/关中断指令只能运行在内核态,这组指令如果能让用户随意使用会很危险)

注意区分原语与原子操作:
原语是一种特殊程序,执行中不可中断,由开/关中断指令实现。
原子操作是一种执行过程,执行期间一气呵成,不可中断。


2.2.2 硬件指令法

  TestAndSet 指令,简称 TS 指令,也称 TestAndSetLock 指令,或 TSL 指令。TSL指令是 原子操作,执行过程中不可被中断。 以下是用C语言描述的逻辑:

在这里插入图片描述
相比软件实现方法,TSL 指令把 上锁和检查操作 用硬件的方式变成了一气呵成的 原子操作
优点: 实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞。适用于多处理机环境
缺点: 不满足 “让权等待” 原则,暂时无法进入临界区的进程会占用CPU并循环执行TSL指令,从而导致 忙等


  Swap 指令,也称 Exchange 指令,或简称 XCHG 指令。Swap 指令是 原子操作,其用硬件实现的,执行的过程不允许被中断,只能一气呵成。以下是用C语言描述的逻辑:

在这里插入图片描述
逻辑上来看 Swap 和 TSL 并无太大区别,都是先记录下此时临界区是否已经被上锁(记录在 old 变量上),再将上锁标记 lock 设置为 true,最后检查 old,如果 old 为 false 则说明之前没有别的进程对临界区上锁,则可跳出循环,进入临界区。Swap 指令优点缺点和TSL指令相同。


2.2.3 硬件实现方法总结

在这里插入图片描述


2.2.4 补充:互斥锁

  解决 临界区 最简单的工具就是 互斥锁 (mutex lock)。一个进程在进入临界区时应 获得锁,在退出临界区时 释放锁 。函数 acquire() 获得锁,而函数 release()释放锁。
  每个互斥锁有一个布尔变量 available,表示锁是否可用。如果锁是可用的,调用 acqiure()会成功,且锁不再可用。当一个进程试图获取不可用的锁时,会被阻塞,直到锁被释放。acquire() 或 release() 的执行必须是 原子操作,因此 互斥锁通常采用硬件机制来实现
在这里插入图片描述

优点: 等待期间不用切换进程上下文,多处理器系统中,若上锁的时间短,则等待代价很低。当多个进程共享同一 CPU时,就浪费了CPU 周期。因此,互斥锁通常用于多处理器系统,一个线程可以在一个处理器上等待,而不影响其他线程的执行,并快速释放临界区。

缺点:不满足 “让权等待” 原则。当有一个进程在临界区中,任何其他进程在进入临界区时必须连续循环调用 acquire(),因此会发生 忙等待


四、信号量

  用户进程可以通过使用操作系统提供的 一对原语 来对 信号量 进行操作,从而很方便的实现了进程互斥、进程同步。信号量其实就是一个变量 ,可以用一个信号量来表示系统中某种资源的数量,比如:系统中只有一台打印机,就可以设置一个初值为 1 的信号量。
  一对原语:wait(S) 原语和 signal(S) 原语,可以把原语理解为函数,函数名分别为 wait 和 signal,括号里的信号量 S 其实就是函数调用时传入的一个参数。wait(S) 原语和 signal(S) 原语也可记为P(S)、V(S)

4.1 整型信号量

整型信号量被定义为一个用于标识资源数目的整型信号量。wait(S)、signal(S)可描述为:

在这里插入图片描述
wait(S) 原语,“检查”和“上锁”一气呵成,避免了并发、异步导致的问题。以申请使用打印机举例:
在这里插入图片描述

存在的问题: 不满足 “让权等待” 原则,会发生 忙等

信号量机制与中断屏蔽法的区别:
① 中断屏蔽法:关中断、临界区、开中断整个执行过程是一个原子操作。
② 信号量机制:wait(S)与signal(S)是两个原子操作。

注:由于PV操作是原语,原语是由特权指令开关中断实现,因此也不适合与用户级线程。


4.2 记录型信号量

  记录型信号量不存在 忙等 现象的进程同步机制。除需要一个用于代表资源数目的整型信号量 value 以外,再增加一个 进程链表 L,用于链接所有等待该资源的进程。

在这里插入图片描述
例:某计算机系统中有1台打印机,则可在初始化信号量 S 时将 S.value 的值设为 1,队列 S.L 设置为空。
在这里插入图片描述

① CPU 为 P0 服务,S.value --,值为 0,P0开始使用打印机。
② CPU 为 P1 服务,S.value --,值为 -1,无资源执行 block 原语( wait原语 )。阻塞队列( P1 ),S.value = -1 说明有1个进程在等待资源。
③ CPU 为 P2 服务,S.value --,值为 -2,无资源执行 block 原语。阻塞队列( P1→P2 ),S.value = -2 说明有2个进程在等待资源。
④ CPU 为 P0 服务,S.value ++,S.value = -1 ≤ 0,说明有进程在等待该资源。因此应调用 wakeup 原语(signal原语)唤醒等待队列中的第一个进程P1,将释放资源给 P1,P1从阻塞态变为就绪态,等待被 CPU 服务(CPU顺序执行)。阻塞队列( P2 )
⑤ CPU 为 P1 服务,P1 使用完打印机,S.value ++,S.value = 0,调用 wakeup 原语唤醒 P2。阻塞队列()。
⑥ CPU 为 P2 服务, P2是用完打印机,S.value ++,S.value = 1。

注:考试中出现 P(S)、V(S) 的操作,除非特别说明,否则默认 S 为记录型信号量。


4.3 信号量实现进程同步、互斥与前驱关系

4.3.1 实现进程同步

  设 S 为实现进程 P1、P2 互斥的信号量,由于只允许一个进程进入临界区,所以 S 的初值应设为 1。然后把临界区置于 P(S) 和 V(S) 之间,进入区之前申请资源(P操作),退出区之前释放资源( V操作 ),即可实现两个进程对临界资源的互斥访问。
在这里插入图片描述

用信号量实现进程互斥:
① 分析并发进程的关键活动,划定临界区(如:对临界资源打印机的访问就应放在临界区)
设置互斥信号量 mutex,初值为 1(即可用资源数为1,理解为:进入临界区的名额)
在进入区 P(mutex) —— 申请资源
在退出区 V(mutex) —— 释放资源

注:对 不同的临界资源 需要设置 不同的互斥信号量P、V操作必须成对出现


4.3.2 实现进程同步

  设 S 为实现进程 P1、P2 同步的信号量,S 的初值应设为 0。只有当前一个进程释放资源后( V操作 ),后一个进程才可申请资源( P操作)。

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

用信号量实现进程同步:
① 分析什么地方需要实现同步关系,即必须保证一前一后(在两个进程中)
设置同步信号量 S,初始为 0
在 “前操作” 之后执行 V(S)
在 “后操作” 之前执行 P(S)


4.3.3 实现前驱关系(多级同步)

前驱关系本质上是 多级同步 的问题,每一对前驱关系都需要保证 一前一后 的操作。

下图是一个前驱图,其中 S1, S2, S3, … ,S6 是进程 P1, P2, P3,…, P6 中的程序段,这些程序段要求按如下前驱图所示的顺序来执行:
① 要为每一对前驱关系各设置一个同步信号量
② 在“前操作”之后对相应的同步信号量执行 V 操作
③ 在“后操作”之前对相应的同步信号量执行 P 操作

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


4.3.4 同步、互斥和前驱关系总结(★)

在这里插入图片描述
注:互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少。

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

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

相关文章

OpenMMLab 计算机视觉 # day2: 图像分类与基础视觉模型

相关资源: github 第二课 图像分类与基础视觉模型 图像分类 图像分类任务:给定一张图片,识别图像中的物体是什么 X∈RH∗W∗3→{1,2..,K}X\in R^{H*W*3} \rightarrow \{1,2..,K\}X∈RH∗W∗3→{1,2..,K}; 从图片中学习: …

Linux--Version Branch

参考链接1. Linux Version BranchLinux的发行版本大体分可为两类。一类是商业公司维护的发行版本,以Redhat(RHEL)为代表一类是社区组织维护的发行版本,以Debian为代表。2.Debian branchDebian系列主要包含Debian和Ubuntu等。Debia…

操作系统权限提升(十二)之绕过UAC提权-Windows UAC概述

系列文章 操作系统权限提升(一)之操作系统权限介绍 操作系统权限提升(二)之常见提权的环境介绍 操作系统权限提升(三)之Windows系统内核溢出漏洞提权 操作系统权限提升(四)之系统错误配置-Tusted Service Paths提权 操作系统权限提升(五)之系统错误配置-PATH环境变量提权 操作…

已解决TypeError: eval() arg 1 must be a string, bytes or code object

已解决TypeError: eval() arg 1 must be a string, bytes or code object 文章目录报错问题报错翻译报错原因解决方法联系博主免费帮忙解决报错报错问题 粉丝群里面的一个小伙伴,想用Python爬虫然后解析数据,但是发生了报错(当时他心里瞬间…

YOLOv8 Ultralytics:最先进的 YOLO 模型——简介+实战教程

YOLOv8 Ultralytics:最先进的 YOLO 模型 什么是 YOLOv8? YOLOv8 是来自 Ultralytics 的最新的基于 YOLO 的对象检测模型系列,提供最先进的性能。 利用以前的 YOLO 版本, YOLOv8 模型更快、更准确 ,同时为训练模型提…

unity Vuforia发布移动端,禁止相机权限,出绿屏,强制退出app,如何去掉PERMISSION ERROR

unity Vuforia发布移动端,禁止相机权限,出绿屏,强制退出app,如何去掉PERMISSION ERROR问题描述更改需求解决方案:总结💢💢版权声明问题描述 unityvuforia 发布移动端,运行时需要相机…

墨天轮《2022年中国数据库行业年度分析报告》正式发布,精彩抢先看

自2022年4月份起,墨天轮数据社区持续发布月度 《中国数据库行业分析报告》,目前已发布7期,点击超过10万次,下载近万次。 为总结过往,展望未来,墨天轮数据社区正式发布了《2022年中国数据库年度行业分析报告…

MAC(m1)-VsCode上传项目到GitHub仓库

安装Git集成插件: GitHub Pull requests 在Visual Studio Code中查看和管理GitHub拉取请求和问题 Git Graph Git图形化显示和操作 最新最全 VSCODE 插件推荐(2023版)_白墨石的博客-CSDN博客_vscode插件 在vscode使用git提交推送代码_水…

精选100个Python实战项目案例,送给缺乏实战经验的你

前言:随着 Python 语言的流行,越来越多的人加入到了 Python 的大家庭中。为什么这么多人学 Python ?我要喊出那句话了:“人生苦短,我用 Python!”,正是因为语法简单、容易学习,所以 …

Jetson 相机编码

Jetson 相机编码 Jetson相机编码是即将发布的“实践”系列的相关代码。有三个存储库: 1. camera-caps JetsonHacks Github存储库camera-caps 通过v4l2-ctl命令行工具提供了一个图形用户界面。您可能会发现,它可以方便地检查连接到Jetson上的V4L2相机的功能。这适…

复试算法练习Day17——从头到尾打印链表

复试算法练习Day17——从头到尾打印链表 题目描述 输入一个链表的头节点&#xff0c;按链表从尾到头的顺序返回每个节点的值&#xff08;用数组返回&#xff09;。 如输入{1,2,3}的链表如下图: 返回一个数组为[3,2,1] 0 < 链表长度 < 10000 示例1 输入&#xff1a;…

SpringMVC之JSON数据传输参数

目录 一&#xff1a;JSON普通数组 二&#xff1a;JSON对象数据 三&#xff1a;JSON对象数组 前面我们说过&#xff0c;现在比较流行的开发方式为异步调用。前后台以异步方式进行交换&#xff0c;传输的数据使用的是JSON,所以前端如果发送的是JSON数据&#xff0c;后端该如何…

C++11中的多线程的支持

C11中的多线程的支持 千禧年以后&#xff0c;主流的芯片厂商都开始生产多核处理器&#xff0c;所以并行编程越来越重要了。在C98中根本没有自己的一套多线程编程库,它采用的是C99中的POSIX标准的pthread库中的互斥锁,来完成多线程编程。 首先来简单一个概念:原子操作,即多线程…

目标检测框架在目标跟踪中的应用

目标检测框架在目标跟踪中的应用 从SiamRPN将跟踪问题定义为one-shot detection任务之后&#xff0c;出现了大量将检测组件由于跟踪的研究。不过Siamese系列一个很大的问题在于其本质仍然是一个模板匹配问题&#xff0c;网络关注的是寻找与target相似的东西&#xff0c;而忽视…

HCIA之数据发送过程

数据发送过程1、同广播域2、跨广播域&#xff08;需要将数据发送给网关&#xff0c;这通过路由器发包&#xff09;&#xff1a;总结1、同广播域 假设PC1要与PC2通讯&#xff1b; PC1不知道PC2的MAC地址&#xff0c;先发送ARP找到PC2的MAC地址&#xff1b; PC1知道了PC2的MAC地…

使用Python Seaborn绘制热力图(heatmap)的时候怎么改变配色

看到最近有些论文中会对Transformer encoder的attention weights进行可视化&#xff0c;通常会使用heatmap&#xff0c;我参考了一些博客&#xff0c;感觉已经总结得很详细了&#xff0c;例如这篇&#xff1a;python绘制热度图(heatmap)_黄思博呀的博客-CSDN博客_python heatma…

pm2:ecosystem.config.js

一、理解ecosystem.config.js1.1、字面理解&#xff1a;pm2生态系统配置文件。1.2、个人理解&#xff1a;pm2配置文件。类似于vite.config.ts、nuxt.config.ts。1.3、理解pm2&#xff1a;pm2 是一个带有负载均衡功能的Node应用的进程管理器。1.4、pm2的能力&#xff1a;1.4.1、…

【React】React入门(一)--React的创建、Jsx语法与组件以及状态(state)

&#x1f380;个人主页&#xff1a;努力学习前端知识的小羊 感谢你们的支持&#xff1a;收藏&#x1f384; 点赞&#x1f36c; 加关注&#x1fa90; 文章目录React简介react的特性虚拟Dom传统dom更新虚拟Domcreate-react-appJSX语法与组件jsx语法class组件函数组件组件嵌套组件…

基于Springboot搭建java项目(三十六)—— 服务监控工具WGCLOUD

服务监控工具WGCLOUD 一、服务监控 ​ “要想晚上睡的好&#xff0c;服务监控少不了”&#xff0c;服务器监控是应用程序开发中必不可少的一部分&#xff0c;做好服务监控有以下几个优点&#xff1a; 能够及时发现应用程序的漏洞能够定位到程序运行的瓶颈&#xff0c;查看程…

一篇搞懂SQL

前言 根据廖雪峰老师的教程&#xff0c;整理出一篇文章 一&#xff0c;为什么需要数据库&#xff1f; 小量的数据可以使用excel或者cvs存储&#xff0c;但是大批量的数据&#xff0c;这些都无法满足需求。如何管理这些数据就成了大问题。 所以&#xff0c;数据库作为一种专门…