DJ2-4 进程同步(第一节课)
目录
2.4.1 进程同步的基本概念
1. 两种形式的制约关系
2. 临界资源(critical resource)
3. 生产者-消费者问题
4. 临界区(critical section)
5. 同步机制应遵循的规则
2.4.2 硬件同步机制
1. 关中断
2. Test-and-Set 指令
3. Swap 指令
4. 小结
进程的异步性必然导致若干进程对系统资源进行无序争夺,从而导致系统混乱。为保证多个进程能有条不紊地运行,在多道程序系统中,必须引入进程同步机制。
进程同步进制的主要任务:是使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。
2.4.1 进程同步的基本概念
1. 两种形式的制约关系
1)间接相互制约关系。由于共享系统资源。
2)直接相互制约关系。由于进程之间的相互合作。
2. 临界资源(critical resource)
一次仅允许一个进程访问的资源为临界资源 。
3. 生产者-消费者问题
1)问题描述
有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有 n 个缓冲区的缓冲池,生产者进程将其所生产的产品放入一个缓冲区中;消费者进程可从一个缓冲区中取走产品去消费。
2)解决方法
变量定义如下:
int in = 0; //数组单元输入指针
int out = 0; //数组单元输出指针
int count = 0; //记录缓冲池产品数
item buffer[n]; //具有n个缓冲区的缓冲池
缓冲池是被组织成循环缓冲的。
在生产者进程中使用一个局部变量 nextp,用于暂时存放每次刚刚生产出来的产品;而在消费者进程中,则使用一个局部变量 nextc,用于存放每次要消费的产品。
生产者
void producer() {while(1) {//produce an item in nextpwhile(count == n); //缓冲池已满,do no-opbuffer[in] = nextp; //放入产品in = (in + 1) % n; //指向下一个数组单元count = count + 1; //缓冲池产品数加一}
}
消费者
void consumer() {while(1) {while(count == 0); //缓冲池已空,do no-opnextc = buffer[out]; //取出产品out = (out + 1) % n; //指向下一个数组单元count = count - 1; //缓冲池产品数减一//consume the item in nextc}
}
3)存在问题
虽然上面的生产者程序和消费者程序在分别看时都是正确的,而且两者在顺序执行时其结果也会是正确的,但若并发执行时就会出现差错,问题就在于这两个进程共享变量 count 。
假设 count 初值为 5 。生产者对它做加 1 操作,消费者对它做减 1 操作,这两个操作在用机器语言实现时,分别可用以下形式描述。
reg1 = count; |reg2 = count;
reg1 = reg1 + 1; |reg2 = reg2 - 1;
count = reg1; |count = reg2;
祖传计组图。
实际执行时,由于时间片完可能导致两段程序中各语句穿插执行。
reg1 = count; (reg1=5)
reg1 = reg1 + 1; (reg1=6)
reg2 = count; (reg2=5)
reg2 = reg2 - 1; (reg2=4)
count = reg1; (count=6)
count = reg2; (count=4)
倘若再将两段程序中各语句交叉执行的顺序改变,将可看到其它答案。这表明程序的执行已经失去了再现性。为了预防产生这种错误,解决此问题的关键是把变量 count 作为临界资源处理,亦即,令生产者进程和消费者进程互斥地访问变量 count 。
4. 临界区(critical section)
把在每个进程中访问临界资源的那段代码称为临界区。
把一个访问临界资源的循环进程描述如下:
while(true) {进入区:检查有无进程进入。临界区:进程访问临界资源。退出区:将访问标志复位。剩余区:其它部分的代码。
}
5. 同步机制应遵循的规则
1)空闲让进
当无进程处于临界区时,应允许一个请求进入临界区的进程立即进入自己的临界区。
2)忙则等待
当已有进程进入临界区时,其它试图进入临界区的进程必须等待。
3)有限等待
对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区,以免陷入 “死等” 状态。
4)让权等待
当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入 “忙等” 状态。
2.4.2 硬件同步机制
利用计算机硬件指令来解决临界区问题。对临界区管理时,将标志看作一把 “锁” 。
- 初始时锁是打开的。
- 进入临界区前,进程必须先进行 “锁测试” 。
- “锁开” 则进入,“锁关” 则等待。
- “锁开” 进入时,应立即将其锁上,以防止其它进程进入。
- “锁测试” 和关锁操作必须是连续的(原子操作)。
计算机硬件提供了三大指令:关中断、Test-and-Set 指令、Swap 指令。
1. 关中断
原理:在进入锁测试之前关闭中断,直到完成锁测试并上锁之后才能打开中断。这样,进程在临界区执行期间,计算机系统不响应中断,从而不会引发调度。
缺点:
- 滥用关中断权利可能导致严重后果(与系统安全相关的中断无法被响应)
- 关中断时间过长会影响系统效率
- 不适用于多 CPU 系统(这个关了还有那个)
2. Test-and-Set 指令
TS 指令的一般性描述如下:
boolean TS(boolean * lock) {boolean old;old = * lock;* lock = true;return old;
}
利用 TS 指令实现互斥的循环进程结构可描述如下:
do {//...while TS(&lock); //entry section//... //critical sectionlock = false; //exit section//... //remainder section
} while(true);
do ... while ... 记得最后的分号。
在进入区,若恒有 lock == true,则代表临界区已上锁,其它试图进入临界区的进程必须等待。
3. Swap 指令
Swap 指令在 8086/8088 中又称为 XCHG 指令,用于交换两个字的内容。
Swap 指令的一般性描述如下:
void swap(boolean * a, boolean * b) {boolean temp;temp = * a;* a = * b;* b = temp;
}
为每个临界资源设置一个全局的 boolean 变量 lock,其初值为 false(代表没有上锁)。再设置一个局部的 boolean 变量 key 。利用 Swap 指令实现互斥的循环进程结构可描述如下:
do {key = true;do { //entry sectionswap(&lock, &key);} while(key != false);//... //critical sectionlock = false; //exit section//... //remainder section
} while(true);
由于 lock 的初值为 false,因此第一个进入临界区的进程内循环一次即退出循环。此时,lock 值为 true,其它试图进入临界区的进程将一直在内循环中循环。直到第一个进入临界区的进程执行到退出区,lock 值被设置为 false 。
4. 小结
利用上述硬件指令能有效地实现进程互斥,但当临界资源忙碌时,其它访问进程必须不断地进行测试,处于一种 “忙等” 状态,不符合 “让权等待” 原则,造成处理机时间的浪费,同时也很难将它们用于解决复杂的进程同步问题。
相关文章:

DJ2-4 进程同步(第一节课)
目录 2.4.1 进程同步的基本概念 1. 两种形式的制约关系 2. 临界资源(critical resource) 3. 生产者-消费者问题 4. 临界区(critical section) 5. 同步机制应遵循的规则 2.4.2 硬件同步机制 1. 关中断 2. Test-and-Set …...
AI独立开发者:一周涨粉8万赚2W美元;推特#HustleGPT GPT-4创业挑战;即刻#AIHackathon创业者在行动 | ShowMeAI周刊
👀日报&周刊合辑 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 这是ShowMeAI周刊的第7期。聚焦AI领域本周热点,及其在各圈层泛起的涟漪;拆解AI独立开发者的盈利案例,关注中美AIG…...

不要迷信 QUIC
很多人都在强调 QUIC 能解决 HoL blocking 问题,不好意思,我又要泼冷水了。假设大家都懂 QUIC,不再介绍 QUIC 的细节,直接说问题。 和 TCP 一样,QUIC 也是一个基于连接的,保序的可靠传输协议,T…...
【28】Verilog进阶 - RAM的实现
VL53 单端口RAM 1 思路 简简单单,读取存储器单元值操作即可 2 功能猜想版 说明: 下面注释就是我对模块端口信号 自己猜测的理解。 因为题目并没有说清楚,甚至连参考波形都没有给出。 唉,这就完全是让人猜测呢,如果一点学术背景的人来刷题,指定不容易!! 好在,我有较为…...

【MySQL】聚合查询
目录 1、前言 2、插入查询结果 3、聚合查询 3.1 聚合函数 3.1.1 count 3.1.2 sum 3.1.3 avg 3.1.4 max 和 min 4、GROUP BY 子句 5、HAVING 关键字 1、前言 前面的内容已经把基础的增删改查介绍的差不多了,也介绍了表的相关约束, 从本期开始…...

初时STM32单片机
目录 一、单片机基本认知 二、STM系列单片机命名规则 三、标准库与HAL库区别 四、通用输入输出端口GPIO 五、推挽输出与开漏输出 六、复位和时钟控制(RCC) 七、时钟控制 八、中断和事件 九、定时器介绍 一、单片机基本认知 单片机和PC电脑相比…...

debian部署docker(傻瓜式)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 debian10部署dockerdebian10部署docker(傻瓜式)一、准备工作二、**使用 APT 安装,注意要先配置apt网络源**1.配置网络源2.官方下载三、安装…...

JS判断是否为base64字符串如何转换为图片src格式
需求背景 : 如何判断后端给返回的 字符串 是否为 base-64 位 呢 ? 以及如果判断为是的话,如何给它进行转换为 img 标签可使用的那种 src 格式 呢 ? 1、判断字符串是否为 base64 以下方法,可自行挨个试试,…...

【SpringMVC】SpringMVC方式,向作用域对象共享数据(ModelAndView、Model、map、ModelMap)
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 向域对象共享数据一、使用 原生ServletAPI二、…...
本科课程【移动互联网应用开发(Android开发)】实验3 - Activity及数据存储
大家好,我是【1+1=王】, 热爱java的计算机(人工智能)渣硕研究生在读。 如果你也对java、人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!! Good better best, never let it rest, until good is better, and better best. 近期会把自己本科阶段的一些课程设计、实验报…...
为何在 node 项目中使用固定版本号,而不使用 ~、^?
以语雀 文档为准 使用 ~、^ 时吃过亏希望版本号掌握在自己手里,作者自己升级(跟随官方进行升级,就算麻烦作者,也不想麻烦使用者)虽然 pnpm 很好用,但是不希望在项目中用到(临时性解决问题可以选…...

leetcode -- 876.链表的中间节点
文章目录🐨1.题目🐇2. 解法1-两次遍历🍀2.1 思路🍀2.2 代码实现🐁3. 解法2-快慢指针🌾3.1 思路🌾3.2 **代码实现**🐮4. 题目链接🐨1.题目 给你单链表的头结点head&#…...
企业网络安全防御策略需要考虑哪些方面?
随着企业数字化转型的加速,企业网络安全面临越来越多的威胁。企业网络安全不仅仅关乎企业数据的安全,还关系到企业的声誉和利益,因此,建立全面的网络安全防御策略至关重要。 企业网络安全防御策略的实现需要考虑以下几个方面&…...

文心一言 vs. GPT-4 —— 全面横向比较
文心一言 vs. GPT-4 —— 全面横向比较 3月15日凌晨,OpenAI发布“迄今为止功能最强大的模型”——GPT-4。我第一时间为大家奉上了体验报告《OpenAI 发布GPT-4——全网抢先体验》。 时隔一日,3月16日下午百度发布大语言模型——文心一言。发布会上&…...

【进阶数据结构】二叉搜索树经典习题讲解
🌈感谢阅读East-sunrise学习分享——[进阶数据结构]二叉搜索树 博主水平有限,如有差错,欢迎斧正🙏感谢有你 码字不易,若有收获,期待你的点赞关注💙我们一起进步 🌈我们在之前已经学习…...

PyTorch 之 神经网络 Mnist 分类任务
文章目录一、Mnist 分类任务简介二、Mnist 数据集的读取三、 Mnist 分类任务实现1. 标签和简单网络架构2. 具体代码实现四、使用 TensorDataset 和 DataLoader 简化本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052 一、Mnist 分类任…...
如何实现用pillow库来实现给图片加滤镜?
使用Pillow库可以非常容易地给图片加滤镜。Pillow库是Python图像处理的一个强大库,提供了多种滤镜效果,如模糊、边缘检测、色彩增强等。 下面是使用Pillow库实现给图片加滤镜的简单步骤: 安装Pillow库:首先需要安装Pillow库。可…...

微分中值定理
极值 目录 极值 费马引理 编辑 罗尔定理 拉格朗日中值定理 例题: 例2 例3 两个重要结论: 编辑 柯西中值定理: 如何用自己的语言理解极值呢? 极大值和极小值的类似,我们不再进行说明 极值点有什么特点吗&…...

redis 存储一个map 怎么让map中其中一个值设置过期时间,而不是过期掉整个map?
文章目录 redis 存储一个map 怎么让map中其中一个值设置过期时间,而不是过期掉整个map?Java 中 怎么 实现?方案一: Jedis方案二: Lettuce方案三: Redisson方案四: Jedisson方案五: RedisTemplate那种方式 效率最高 ?拓展:结语redis 存储一个map 怎么让map中其中一个值设置过…...

LeetCode:704. 二分查找
🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀算法专栏: 👉🏻123 一、🌱704. 二分查找 题目描述:给定一个 n 个元素有序的ÿ…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...