当前位置: 首页 > news >正文

操作系统进程管理——同步与互斥的基本概念

2.3.1 同步与互斥的基本概念

在单处理机上采用多道程序技术,或在多核处理机上并行运行多个执行实体时,多个进程/线程会在时间上交织、在资源上共享。如果没有约束,两个“同时”读写同一份数据、或一方依赖另一方的执行次序,就可能出现结果不可预测的“竞态”。为了解决“怎么安全共享”“怎样按正确次序配合”这两类问题,操作系统引入了“互斥”和“同步”这两个基础概念:前者关注排队使用共享资源,后者关注先后次序的协调。

2.3.1.1 并发会带来什么风险

为了把问题动机说清楚,可以先观察共享与先后两个角度:
(1)共享角度:当两个执行实体几乎同时更新同一条记录、同一段缓冲区或同一计数器时,如果缺少约束,就会发生“你改了一半、我又改了一半”的覆盖,最终状态取决于切换时机,这就是“竞态”。
(2)先后角度:某个操作只有在“准备工作完成”之后才能进行,例如“消费者只能在生产者把数据放入缓冲区之后再取走”。这里的要点不是“排队使用”,而是“等条件成立再继续”。

2.3.1.2 互斥与同步:侧重点有什么不同

为了避免把两个概念混在一起,可以用一句话区分它们的侧重点:互斥解决的是“同一时刻只允许一个执行者进入临界区”;同步解决的是“按照约定的先后关系推进”。二者经常共同出现,但问题抽象不同:
(1)互斥(mutual exclusion):当存在“临界资源”(一次只能被一个实体使用)时,应当把对该资源的操作放入“临界区”,并保证任意时刻至多一个执行实体位于该临界区。
(2)同步(synchronization):当存在“先做 A,后做 B”的因果关系时,应当让 B 在“条件满足(A 已完成)”之后再继续,否则就等待。同步可以不涉及共享修改(例如“到点再同时起跑”),也可以与互斥配合使用(例如“先拿锁,再等条件成立”)。

2.3.1.3 临界资源与临界区:如何把问题抽象成可控的结构

为便于操作系统实施控制,通常把“需要排队使用的共享对象”抽象为临界资源,并把对它的访问代码划为四个固定片段:
(1)进入区:尝试获得进入临界区的资格,若条件不满足则等待。
(2)临界区:对临界资源进行实际访问(读写、更新等)。
(3)退出区:离开临界区并释放占用的资格,使他人可以进入。
(4)剩余区:与临界资源无关的其余代码,不受互斥控制。
这种划分把“需要严格保护的核心操作”与“普通操作”清晰分离,便于在进入/退出两个关口上施加机制,既保证正确性,又尽量减少等待范围。

2.3.1.4 正确性应满足哪些基本要求

为了判断一种互斥与同步方案是否“合格”,通常需要满足三项(或等价表述的)基本要求:
(1)互斥性:任何时刻至多一个执行实体在访问同一临界资源。
(2)前进性(无无谓等待):当临界区空闲且有若干实体希望进入时,选择谁进入的决策应在有限步内作出;不应因为局部无关的实体而无限拖延。
(3)有限等待(避免长期饥饿):从一个实体提出进入请求起,至多在有限次他人进入之后就能轮到它,不应出现永久等待。
在同步场景下,还要补充一条语义约束:条件满足性——只有在规定的条件成立时,后续动作才能继续执行;当条件尚未成立时,应当等待而不是“空转”。

2.3.1.5 等待的两种形态:忙等与阻塞

当“现在不允许进入临界区”或“条件尚未满足”时,执行实体到底如何等待,会影响系统效率。为了提前建立直觉,可以把等待粗分为两类:
(1)忙等:反复在处理机上检查条件是否为真(自旋),优点是切换快、适合等待时间极短的场景;缺点是占用处理机做“无用功”。
(2)阻塞:把自己挂起到等待队列,处理机让给别人;当条件满足或资源可用时被唤醒。优点是节省处理机时间、系统吞吐更稳;缺点是切换与唤醒有开销,等待很短时可能得不偿失。
后续各小节将分别介绍基于软件/硬件的基本方法以及常用的抽象(锁、信号量、条件变量),它们的差异很大程度上就体现在“忙等或阻塞、在哪里等待、由谁来唤醒”这些细节上。

2.3.1.6 互斥与同步会与哪些系统目标发生拉扯

在实践中,互斥与同步不仅要“讲道理”,还要“算得过账”。为此有三组常见的权衡需要牢记:
(1)正确性与并发度:临界区越大、粒度越粗,越容易保证正确,但并发度越低;相反,临界区细化与按对象分离能显著提升并发度,但实现更复杂。
(2)响应与开销:忙等减少了阻塞/唤醒的切换开销,提高了短等待的响应;阻塞节约了处理机时间,提高了整体吞吐,但增加了切换成本。
(3)公平与效率:严格按照到达顺序服务可以避免饥饿,但可能牺牲局部效率;允许打破顺序(例如优先让短操作先行)能提升吞吐,但需配套机制抑制长期不公平。

2.3.1.7 从概念到工具:后续内容如何衔接

在理解了“为什么要互斥与同步、抽象成什么结构、判据是什么、等待怎么做”之后,就可以进入具体手段。为使学习路径连贯,可以按以下线索展开:
(1)基本实现方法:先用纯软件思路认识互斥的可能与局限,再用硬件原子指令理解“不可分操作”如何帮助构造互斥与同步;
(2)常用抽象:用表达“谁能进入临界区”,用信号量把“资源数/许可数”与“等待队列”合二为一,用条件变量表达“等待某个条件成立”的同步语义;
(3)经典场景:在生产者-消费者、读者-写者、哲学家进餐等问题中组合上述抽象,体会“互斥”与“同步”如何同时出现、如何避免饥饿与死锁。

把握这一节的主线,可以用一句话概括为:互斥让共享访问不相撞,同步让先后关系不走样;进入/退出临界区的纪律与等待方式的选择,共同决定了并发程序既正确又高效。


文章转载自:

http://MtnbktCF.Lwtfx.cn
http://m8dpLiwz.Lwtfx.cn
http://ikCcxkx3.Lwtfx.cn
http://ILPbDOeo.Lwtfx.cn
http://KVDhkgjC.Lwtfx.cn
http://jOheYp3U.Lwtfx.cn
http://mFkIFKHm.Lwtfx.cn
http://dotiz5fe.Lwtfx.cn
http://eogdbMNY.Lwtfx.cn
http://Rkg8wi8r.Lwtfx.cn
http://ym9FzndQ.Lwtfx.cn
http://Is6ZDa25.Lwtfx.cn
http://S1Wvbe4n.Lwtfx.cn
http://8oO98M8X.Lwtfx.cn
http://oPmL7Uko.Lwtfx.cn
http://JnX2mqNG.Lwtfx.cn
http://g9x1bdSo.Lwtfx.cn
http://Ox1Gt267.Lwtfx.cn
http://YSQ3n8Kp.Lwtfx.cn
http://esJRBxQn.Lwtfx.cn
http://9PRl5lpQ.Lwtfx.cn
http://SmdkDS4l.Lwtfx.cn
http://X7EPPku3.Lwtfx.cn
http://XVnh0uxr.Lwtfx.cn
http://rumGyMOs.Lwtfx.cn
http://Dpaxl6Km.Lwtfx.cn
http://wRHRodWK.Lwtfx.cn
http://HzPGbTwu.Lwtfx.cn
http://dYXV8RFj.Lwtfx.cn
http://RocKNAsc.Lwtfx.cn
http://www.dtcms.com/a/378373.html

相关文章:

  • 灰色关联分析笔记
  • CAD文件坐标系未知?用Bigemap Pro自动计算中央子午线,准确定位!
  • 项目管理核心八项(软件篇)
  • 创新驱动:医养照护与管理实训室建设方案构建
  • C++ 之 cli窗口交互程序测试DLL
  • openEuler系统远程管理方案:cpolar实现安全高效运维
  • Spring常用注解介绍
  • 《秋鳞小故事——编译器》
  • 【前端Vue】如何优雅地在vue中引入ace-editor编辑器
  • 架构深解:英伟达Rubin CPX如何通过专用预填充加速器与解耦架构重塑AI推理效率与成本
  • 线下小店悄然增长:两个关键模式与它们的运营启示
  • 开发安全利器:detect-secrets 敏感信息扫描工具实战指南
  • 中间件架构设计与实践:构建高性能分布式系统的核心基石
  • 错误于make.names(vnames, unique = TRUE): invalid multibyte string 9 使用 R 语言进行数据处理时
  • 前端基础标签
  • 深度学习基本模块:ConvTranspose2D 二维转置卷积层
  • 多模态数据治理新范式:衡石Agentic BI如何统一结构化与非结构化数据?
  • Gopeed下载器本地部署指南:cpolar实现远程任务管理
  • App 苹果 上架全流程解析 iOS 应用发布步骤、App Store 上架流程
  • unity UGUI 鼠标画线
  • ALBEF(Align Before Fuse)
  • redis 集群——redis cluster(去中心化)
  • k8s部署kafka三节点集群
  • 11.ImGui-加载字体和中文
  • 大模型推理革命
  • 项目-sqlite类的实现
  • 物联网领域中PHP框架的最佳选择有哪些?
  • ARM1.(ARM体系结构)
  • Linux开机启动设置全攻略
  • 解决Pytest参数化测试中文显示乱码问题:两种高效方法