管程机制 基本讲解

article/2025/8/29 10:03:07

 

管程定义

  • 构成要素:管程定义了一个数据结构,以及能为并发进程在该数据结构上执行的一组操作。
    • 数据结构:例如在多进程共享资源场景中,可代表共享资源状态的变量集合,像共享文件读写状态、共享缓冲区占用情况等。
    • 一组操作:针对共享数据的操作,如读取共享文件内容、向共享缓冲区写入数据。不仅能改变管程中数据状态,还能实现进程同步。比如控制写进程写入后读进程再读取,避免读不完整数据。
  • 功能作用
    • 同步进程:通过操作控制进程执行顺序,确保共享数据访问符合预期。
    • 改变数据:操作可改变管程中的数据,如写进程改变共享缓冲区占用状态。

语法描述

  • 管程声明Monitor monitor_name { 定义名为 monitor_name 的管程,是管理共享资源 “工具包” 的名称。
  • 共享变量说明share variable declarations; 声明管程内共享变量,记录共享资源状态,如共享缓冲区大小、已使用空间等。
  • 条件变量说明cond declarations; 声明条件变量,用于进程同步和等待。如缓冲区满时写进程在条件变量等待,待有空闲空间时被唤醒。
  • 公共过程声明public: 下的 void P1(……){……} 等过程,可被进程调用,包含对管程内数据结构操作代码,进程借此访问修改共享数据,且操作受管程机制控制,保证访问安全有序。
  • 管程主体{ initialization code; …… } 为管程主体,其中 initialization code; 是初始化代码,用于设置共享变量初始值、初始化条件变量等,如将共享缓冲区已使用空间初始化为 0 ,为后续操作做准备。

条件变量的定义与声明

  • 定义:条件变量是一种用于实现进程同步的机制。它可以让进程在某个特定条件满足之前进入阻塞状态,当条件满足时再被唤醒继续执行。
  • 声明:图中 condition x, y; 声明了两个条件变量 x 和 y 。这就好比设置了两个 “等待关卡”,进程可以在这些关卡处等待特定条件的发生。

条件变量的操作

  • 阻塞操作(wait)x.wait() 表示进程执行到该操作时会被阻塞。具体来说,进程会暂停执行,进入等待状态,直到另外一个进程调用 x.signal() 来唤醒它。这类似于一个人在等待公交车,在公交车到来(信号发出)之前,他只能一直等着。
  • 唤醒操作(signal)x.signal() 的作用是唤醒因调用 x.wait() 而被阻塞的另外一个进程。就好像公交车来了,司机鸣笛(发出信号)通知等待的乘客可以上车(唤醒进程继续执行)。

 

1. 管程的核心结构

管程是一种封装共享资源和同步操作的软件模块,其结构包含:

  • 共享数据:例如共享缓冲区、文件状态等,是多个进程竞争访问的对象。
  • 操作过程:也称为 “管程过程”,是一组用于操作共享数据的函数(如 insert()remove()),相当于对共享资源的 “访问接口”。
  • 初始化代码:在管程创建时执行,用于初始化共享数据的初始状态。
2. 进程访问管程的流程

当多个进程需要访问管程内的共享资源时:

  1. 进入队列(Entry Queue)
    所有试图进入管程的进程首先进入进入队列。管程在同一时间只允许一个进程执行其内部的操作过程,因此其他进程必须在此排队等待。
    类比:就像餐厅门口的等待区,顾客(进程)必须先在此等待,直到有空桌(管程可用)。

  2. 获取管程使用权
    当管程内的进程执行完毕并离开时,进入队列中的第一个进程将被唤醒,获得进入管程的权限。

3. 条件变量与等待队列

管程内部的条件变量(如 xy)用于处理更复杂的同步需求。当进程在执行过程中发现某个条件不满足时:

  • 执行 x.wait()
    进程会释放管程的使用权,并进入与条件变量 x 关联的等待队列(Queue for x)。此时,进入队列中的下一个进程将被允许进入管程。
    类比:顾客进入餐厅后发现没有干净餐具(条件不满足),于是回到 “缺餐具” 的等待区等待。

  • 执行 x.signal()
    当另一个进程改变了条件(例如清理了餐具),可以通过 x.signal() 唤醒在 x 队列中等待的进程。被唤醒的进程会重新进入进入队列,竞争管程的使用权。
    类比:服务员清理好餐具后,通知 “缺餐具” 等待区的顾客可以重新进入餐厅。

4. 两个关键队列的区别
队列类型作用触发场景
进入队列控制进程进入管程的顺序,确保同一时间只有一个进程在管程内执行操作。所有试图进入管程的进程都会先进入此队列。
条件变量队列当进程在管程内执行时,因某个条件不满足而被阻塞,进入与特定条件变量关联的队列。进程在管程内执行 x.wait() 时触发。
5. 示例场景

假设管程管理一个共享缓冲区,条件变量 empty 表示缓冲区为空,full 表示缓冲区已满:

  1. 生产者进程进入管程,发现缓冲区已满(full 条件成立),执行 full.wait(),进入 full 队列等待。
  2. 消费者进程进入管程,消费数据后缓冲区变为空,执行 empty.signal(),唤醒 empty 队列中的生产者进程。
  3. 被唤醒的生产者进程重新进入进入队列,等待获取管程使用权后继续执行。

    条件变量问题及处理方式

    • 存在的问题:在管程内可能存在不止 1 个进程。例如,当进程 P 调用 signal 操作唤醒进程 Q 后,会面临如何协调这两个进程后续执行顺序的问题。因为管程内的资源访问需要有序进行,否则可能导致数据不一致或其他错误。
    • 处理方式
      • Hoare 方式P 等待,直到 Q 离开管程或等待另一条件。这意味着 P 唤醒 Q 后,P 自身会进入等待状态,让 Q 先使用管程内的资源,直到 Q 完成操作离开管程,或者出现另一个满足条件的事件。
      • Hansen 方式Q 等待,直到 P 离开管程或等待另一条件。即 P 唤醒 Q 后,Q 不会立即执行,而是等待 P 离开管程,或者等到满足另一个特定条件时才开始执行。

    总结

    • 进入队列是管程的 “总入口”,确保互斥访问。
    • 条件变量队列是管程内部的 “子等待区”,用于处理特定条件下的进程阻塞。
    • wait() 让进程从管程进入条件队列,signal() 让进程从条件队列回到进入队列。

    http://www.hkcw.cn/article/pdCRycXroC.shtml

    相关文章

    c#基础09(类与对象)

    文章目录 类与对象面向对象概念封装访问修饰符 类如何定义类字段与属性 类的对象构造方法this关键字 类与对象 面向对象概念 并不是一个技术,而是一种编程指导思想。把现实世界的具体事物全部看出一个一个的对象来解决实际问题。 面向对象编程共同三大特性&#…

    ai工具集:AI材料星ppt生成,让你的演示更出彩

    在当今快节奏的工作环境中,制作一份专业、美观的 PPT 是展示工作成果、传递信息的重要方式。与此同时,制作PPT简直各行各业的“职场噩梦”,很多人常常熬夜到凌晨3点才能完成,累到怀疑人生。 现在?完全不一样了&#x…

    高速连接器设计的真相

    在高速连接器设计领域,有两种相反的想法。对于某些人来说,如果你简单地将塑料和金属碎片放在一起,最终你会得到信号传输。这个过程非常简单。另一方面,有一种观点认为,可靠的连接器设计需要对电磁理论有深入的理解&…

    计算机视觉---YOLOv4

    YOLOv4(You Only Look Once v4)于2020年由Alexey Bochkovskiy等人提出,是YOLO系列的重要里程碑。它在YOLOv3的基础上整合了当时最先进的计算机视觉技术,实现了检测速度与精度的显著提升。以下从主干网络、颈部网络、头部检测、训练…

    IP地址交换如何让车联网效率翻倍?

    在车辆移动过程中实现稳定可靠的网络连接,是智能交通系统发展的关键技术之一。车辆行动通讯网络(VANET)通过车载设备和路边基础设施的配合,使车辆在行驶中能够接入互联网。要实现这一目标,每辆车都需要获得唯一的IP地址…

    DexWild:野外机器人策略的灵巧人机交互

    25年5月来自 CMU 的论文“DexWild: Dexterous Human Interactions for In-the-Wild Robot Policies”。 大规模、多样化的机器人数据集已成为将灵巧操作策略泛化到新环境的一条有效途径,但获取此类数据集面临诸多挑战。虽然遥操作可以提供高保真度的数据集&#xf…

    大连格恩朗椭圆齿轮流量计:工业流量测量的精密刻度尺

    在工业生产的庞大脉络中,流体流量的精准测量如同心脏监测仪之于人体,细微偏差可能导致整个系统的失衡。大连格恩朗椭圆齿轮流量计以**0.5%的精度**(部分型号达0.2%)成为工业流量领域的“精密刻度尺”,其核心原理如同一…

    【NebulaGraph】查询案例(七)

    【NebulaGraph】查询案例 七 1. 查询语句12. 查询语句23. 查询语句34. 查询语句4 1. 查询语句1 GO FROM "player100" OVER * YIELD type(edge) AS link, properties($$) AS properties,tostring(src(edge)) AS src,tostring(dst(edge)) AS dst, tags($$) AS tagLi…

    database disk image is malformed 的解决方法

    Sqlite数据库在执行时报错:database disk image is malformed 解决方法: 1.重启电脑试下,或者重启服务试下 2.重新创建新的表,读出正确的部分的数据结构及数据 (1)命令行中定位到数据表的路径下; (2)执行如…

    机动车结构化检测算法AI智能分析网关V4打造全场景应用解决方案

    一、方案概述​ 随着交通管理智能化发展,精准高效的机动车信息检测需求迫切。AI智能分析网关V4基于深度学习与计算机视觉技术,具备强大的机动车结构化检测能力,可快速提取车辆关键信息,赋能交通管理与安防监控。本方案将围绕其技…

    认识多系统萎缩:一种隐匿进展的神经退行性问题

    多系统萎缩是一种罕见的神经退行性疾病,起病隐匿且呈进行性发展,平均发病年龄约 50 岁,男性略多于女性。 该疾病主要影响中枢神经系统多个部位,包括锥体外系、小脑、自主神经系统等。根据主要症状差异,可分为不同亚型&…

    UE5蓝图中播放背景音乐和使用代码播放声音

    UE5蓝图中播放背景音乐 1.创建背景音乐Cube 2.勾选looping 循环播放背景音乐 3.在关卡蓝图中 Event BeginPlay-PlaySound2D Sound选择自己创建的Bgm_Cube 蓝图播放声音方法二: 使用代码播放声音方法一 .h文件中 头文件引用 #include "Kismet/GameplayS…

    【C语言极简自学笔记】项目开发——扫雷游戏

    一、项目概述 1.项目背景 扫雷是一款经典的益智游戏,由于它简单而富有挑战性的玩法深受人们喜爱。在 C 语言学习过程中,开发扫雷游戏是一个非常合适的实践项目,它能够综合运用 C 语言的多种基础知识,如数组、函数、循环、条件判…

    职业本科院校无人机专业人才培养解决方案

    2023年的中央经济工作会议强调了以科技创新推动现代化产业体系构建的重要性,并提出发展生物制造、商业航天、低空经济等战略性新兴产业。低空经济,依托民用无人机等低空飞行器,在多场景低空飞行活动的牵引下,正逐步形成一个辐射广…

    Text-to-SQL评估体系:从Spider 1.0数据集到2.0框架的跨越与革新

    文章目录 一、引言:评估体系迭代推动Text-to-SQL技术发展二、Spider 1.0:跨领域语义解析数据集的奠基2.1 数据集构建与核心特征2.2 评估逻辑与技术局限 三、Spider 2.0:企业级工作流评估框架的崛起3.1 框架定位与核心组件3.2 工作流任务的革命…

    电感器在数据中心电源系统中的应用及选型

    当前,AI应用的加速落地带来了功耗的大幅提升,直接推动了数据中心电源需求的增长。根据国际能源署2023年的数据,全球数据中心能耗占比已超全球电力消耗的3%,单台A100 GPU服务器峰值功耗已经突破10kW。数据中心功耗的大幅提升&#…

    WordPress搜索引擎优化的最佳重定向插件:进阶指南

    在管理网站时,我们经常需要调整网页地址或修复错误链接。这时,通过重定向不仅能有效解决这些问题,还能显著提升网站在搜索引擎中的排名。对于熟悉基础重定向插件的用户来说,一些功能更强大的工具可以帮助你更全面地管理网站&#…

    Codejock ToolkitPro 与 BCGControlBar Pro 深度对比

    Codejock ToolkitPro 与 BCGControlBar Pro 深度对比 在 MFC (即 Microsoft Foundation Classes)基础上开发框架应用时,控件 UI 的环境一直是个难题:原生控件设计落后,不支持现代化主题,缩放适配性差,形成了 MFC 开发…

    2.qml使用c++

    目录 1.概述2.注册方式3. 分类①枚举类②工具类③数据类④资源类②视图类 1.概述 qml是用来干嘛的? 当然是提高UI开发效率的 为什么要混合C? 因为qml无法处理密集型数据逻辑 而加入c则兼顾了性能 达到11>2 总结就是 qml 开发UI, C 实现逻辑 而js的用…

    复合机器人:纠偏算法如何重塑工业精度与效率?

    在智能制造领域,复合机器人正成为柔性生产与高精度作业的核心载体。面对“复合机器人有纠偏算法吗?”这一行业高频问题,富唯智能以多模态纠偏技术体系给出了答案——通过自研的AI驱动纠偏算法与多传感器融合方案,复合机器人不仅能…