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

OS_2 进程与线程(进程管理)

一、进程与线程

二、CPU调度

三、同步与互斥

管程(Monitor)

管程(Monitor)确实是操作系统课程中一个比较抽象但极其重要的概念。别担心,我们用一种更直观的方式来拆解它。简单来说,你可以把​​管程想象成一个高级的、智能的协作房间​​,它专门用来管理共享资源,确保多个线程或进程能安全、有序地工作
管程最核心的组成部分和它们扮演的角色

💡 管程如何工作
它们是如何协同工作的:

  1. ​​互斥访问​​:这是管程的基础。当一个线程想通过管程的某个“操作方法”(比如insert)访问共享资源时,它必须首先获得管程的“钥匙”(互斥锁)。如果钥匙没人用,它就可以进入房间执行操作。如果钥匙正被其他线程使用,它就必须在管程的​​入口等待队列​​里排队 。这确保了管程内部的代码在任一时刻最多只有一个线程在执行,完美解决了​​互斥​​问题。
  2. 条件同步​​:这是管程的精妙之处。如果一个线程进入管程后,发现它执行操作所需的​​具体条件​​还不满足(比如生产者发现缓冲区已满),它不会占着位置不走,而是会针对一个​​条件变量​​(如notFull)执行wait操作
  • 这个wait操作会做三件事:a) 将该线程自身挂起(阻塞);b) 释放它持有的“钥匙”(互斥锁),让排队等待的其他线程可以进入管程工作;c) 把自己加入到这个条件变量对应的​​等待队列​​中
  • 之后,当另一个线程(比如消费者消费了一个物品)使得条件发生变化(缓冲区不满了),它可以执行signal操作,来唤醒在相应条件变量(notFull)上等待的​​一个​​线程
  • 被唤醒的线程需要重新获得“钥匙”后才能继续执行。这里有两种主要处理方式:​​Hoare管程​​会立刻让被唤醒线程执行;而更为常见的​​Mesa管程​​(如Java内置的管程)则是将被唤醒线程放到入口队列重新排队,这意味着它可能需要稍等片刻才能继续。因此,在Mesa风格下,线程被唤醒后​​必须重新检查条件​​是否真的满足,通常使用while循环而非if语句来判断条件,以应对可能的“虚假唤醒”或条件再次变化。

🔄 一个生动的例子:生产者-消费者问题
让我们用经典的“生产者-消费者”问题来加深理解。假设有一个大小有限的缓冲区。

  • 管程的角色​​:就是这个缓冲区的管理员。 ​​
  • 共享数据​​:缓冲区本身及当前产品数量。 ​​
  • 操作方法​​:生产(产品)和 消费()。
  • 条件变量​​:需要两个。
  • (1)notFull:缓冲区“不满”的条件。生产者在缓冲区满时在此条件上等待。
  • (2)notEmpty:缓冲区“不空”的条件。消费者在缓冲区空时在此条件上等待。
    在这里插入图片描述
    📊 管程 vs. 信号量
    你可能会学到信号量,管程常被拿来和它比较。它们的核心区别在于:
  • 抽象层次​​:信号量是更底层的同步原语,使用不当容易出错(如顺序错误导致死锁)。而​​管程是一种高级抽象​​,它将复杂的同步操作(如加锁、解锁、条件等待)封装起来,大大降低了程序员的负担,使代码更清晰安全
  • 封装性​​:信号量本身没有封装性,需要程序员自己管理。而管程天然具有​​封装性​​,它将共享数据和操作数据的方法封装在一起,符合面向对象的设计思想

简单来说,如果把并发编程比作管理交通,信号量像是手动控制红绿灯,需要你精确计算时间;而管程则像一个智能交通系统,你只需要设定好规则(方法),系统会自动协调车辆(线程)的通行。

💎 总结
总而言之,理解管程可以抓住几个关键点:它是一个​​封装了共享数据和操作方法的模块​​,通过​​互斥锁​​保证同一时间只有一个线程在执行内部过程,利用​​条件变量​​及其wait/signal操作来解决复杂的同步问题。
希望这个“协作房间”的比喻和分解能帮助你更好地理解管程这个概念!并发编程确实有挑战,但拆解清楚每个部分的作用和协作方式,就会变得清晰起来。

四、死锁

http://www.dtcms.com/a/519865.html

相关文章:

  • 网站规划 评价谷歌三件套一键安装
  • 腾讯云服务器如何建设网站百度关键词排名突然没了
  • 【论文笔记】LTX-Video极致速度的视频生成模型
  • 安科瑞防逆流解决方案:物联网技术赋能光伏能源高效管理
  • 如何根据不同的场景选择YOLO相应的基座模型
  • 【OJ】二叉树的经典OJ题
  • Excel 重磅更新 AI技术走进公式
  • div嵌套影响网站收录建设公司需要网站吗
  • VBA技术资料MF383:处理Excel中存储为文本的数据
  • 注册网站的公司名字网站项目建设流程图
  • 大数据存储组件分别位于数据仓库的哪一层
  • Dubbo应用开发之RPC直连开发
  • 坦电容做电源滤波,放在陶瓷电容的前面还是后面好
  • 北京城建亚泰建设集团有限公司网站首页wordpress中文教程 下载
  • 虚幻引擎5 GAS开发俯视角RPG游戏 P06-13 属性菜单 - 边框值
  • Bash 括号:()、{}、[]、$()、$(() )、${}、[[]] 到底有什么区别?
  • bash执行脚本 CondaError: Run ‘conda init‘ before ‘conda activate‘
  • 虚幻引擎5 GAS开发俯视角RPG游戏 P06-11 初始化生命值和法力值属性
  • 做家政网站网络公司基础建设
  • 比特币白皮书
  • 网站速度诊断 慢坚持以高质量发展为首要任务戈
  • 苹果 T2 芯片如何影响 Mac 数据恢复
  • Open XR 手势控制模块开发。Monado 自定义手势识别模型 基于UltraLeap python实现
  • SQL Server ODBC 数据源配置指南(本地 + 远程,附实操细节)
  • 惠普电脑VT虚拟化技术开启指南:新旧BIOS设置全解析
  • SQL NULL 值
  • wordpress建站做客户端WordPress网站图片预加载
  • 动态规划核心原理与高级实战:从入门到精通(Java全解)
  • java设计模式七、代理模式
  • 【底层机制】【Android】AIDL原理与实现机制详解