进程的同步与互斥

news2024/12/28 3:15:07

相关概念

  1. 临界资源与临界区
    • 临界资源:同一时刻只能由一个进程使用的资源。
      • 如打印机、磁带机、绘图仪等物理设备;由不同进程共享的消息队列、变量、数据、文件等软件资源
    • 临界区:程序中访问临界资源的那一部分代码
      • 进入区、退出区、剩余区:为了保证临界资源的互斥使用,每个进程在进入临界区前,必须检查该临界资源是否空闲。因此临界区前面必须有一段代码用于对临界资源的检查,这段代码称为进入区。同样的,临界区之后必须有一个退出区,表明进程已经释放了相应的临界资源。代码的剩余部分称为剩余区
  2. 同步与互斥
    • 互斥关系:又称进程的间接相互制约关系。几个进程并发执行,由于需要互斥访问系统中的临界资源,因而形成的相互制约的关系。互斥是竞争关系
    • 同步关系:又称进程的直接相互制约关系。几个进程为了完成一项任务而规定的执行顺序问题,是进程的执行先后问题。同步是协作关系
    • 由于互斥和同步这两种制约关系的存在,进程在执行过程中,是否能获得处理器以及以何种速度向前推进,并不由进程本身控制,这就是进程的异步性。这可能导致进程以不正确的顺序访问共享资源,也可能造成进程每次的运行结果不一致。这些错误往往与时间有关,因此称为“时间相关的错误”。为防止这类错误,必须协调进程的执行顺序,确保它们按顺序执行
  3. 同步机制设计准则
    • 空闲让进
    • 忙则等待
    • 有限等待:对于请求访问临界资源的进程,必须保证它能在有限时间内进入对应的临界区
    • 让权等待:若一个进程无法进入临界区,应立即释放处理器,避免出现“忙等”,以提高处理器利用率
  4. 实现临界区互斥的基本方法
    • 软件同步机制
      • 单标志法
      • 双标志先检查法
      • 双标志后检查法
      • Perterson算法
    • 硬件同步机制
      • 关中断方法
      • 硬件指令方法
        • TSL(TestAndSetLock)指令
        • Swap指令(XCHG指令)
    • 这七种方法都无法解决“让权等待”准则,因此有了下面的信号量机制

在概念理解的基础上应用信号量机制实现多进程的同步和互斥问题

  1. 信号量
    • 原理:在几个进程之间使用简单的信号来实现同步。在这个过程中,一个进程可以被阻塞在某个特定位置,直到它收到一个特殊信号,方可继续运行。一个信号量对应一种资源,信号量的值等于该资源的剩余数量。P(S)表示申请申请一个资源S,V(S)表示释放一个资源S
    • 类型
      • 整型信号量
      • 记录型信号量:在整型信号量的基础上,增加了一个被阻塞进程的队列,用于链接所有等待相应资源的进程,从而实现让权等待
      • 互斥量:在记录型信号量的基础上,规定信号量的值只能为0或1(信号量的值不再表示系统中的资源数量,而是表示某个临界区在此时能否访问),且加锁(P操作)和解锁(V操作)必须在同一个进程进行。
    • 应用
      • 利用信号量实现进程互斥:当两个进程需要互斥访问某一临界资源时,每个进程在访问临界区前需对互斥量mutex执行P操作,退出临界区后对互斥量mutex执行V操作
        semaphore mutex = 1; // 互斥量的初始值为1
        Process_A{
        	while (true){
        		P(mutex);  // 加锁
        		访问临界区;
        		V(mutex);  // 解锁
        		剩余区;
        	}
        }
        
        Process_B的代码同上
        
      • 利用信号量实现进程同步:假设两个进程要协同修改一个文件, P A P_A PA先修改, P B P_B PB后修改,则在两个进程中分别执行P、V操作
        semaphore S = 0;
        Process_A{
        	修改文件;
        	V(S);  // 表示修改完毕
        }
        
        Process_B{
        	P(S);  // 判断修改是否完成
        	修改文件;
        }
        
      • 利用信号量实现前驱关系:为每一个直接前后驱关系设置一个信号量,并初始化为0
        请添加图片描述
  2. 经典同步问题
    • 生产者-消费者问题
    • 哲学家进餐问题
    • 读者-写者问题
  3. 管程
    • 出现原因:虽然信号量机制可以解决进程的同步与互斥问题,但每个希望访问临界资源的进程都必须分别定义自己的PV操作,这样会使众多同步操作分散在各个进程中。不仅让系统难以管理,而且可能会因为误用同步操作,导致死锁发生。因此引入了新的进程同步工具----管程
    • 管程的作用:管程是一个软件模块,进程对共享资源的请求、释放和其他操作都必须通过同一个管程来实现。当多个进程请求访问同一资源时,会根据资源的情况接受或拒绝,确保每次只有一个进程进入临界区,有效实现进程互斥
      • 集中管理分散于不同进程的临界区
      • 防止进程违反同步操作
      • 便于用高级语言编写程序、检查程序的正确性
    • 管程的特性:
      • 共享性:管程可以被系统中的不同进程以互斥方式访问,是一种共享资源
      • 安全性:管程的过程只能访问属于本管程的局部变量
      • 互斥性:进程对管程的访问是互斥的。在任何时候,一个管程中只能有一个活动进程【【【【【【【????管程是临界资源,那么是否需要用一个管程来管理管程的访问???套娃???】】】
      • 封装性:管程中的过程只能使用管程中的数据结构,同时,管程中的数据结构都是私有的,只能在管程中使用,进程可以通过调用管程中的过程来使用临界资源
    • 管程的语法描述:将表达共享资源的数据结构和对其进行操作的进程封装在一个对象中,并封装了同步操作,从而对进程隐藏同步的细节,简化了调用同步功能的接口。管程由以下四部分组成:
      • 程序的名称
      • 程序本地的共享数据结构
      • 一组对数据结构进行操作的程序
      • 一条初始化本地共享数据的语句
      Monitor monitor_name{ // 管程名
      	share variable declarations;  // 共享变量说明
      	cond declarations;  // 条件变量说明
      	public:  // 能被进程调用的过程
      		void P1{  // 对数据结构操作的过程
      			...
      		}
      		void P2{
      			...
      		}
      		...
      		{  // 管程主体
      			initialization code;  // 初始化代码
      			...
      		}
      }
      
    • 条件变量

为什么需要进程同步

现代操作系统中多道程序异步并发,虽然可以有效提高资源利用率,大大增加系统吞吐量,但也使得系统更加复杂。每个进程的运行结果存在不可再现性,以及程序的执行存在不确定性。

因此为了确保多个进程有序执行,需要在多道程序系统中引入进程同步机制。具体来说,单处理器系统中的进程同步机制有:软/硬件同步机制、信号量机制、管程机制等,这些机制用于保证程序执行结果的可再现性

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

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

相关文章

六、MySql表的增删改查

CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除) 文章目录 一、Create(一)语法(二)案例(三)插入情况1.单行数据 全列插入2.多行数据 指定…

Matlab之数组字符串函数汇总

一、前言 在MATLAB中,数组字符串是指由字符组成的一维数组。字符串可以包含字母、数字、标点符号和空格等字符。MATLAB提供了一些函数和操作符来创建、访问和操作字符串数组。 二、字符串数组具体怎么使用? 1、使用单引号或双引号括起来的字符序列 例…

日常开发小汇总(5)数组克隆、伪数组转换为真数组、随机排序

slice 切割数组实现克隆是浅拷贝 let arr [1,2, {name:1}] let newarr arr.slice(0); console.log(newarr) //[1,2, {name:1}] newarr[2].name 666; console.log(arr[2].name);//666 JSON实现克隆 深拷贝 let arr [1,2, {name:1}] let newarr JSON.parse( JSON.stringi…

【JS面试题】如何通过闭包漏洞在外部修改函数中的变量

✍️ 作者简介: 前端新手学习中。 💂 作者主页: 作者主页查看更多前端教学 🎓 专栏分享:css重难点教学 Node.js教学 从头开始学习 ajax学习 前端面试题 文章目录 什么是闭包例 如何在函数外部修改闭包中变量 什么是闭包 闭包这个东西对新…

linux--进程通信--管道通信

IPC是各种进程间通信方式的统称。 进程间通信:是指在不同进程之间传播或交换信息。 IPC的方式通常有: 单机:管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、 多机:Socket、Streams等 1、管道…

【计算机组成原理】十个问题带你走进计算机组成的世界

十个问题带你走进计算机组成的世界 你知道 a 1 2 这条代码是怎么被 CPU 执行的吗? 在计算机中,数据和指令是分开区域存放的,存放指令的区域的地方称为正文段,存放数据的区域称为数据段。 例如下图中,数据1和数据2…

Redis配置

关系型数据库和非关系型数据库 ①了解关系和非关系 关系型数据库 一个结构化的数据库,创建在关系模型基础上,一般面向于记录,包括Oracle、MySQL、SQL Server、Microsoft Access、DB2、postgreSQL等 非关系型数据库 除了主流的关系型数据库…

java 歌词解析 源代码, 在windows10下调试运行成功。

需要两个素材。 歌词与音乐.wav package week3.exam6;public class Info {private final String info;public Info(String info){this.infoinfo;}public String getInfo() {return info;}public String toString(){return info;} }package week3.exam6;public class Lyric ext…

华为云新用户云服务器优惠价格表

华为云服务器作为业界领先的云服务提供商之一,一直致力于为全球用户提供高效、稳定、安全的云服务。为了帮助新用户更好地了解华为云服务器的价格和优惠活动,本文将详细介绍华为云服务器对新用户的优惠价格表。 一、华为云耀云服务器L实例价格表 华为云…

JavaScript基础知识09——数据类型

哈喽,大家好啊,这里是雷工笔记,我是雷工。 数据类型比较常见,无论是对程序员,还是电气工程师来说,都再熟悉不过了,这里跟着教程了解一下,主要看跟自己以往在其他PLC,C#&a…

2023-09-09 LeetCode每日一题(课程表)

2023-09-09每日一题 一、题目编号 207. 课程表二、题目链接 点击跳转到题目位置 三、题目描述 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中…

【牛客面试必刷TOP101】Day2.判断链表中是否有环和链表中倒数最后k个结点

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!&#xff…

python-jieba库

jieba库,python提供的中文分词函数库的第三方库,它可以将一段中文文本分割成中文词语序列。 安装jieba库 pip install jiebajieba的三个模式 全模式 - - - jieba.lcut(s,cut_allTrue) - - - 速度非常快,但有冗余数据 精确模式(…

窗口延时、侧输出流数据处理

一 、 AllowedLateness API 延时关闭窗口 AllowedLateness 方法需要基于 WindowedStream 调用。AllowedLateness 需要设置一个延时时间,注意这个时间决定了窗口真正关闭的时间,而且是加上WaterMark的时间,例如 WaterMark的延时时间为2s&…

嵌入式开发-绪论

目录 一.什么是嵌入式 1.1硬件系统 1.2软件系统 二.嵌入式应用场景 2.1消费电子 2.1.1智能家居 2.1.2影音 2.1.3家用电器 2.1.4玩具游戏机 2.2通信领域 2.2.1对讲机 2.2.2手机 2.2.3卫星 2.2.4雷达 2.3控制领域 2.3.1机器人 2.3.2采集器PLC 2.4金融 2.4.1POS…

快速文件复制与删除工具,将复制时文件夹里的原文件删除掉

无论是工作还是生活,我们都离不开文件的复制和管理。然而,手动复制文件不仅费时费力,而且容易出错。现在,我们为您推荐一款快速文件复制与删除工具,让您的文件管理更加高效! 首先,我们要进入文…

MybatisPlus分页插件使用

一. 效果展示 二. 代码编写 2.1 pom <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version> </dependency>2.2 添加配置类 Configuration MapperScan(…

推荐一款程序员截图神器!

快来看一下程序员必备的一款截图工具 今天就来和大家说一下作为程序员必备截图神器&#xff0c;几乎每一个程序员都会设置开机自启&#xff0c;因为这个截图功能太太太好用了&#xff01;&#xff01;&#xff01;只要你在键盘上按下F1就可以轻松截取整个屏幕&#xff0c;然后…

51单片机项目(9)——基于51单片机的电子琴设计

简易电子琴设计设计内容: 1.用矩阵键盘代表琴键&#xff0c;至少能弹出8个音符&#xff0c;分别是:音符1.23.4.,5,6, 2.键按下的时间长短表征节拍的长短&#xff0c;用蜂鸣器发出声音 3.数码管显示出当前音符 4.音量可调 &#xff08;代码及其工程文件放在最后&#xff09; …

vue中的几种name属性

vue中的几种name属性 组件名name name选项 export default{name:xxx } // 获取组件的name属性 this.$options.namevue-devtools调试工具里显示的组件名称&#xff1b; 未配置name选项&#xff0c;就是组件的文件名&#xff1b; vue3配置name通过defineOptions()函数 de…