操作系统基础:进程同步【中】

在这里插入图片描述

在这里插入图片描述

🌈个人主页:godspeed_lucip
🔥 系列专栏:OS从基础到进阶


  • 1 进程同步(中)
    • 1.1 信号量机制
      • 1.1.1 总览
      • 1.1.2 什么是信号量机制
        • 1.1.2.1 什么是信号量
        • 1.1.2.2 什么是原语
        • 1.1.2.3 "一对原语" 指的是什么
        • 1.1.2.4 什么是信号量机制
      • 1.1.3 整型信号量
        • 1.1.3.1 解释
        • 1.1.3.2 实现过程
        • 1.1.3.3 缺点
      • 1.1.4 记录型信号量
        • 1.1.4.1 解释
        • 1.1.4.2 信号量的定义
        • 1.1.4.3 PV操作的定义
        • 1.1.4.4 实例
        • 1.1.4.5 特征
      • 1.1.5 总结
    • 1.2 信号量实现进程互斥、同步、前驱关系
      • 1.2.1 总览
      • 1.2.2 信号量实现进程互斥
        • 1.2.2.1 步骤
        • 1.2.2.2 信号量的数据结构
        • 1.2.2.3 mutex的具体实现过程
        • 1.2.2.4 实现互斥的逻辑
        • 1.2.2.5 注意点
      • 1.2.3 信号量实现就进程同步
        • 1.2.3.1 什么是进程同步问题?
        • 1.2.3.2 实现的步骤
      • 1.2.4 信号量机制实现前驱关系
        • 1.2.4.1 什么是前驱关系
        • 1.2.4.2 解决思路
      • 1.2.5 总结
    • 1.3 生产者-消费者问题
      • 1.3.1 PV问题的分析思路
      • 1.3.2 问题描述
      • 1.3.3 问题分析
        • 1.3.3.1 关系分析(确定有哪些)
        • 1.3.3.2 整理思路(确定PV操作的大致顺序)
        • 1.3.3.3 设置信号量
      • 1.3.4 代码实现
        • 1.3.4.1 关于生产者
        • 1.3.4.2 关于消费者
        • 1.3.4.3 关键代码
      • 1.3.5 能否改变相邻P、V操作的步骤
      • 1.3.6 总结
    • 1.4 多消费者-多生产者问题
      • 1.4.1 PV问题的分析思路
      • 1.4.2 问题描述
      • 1.4.3 问题分析
        • 1.4.3.1 关系分析(确定同步互斥关系)
        • 1.4.3.2 整理思路(确定PV操作顺序)
        • 1.4.3.3 设置信号量
      • 1.4.4 代码
      • 1.4.5 总结
  • 🕮 2 总结


1 进程同步(中)

1.1 信号量机制

1.1.1 总览

image1

1.1.2 什么是信号量机制

1.1.2.1 什么是信号量

image2

1.1.2.2 什么是原语

image3

1.1.2.3 “一对原语” 指的是什么

image4

1.1.2.4 什么是信号量机制

image5
既然信号量可以是多种类型,自然而然的我们就想到要去探讨这些不同的类型。

1.1.3 整型信号量

1.1.3.1 解释

image6
它与一般的整型变量的区别在于,它只有初始化、P操作、V操作三种操作

1.1.3.2 实现过程

image7

1.1.3.3 缺点

假如进程一直得不到资源,那么它就会一直占用处理机。

1.1.4 记录型信号量

1.1.4.1 解释

image8

1.1.4.2 信号量的定义

image9

1.1.4.3 PV操作的定义

image10

1.1.4.4 实例

假设有四个进程都想使用打印机,如图。且打印机的数量S为2台
image11
(1)P0最先执行,先执行wait,它会将S-1,并转入使用打印机的代码。接着,P1执行,先执行wait,它也会将S-1,并转入使用打印机的代码
(2)P2执行wait时先将S-1,此时S<0,为-1。故P2执行BLOCK原语,将自己加入阻塞队列。P3的执行过程与P2类似。此时,S=-2,阻塞队列中有2个进程
(3)P0执行打印机完毕,它会执行Signal,将S+1,此时S=-1,执行Wakeup原语唤醒阻塞队列,于是最先进入队列的P2开始使用打印机。接着,P2执行打印机完毕,它会执行Signal,将S+1,此时S=0,执行WakeUp唤醒阻塞队列,于是队列最前的P3开始使用后打印机。
(4)最终,P1使用打印机完毕,它会执行Signal,将S+1,此时S=1,无须执行wakeUp。接着P3使用打印机完毕,执行SIgnal将S+1,此时S=2,无须执行WakeUp。

1.1.4.5 特征

image12
PV操作上是一种低级的进程通信原语,它是不可以被中断的。

1.1.5 总结

image13

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

1.2.1 总览

image1

1.2.2 信号量实现进程互斥

1.2.2.1 步骤

image2
注意:划分临界区指的是分析哪些资源应该被划分为临界资源(比如打印机的使用、摄像头的使用)

1.2.2.2 信号量的数据结构

image3

1.2.2.3 mutex的具体实现过程

image4

1.2.2.4 实现互斥的逻辑

Mutex相当于一个访问临界资源S的名额。进程在试图访问一个临界资源时,首先执行P操作,将S-1,假如此时S<0,说明此时S没有名额访问,进程将自己加入阻塞队列;假如S>=0,说明S可以访问。进程执行V操作将S+1,假如此时S<=0,说明阻塞队列中有进程在等待访问资源,执行唤醒操作。

1.2.2.5 注意点

image5

1.2.3 信号量实现就进程同步

1.2.3.1 什么是进程同步问题?

image6

1.2.3.2 实现的步骤

(1)假设P1的②必须在P2的④之前执行。如图
image7
(2)使S的值初始为0
image8
关于S的理解:
image9

(3)描述
image10

1.2.4 信号量机制实现前驱关系

1.2.4.1 什么是前驱关系

image11
image12
如图,里面包含了很多前驱关系,比如S1->S2,S1->S3,S2->S4…

1.2.4.2 解决思路

结合之前实现进程同步的思路,在前面执行的进程必须有该种资源的V操作,在后面执行的进程必须有该种资源的P操作,资源的初始值设为0。

由于不同的前驱关系相互不会造成影响,所以每一种前驱关系都对应一种不同的临界资源,
image13

3. 具体实现
image14

1.2.5 总结

image15

1.3 生产者-消费者问题

1.3.1 PV问题的分析思路

image1

1.3.2 问题描述

image2示意图如下:
image3

1.3.3 问题分析

1.3.3.1 关系分析(确定有哪些)

题目中一共有3个进程,分别为生产者生产进程,消费者消费进程,访问缓冲区的进程。
他们的同步互斥关系为
(1)只有当缓冲区不满时,生产者才可以生产
(2)只有当缓冲区不空时,消费者才可以消费
(3)同一时间只可以有单独的对象访问缓冲区

1.3.3.2 整理思路(确定PV操作的大致顺序)

因为有三个同步互斥关系,可以设置三种资源。
(1)缓冲区不满的资源:Empty
(2)缓冲区不空的资源:Full
(3)缓冲区的资源:Mutex
它们的关系如图:
image4

1.3.3.3 设置信号量

初始时,缓冲空间内没有物品,为空。且缓冲空间没有被访问,为1
Empty,初始为n(同步信号量)
Full,初始为0(同步信号量)
Mutex,初始为1(互斥信号量)
image5

1.3.4 代码实现

1.3.4.1 关于生产者

生产者在生产之前需要先申请一个空位置(Empty-1),对应Empty的P操纵。之后需要申请缓冲空间的使用(Mutex-1),对应Mutex的P操作。之后先进行Mutex的V操作,释放缓冲区的资源。可以思考,生产者会不会执行V(Empty)呢?答案是不会,因为生产者肯定不会使资源减少,它在生产之后会使Full+1,对应Full的V操作。

1.3.4.2 关于消费者

消费者在消费之前需要先申请一个资源(Full-1),对应Full的P操作。之后需要申请缓冲空间的使用(Mutex-1),对应Mutex的P操作。之后先进行Mutex的V操作,是否缓冲区的资源。可以思考,生产者会不会执行V(Full)呢?答案是不会,因为消费者肯定不会使资源增加,它在消费之后会使Empty+1,对应Empty的V操作。

1.3.4.3 关键代码

image6
While(1)表示生产者会一直不断的生产、消费者会一直不断地消费

1.3.5 能否改变相邻P、V操作的步骤

1. 改变相邻P操作的顺序
对于生产者,假如它会先申请Mutex,再申请消耗一个空闲区;对于消费者,它会先申请Mutex,再申请消耗一个Full空间。那么,假如此时Empty=0,Full为n,那么生产者会进入睡眠,等待消费者消耗产品并将其唤醒;而消费者发现Mutex没有多余,所以它会等待生产者使用完Mutex将其唤醒。此时二者相互等待对方的唤醒,进入了死锁。
可以看出,不可以改变相邻P操作

2. 改变相邻V操作的顺序
对于生产者,先执行V(Full)再执行V(Mutex)都是起到释放资源的作用,不会造成死锁。对于消费者同理。

3. 将生产者生产资源的过程加到PV操作之间逻辑上并不会造成死锁,但是这样会造成进程访问临界资源的时间过长,不利于系统的稳定。对于消费者同理。

1.3.6 总结

只可以生产一种产品的单生产者
image7

1.4 多消费者-多生产者问题

1.4.1 PV问题的分析思路

image1

1.4.2 问题描述

image2
解释:多个生产者生产不同类别的产品,多个消费者消费不同类别的产品,存储空间的容量有限
示意图:
image3

1.4.3 问题分析

1.4.3.1 关系分析(确定同步互斥关系)

(1)进程
共有四个进程
父亲生产苹果、母亲生产橘子、女儿消费苹果、儿子消费橘子
(2)同步关系
①只有当盘子中有苹果时,女儿才消费苹果
②只有当盘子中有橘子时,儿子才消费橘子
③只有当盘子中没有水果时,父亲、母亲才生产
(3)互斥关系
四个进程对盘子的访问必须是互斥的

1.4.3.2 整理思路(确定PV操作顺序)

因为有四种同步互斥关系,因此必须设置四个临界资源
(1)苹果资源:Apple
(2)橘子资源:Orange
(3)盘子资源:Mutex
(4)盘子容量资源:Plate
它们的关系如图
image4

1.4.3.3 设置信号量

初始时Apple、Orange都没有,为0,Plate中没有水果,初值为n,没有进程访问盘子,Mutex初值为1。

1.4.4 代码

1. 对于生产者1(父亲)
生产者1首先会申请一个盘子的容量,执行P(Plate),将Plate-1,接着会占用存储空间,执行P(Mutex),将Mutex-1。接着将苹果放入盘子,执行V(Apple),使Apple+1,假如此时Apple<=0,说明此时有消费者在排队消费,会执行WakeUp,唤醒消费者(女儿)进行消费。最后会释放占用的存储空间,执行V(Mutex)。
对于生产者2(母亲)也是类似的操作。

2. 对于消费者(女儿)
消费者1首先会申请减少一个Apple的容量,执行P(Apple-1),将Apple-1。接着,消费者1会申请占用存储空间,执行P(Mutex),使Mutex-1。最后女儿从盘子中取出苹果。接着执行V(Plate)操作,将容量+1,假如此时Plate<=0,说明有生产者在等待,执行唤醒语句,唤醒等待队列中第一个生产者。最后会释放存储空间,执行V(Mutex)。
对于消费者2(儿子)也是类似的操作。

3. 关键代码
image5

4. 改进
因为盘子的容量为1,所以同一时刻最多只有一个进程可以进入盘子,达到了互斥访问的目的。因此当Plate=1时,Mutex可以省略不写。

试想,当盘子容量为2且没有互斥信号量Mutex时,父亲与母亲都可以在同一时间访问盘子,可能会造成错误。

1.4.5 总结

只可以生产一种产品的多生产者
image6

一个重要的注意点:
image7

🕮 2 总结

操作系统,如默默守护的守夜者,无声地管理硬件与软件的交流,为计算机创造和谐秩序。

它是无形的引导者,让复杂的任务变得井然有序,为用户提供无忧体验。

操作系统的巧妙设计,让计算机变得更加智能高效,让人与科技之间的交流更加顺畅。

在每一次启动中,它如信任的伙伴,带领我们进入数字世界的奇妙旅程。

渴望挑战操作系统的学习路径和掌握进阶技术?不妨点击下方链接,一同探讨更多操作系统的奇迹吧。我们推出了引领趋势的💻OS专栏:《OS从基础到进阶》 ,旨在深度探索OS的实际应用和创新。🌐🔍

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

SD卡写保护无法格式化怎么办?

一般来说&#xff0c;写保护&#xff08;也称为只读&#xff09;是数据存储设备防止写入新数据或修改旧信息的能力。换句话说&#xff0c;您可以读取存储在磁盘上的信息&#xff0c;但是却不能删除、更改或复制它们&#xff0c;因为访问会被拒绝。那么SD卡有写保护怎么格式化呢…

【方法】RAR分卷压缩文件如何打开?

当RAR压缩文件比较大&#xff0c;不利于传输时&#xff0c;我们可以把文件压缩成分卷文件&#xff0c;那压缩后的分卷文件如何打开呢&#xff1f;今天就来说说RAR分卷压缩文件的两种打开方法。 方法一&#xff1a; 和普通压缩包一样&#xff0c;打开分卷压缩包也需要用到解压…

数据结构day7

1.思维导图 1.二叉树递归创建 2.二叉树先中后序遍历 3.二叉树计算节点 4.二叉树计算深度。 5.编程实现快速排序降序

git clone常见问题一览及解决方法

在使用Ubuntu下&#xff0c;终端运行git clone命令时会遇见许多问题&#xff0c;本文主要针对一些常见的问题进行整理。关于换源问题&#xff0c;推荐使用小鱼的一键换源。 1.git clone 速度过慢 1.1 魔法 这个方法不做过多赘述&#xff0c;ubuntu下个人使用发现体验良好&am…

c++的并发操作(多线程)和 while 优先级 已解决

C11标准在标准库中为多线程提供了组件&#xff0c;这意味着使用C编写与平台无关的多线程程序成为可能&#xff0c;而C程序的可移植性也得到了有力的保证。另外&#xff0c;并发编程可提高应用的性能&#xff0c;这对对性能锱铢必较的C程序员来说是值得关注的。 1. 何为并发 …

day38_MySQL

今日内容 0 复习昨日 1 引言 2 数据库 3 数据库管理系统 4 MySQL 5 SQL语言 0 复习昨日 1 引言 1.1 现有的数据存储方式有哪些&#xff1f; Java程序存储数据&#xff08;变量、对象、数组、集合&#xff09;&#xff0c;数据保存在内存中&#xff0c;属于瞬时状态存储。文件&…

编译opencv4.6问题汇总,第三方软件包见我发的资源

win10系统 python3.8.2&#xff0c;cmake-3.15.5-win64-x64&#xff0c;opencv4.6 编译方式见&#xff1a;OpenCV的编译 - 知乎 本文主要总结问题。赠人玫瑰手留余香。 问题1 Problem with installing OpenCV using Visual Studio and CMake (error code: MSB3073) 解决方法…

Qt+css绘制标题

之前学过html和小程序&#xff0c;帮老师做项目的时候也用过vue&#xff0c;在想qt绘制界面是不是也可以使用css,然后查了一些资料&#xff0c;绘制了一个标题&#xff0c;准备用到智能家居的上位机上面。 成果 源码 重写了paintEvent函数和TimeEvent函数&#xff0c;一个用于绘…

CAM350开短路检查操作

本质: 使用CAM350进行开短路检查,实际就是从Gerber文件中提取网表与从Allegro中产生的IPC-D-356A格式网表进行比较。 1.首先打开CAM350,导入网表: 2.设置各层的属性类型: (1)精度设置,这里需要和Allegro中出Gerber文件时设置的精度保持一致,坐标和零压缩设置保持默认…

抵御.360勒索病毒威胁:解密文件的有效方法与预防措施

导言&#xff1a; 近来&#xff0c;网络犯罪的一种新型形式——.360勒索病毒&#xff0c;备受关注。这种病毒通过加密用户文件&#xff0c;要求支付赎金以获取解密密钥。本文91数据恢复将深入介绍.360勒索病毒的特点&#xff0c;同时提供一些有效的恢复方法&#xff0c;并分享…

docker在windows创建卷后本地找不到

使用 docker volume create html 创建卷之后虽然能成功创建&#xff0c;但是通过 docker inspect html 查看文件地址时给出的Mountpoint地址却是 D:\nacos\docker>docker inspect html [{"CreatedAt": "2024-01-31T03:51:23Z","Driver":…

【Java程序设计】【C00171】基于SSM的智慧篮球馆预约管理系统(论文+PPT)

基于SSM的智慧篮球馆预约管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的智慧篮球馆预约管理系统 本系统分为前台、管理员以及学生3个功能模块。 前台&#xff1a;当游客打开系统的网址后&#xff0c;首先看到…