记录实现操作系统互斥锁的一次思考
今天实现操作系统互斥锁的时候遇到一个有趣的问题。
场景
有两个进程分别名为 taskA,taskB,采取时间片轮转的方式交替运行——也即维护了一个 ready_queue,根据时钟中断来 FIFO 地调度任务。它们的任务是无限循环调用 sys_print() 来打印自己的名称。
我还设置了一个 mutex 互斥锁,它包含一个 0/1 互斥信号量:用于表示锁是否已经被取走,还有一个等待队列 waiting_queue:用于存放正在等待该锁的进程。
为了保证打印出来的字符不错乱,我为 sys_print() 函数设置一个 mutex 对象,我们暂且称之为 print_mutex。在调用 sys_print() 前执行 mutex_lock() 上锁,如果此时锁已经被取走,那么将当前任务加入 print_mutex 的 waiting_queue。调用 sys_print() 后执行 mutex_unlock() 解锁,如果 waiting_queue 中有任务,那么将 print_mutex 直接分配给其中的第一个任务,同时将该任务加入进程的就绪队列,否则将锁归还,由需要该锁的进程主动来取锁。
运行
想一想,这时候运行系统,屏幕上的输出形式是怎么样的呢?
容易想到一些情况:
一、交替连续输出,且无打印出错误,形如以下形式
taskA
taskA
taskA
taskB
taskB
taskB
taskA
taskA
taskA
... ...
二、交替连续输出,但在进程切换的瞬间,有打印错乱的可能,形如以下形式
taskA
taskA
tastaskB
taskB
taskB
ttaskA
taskA
taskA
... ...
三、严格交替输出,且无打印出错误,形如以下形式
taskA
taskB
taskA
taskB
taskA
taskB
... ...
四、严格交替输出,但在进程切换的瞬间,有打印错乱的可能,形如以下形式
tasktaskB
tataskB
taskA
tataskA
... ...
其实还有很多其他可能,碍于篇幅受限,不再列出。
输出
很容易想到,加了互斥锁 print_mutex 后,肯定不会出现打印错乱的情况,因此情况二和情况四首先排除,那么到底是情况一还是情况三呢?大家可以根据场景先思考一下。
好了,公布答案,最终形式其实既不是情况一也不是情况三,而是这样的:
taskA
taskA
taskA
taskA
taskA
taskB
taskA
taskB
... ...
也就是一个任务先连续输出,然后两个任务严格交替输出,如下图:
分析
假设先上时间片运行的是 taskA,那么在第一个时间片周期中, taskA 可以调用 sys_print() 函数若干次,当时间片发生切换的瞬间,taskA 会被挂起,然后重新加入到 ready_queue 尾部,等待下一次被分配 cpu。
这个任务的功能很简单,可以简化成以下形式:
void taskA(){while(true){metux_lock(); //关中断保证原子操作sys_print();mutex_unlock(); //关中断保证原子操作}
}
其中 mutex_lock() 和 mutex_unlock() 都关中断保证了不会有时钟中断发生, 所以在切换进程的时候,taskA 可能会
- 停留在 metux_lock() 之前、mutex_unlock() 之后
- 停留在 sys_print() 中
显然,由于sys_print() 需要与外围设备端口交互,包含的指令数也比较多,而情况1 包含的指令数极少,因此 taskA 此时绝大概率停留在 sys_print() 中,也就是 taskA 持有 print_mutex 互斥锁,并在 ready_queue 中等待执行,而这时候 taskB 虽然被分配了时间片,但在执行 mutex_lock() 的时候发现锁已被取走,只能进入 print_mutex 的 waiting_queue 等待。taskA 重新上cpu 运行,执行完上次执行一半的 sys_print() 之后,紧接着执行 mutex_unlock() 将锁分配给锁等待队列中的 taskB,下一轮循环时,taskA 执行 mutex_lock() 发生锁等待被挂起,循环往复,两者就严格交替打印了。
事实上,如果 taskA 在切换时间片的时候遇到的是情况 1,那么也可能出现两个进程交替连续打印的情况,但是这个概率极小。
相关文章:

记录实现操作系统互斥锁的一次思考
今天实现操作系统互斥锁的时候遇到一个有趣的问题。 场景 有两个进程分别名为 taskA,taskB,采取时间片轮转的方式交替运行——也即维护了一个 ready_queue,根据时钟中断来 FIFO 地调度任务。它们的任务是无限循环调用 sys_print() 来打印自…...

计算机SCI期刊的分值是什么意思? - 易智编译EaseEditing
影响因子(Impact Factor,IF)是美国ISI(科学信息研究所)的JCR(期刊引证报告)中的一项数据。 即某期刊前两年发表的论文在统计当年的被引用总次数除以该期刊在前两年内发表的论文总数。这是一个国际上通行的期刊评价指标。 例如,某期刊2005年影…...

5MW风电永磁直驱发电机-1200V直流并网MATLAB仿真模型
MATLAB2016b运行。主体模型:风机传动模块、PMSG模块、蓄电池模块、超级电容模块、无穷大电源。蓄电池控制、风机控制、逆变器控制。风机输出功率:直流母线电压:逆变器输出电压:逆变器输出电流:混合储能荷电状态&#x…...
10 个常见的 JavaScript 面试问题以及如何回答它们
你在准备 JavaScript 面试吗?别再看了!本文将介绍10 个常见的 JavaScript 面试问题以及如何在代码示例和解释的帮助下回答这些问题。1. JavaScript 中的提升是什么?提升是 JavaScript 中的一种行为,其中变量和函数声明被移动到其作…...
字节跳动-今日头条后端开发一面面经
飞书50min 1、实习经历? 2、参加竞赛经历? 3、TCP和UDP的区别? 4、cookie和session的区别? 5、session如何做分布式? 6、概率题目,A和B轮流抛硬币,谁先抛到正面就获胜,A先抛硬币&…...

再见 ETHDenver 2023
我们来一起回顾Web3中规模最大,持续时间最长的以太坊史诗级建造周我们正在庆祝#YearoftheSpork,并借助 Web3 中最大的以太坊社区活动之一拉开了黑客马拉松赛季的序幕。ETH Denver 旨在围绕一个共同的目标聚集了志同道合的人,我们非常高兴今年…...
阿里云dataworks表操作
–odps sql –– –author:宋文理 –create time: –– 创建表 创建非分区表、分区表、外部表或聚簇表。 限制条件 分区表的分区层级不能超过6级。例如某张表以日期为分区列,分区层级为年/月/周/日/时/分。 一张表允许的分区个数支持按照具体的项目配置,…...

【latex】总结最近使用到的画图、表格及公式操作
前言 推荐使用overleaf写latex文章,内含很多会议/期刊的模板,可以直接套用。 https://www.overleaf.com下文都是在写论文过程中比较头疼的部分,有人建议我写完文章,最后再调整格式。但图片过大看起来实在是不适~ 插入图片 \beg…...
excel表格数字乱码怎么恢复正常
excel表格数字乱码怎么恢复正常?作为可以进行数据存储、提取、计算的excel表格,经常会遇到excel表格数字乱码这一情况。这可能是由于输入的数字位数较多,数字出现乱码。出现这种情况将会大大影响我们的工作。那么我们该怎么办?这里小编将为您带来excel…...

泰山众筹电商模式的分析
泰山众筹模式是电商平台营销玩法,市场上高活跃度的现象也证实了众筹模式的口碑,结合社交电商的模型,会员和产品销量都会得到飞跃,并且这样结合以后,泰山众筹模式也会更长久、合理,以及可持续。 泰山众筹模…...

[算法]归并排序
参考:《漫画算法-小灰的算法之旅》 目录 参考:《漫画算法-小灰的算法之旅》 1、什么是归并排序 2、归并的具体操作 3、代码 4、时间复杂度和空间复杂度 5、归并排序是稳定排序 1、什么是归并排序 归并排序就像是组织一场元素之间的“比武大会”&…...

【UE4 RTS游戏】05-自定义日期和时间
效果步骤打开项目设置,重新设置玩家状态类为“MyGameState”打开“MyGameState”,点击类设置,选中父类为“GameStateBase”接着创建一些变量:(1)“TimeUnit”,浮点型,私有࿰…...
ES的restful风格的HTTP方法详解
ES的restful风格的HTTP方法详解 一、概述 restful是一种设计风格,用于构建Web服务和API。 在restful风格中,HTTP请求方法(如GET、POST、PUT、DELETE)和URL(统一资源定位符)被用来定义服务端资源的…...
第十三章 opengl之模型(导入3D模型)
OpenGL模型导入3D模型优化使用3D模型模型 使用Assimp并创建实际的加载和转换代码。Model类结构如下: class Model {public:/* 函数 */Model(char *path){loadModel(path);}void Draw(Shader shader); private:/* 模型数据 */vector<Mesh> meshes;st…...
html标签表示!
html是什么?HTML全称为超文本标记语言,是一种标记语言。包括一系列标签,通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文…...

前端优化,webpack打包删除无用文件,并附上批量删除文件脚本!非常好用
前言 大家可能在webpack打包项目过程中,常遇见一些无用的图片,js文件,怎样能够自动检测哪些是无用的文件呢?本文中介绍使用插件useless-files-webpack-plugin查找无用文件,在terminal中删除,附加bat批量删…...

SpringCloud之 LoadBalancer负载均衡
文章目录LoadBalancer 负载均衡一、LoadBalanced 负载均衡🌽①观察负载均衡现象🌽②LoadBalanced 源码剖析二、自定义负载均衡三、OpenFeign 实现负载均衡🍆①添加依赖🍆②启动类添加 EnableFeignClients🍆③创建客户端…...

idm如何下载种子文件和磁力链接 idm如何下载torrent
采用分段式下载技术并支持断点续传的idm下载加速器,几乎可以胜任所有的下载任务。由于该软件强大的下载能力和仅为10MB的小巧体积,idm被来自全球的用户亲切地称为天花板级的下载软件。那么有关idm如何下载种子文件和磁力链接,idm如何下载torr…...

UE4 安卓AR 识别图片
UE4 安卓AR 识别图片 开启一个插件 准备一个只有玩家出生点的场景,这个场景用来做识别图片的 新建一个游戏模式,设置好默认的pawn类: 一个摄像机就行了,代表手机开启AR会话后的那个相机 然后gamemode 事件开始运行࿰…...
数字化服务环境下高校成人教育图书馆服务工作的发展方向
1.利用高校成人教育图书馆的整体化优势进行图书馆网络的优化组织与协调,使数字化信息服务功能在图书馆数字化服务中得以充分实现,促使数字电子信息资源成为图书馆信息服务的有机组成部分。2.高校成人教育应该从宏观上有计划有组织地协调高校成人教育图书…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...