OS复习笔记ch5-5

news2024/11/26 6:21:55

引言

上文我们了解了一些关于信号量机制的一些经典应用,知识点比较繁杂,可能会有点啰嗦,但是对初学者而言还是越详细越好。接下来我们介绍一下管程。

管程

管程是程序设计语言结构,可提供易于控制的同步机制,我们熟知的Java中就有相关的实现。

  1. 互斥
    各外部进程/线程只能通过管程提供的特定“入口”才能访问共享数据。
    一个管程的程序在执行一个线程前会先获取互斥锁,直到完成线程或是线程等待某个条件被满足才会放弃互斥锁。若每个执行中的线程在放弃互斥锁之前都能保证不变量成立,则所有线程皆不会导致竞态条件成立。
    以下这个银行账户的提款/存款事务的管程是个简单的例子:
monitor class _Account_ {
  private _int_ balance := 0
  invariant balance >= 0

  public method _boolean_ withdraw(_int_ amount)
     precondition amount >= 0
  {
    if balance < amount then return false
    else { balance := balance - amount ; return true }
  }

  public method deposit(_int_ amount)
     precondition amount >= 0
  {
    balance := balance + amount
  }
}

在上述银行账户的管程中,互斥锁用于确保在进行提款或存款操作时不会发生数据竞态条件。每个线程在执行提款或存款操作时,都需要先获取互斥锁,然后执行相应的操作,最后释放互斥锁。

假设每个执行中的线程在放弃互斥锁之前都能保证不变量成立,即在释放互斥锁之前都能确保账户余额的不变量(balance >= 0)成立。这意味着无论是进行提款还是存款操作,线程在释放互斥锁之前都会确保账户余额不会出现负值。

考虑两种情况:

  1. 提款操作:线程在释放互斥锁之前会检查账户余额是否足够提取提款金额。如果账户余额不足,则不会执行提款操作,直接返回 false。这意味着即使多个线程同时尝试提款,只有一个线程会成功提款,因为其他线程会在检查余额时发现不足,从而放弃提款操作。因此,不会出现竞态条件。
  2. 存款操作:线程在释放互斥锁之前会直接将存款金额加到账户余额上,而不会有其他操作。因为存款金额必须大于等于0,所以存款操作不会导致账户余额变为负值。多个线程同时执行存款操作时,由于每个线程都会在加金额操作之前确保不变量成立,所以不会出现竞态条件。

综上所述,若每个执行中的线程在放弃互斥锁之前都能保证不变量成立,即确保操作前的条件正确,那么所有线程皆不会导致竞态条件成立。因此,银行账户的提款/存款事务的管程能够有效地避免竞态条件。

当一个线程执行管程中的一个子程序时,称为占用(occupy)该管程. 管程的实现确保了在一个时间点,最多只有一个线程占用了该管程。这是管程的互斥锁访问性质,即任何时候只有一个进程在管程中执行,这种特性由编译器实现,编程语言负责封装。

  1. 同步
    通过条件变量condition来获得同步,可以理解为一个同步信号量
  • cwait:直接在条件变量c上阻塞调用进程

  • csignal:直接释放条件变量c上某个阻塞进程;若无,返回

在这里插入图片描述
在这张图中展示的是一个监控(Monitor)结构的示意图。在并发编程中,监控是一种同步机制,用于控制对共享资源的访问,确保在任何给定时刻只有一个线程可以执行临界区代码。

图中详细展示了以下几个关键组件:

  1. 入口队列(Queue of entering processes):

    • 这是一个等待区域,所有试图进入监控的进程都会首先进入这个队列。只有前面的进程退出监控后,队列中的下一个进程才可以进入。
  2. 本地数据(Local data):

    • 监控内部的数据,被所有进入监控的过程共享。
  3. 条件变量(Condition variables):

    • 用于控制进程在特定条件不满足时的等待和唤醒。每个条件变量可以有一个关联的等待队列,当条件未满足时,进程可以在此等待。
  4. 过程(Procedure 1 to Procedure k):

    • 监控中定义的方法或过程,这些方法通过互斥保证在任何时刻只有一个进程可以执行。
  5. 紧急队列(Urgent queue):

    • 在某些实现中,当一个进程在条件变量上被唤醒时(通过csignal),它可能会被放入一个特别的紧急队列。这意味着这个进程将在释放监控的互斥锁之前得到处理的优先权。
  6. cwait 和 csignal 操作:

    • cwait(cn): 表示在条件变量 cn 上等待。调用此操作的进程将阻塞,直到其他进程通过 csignal 唤醒它。
    • csignal(cn): 用于唤醒在条件变量 cn 上等待的一个进程。如果没有进程在等待,则这个调用无效果。

图中还提到了两种主要的监控实现方式:Hoare 方法Lampson/Redell 方法,这些不同的方法定义了条件变量的行为以及如何处理等待和唤醒的进程。

  • Hoare 方法:在这种方法中,当一个进程被 csignal 唤醒时,发出信号的进程将直接将控制权交给被唤醒的进程。被唤醒的进程在退出监控前不会释放互斥锁。
  • Lampson/Redell 方法:在此方法中,发出信号的进程在完成自己的剩余代码后继续执行,而被唤醒的进程将等待直到监控的互斥锁可用。

这样的结构和操作保证了对共享资源的安全访问和协调,并减少了死锁和竞态条件的可能性。

最后,本节内容总结如下:
image.png
这一小节的内容主要讲的是管程,管程是基于编程语言开发的一种程序结构,它为各外部进程/现成提供了特定的入口,且每次只允许一个进程在管程内执行某个内部过程(类似于函数调用)。管程通过编译器实现各进程之间的互斥,通过设置条件变量解决同步问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1689053.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (十一)

基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;十一&#xff09; LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 Lla…

【网络安全】2030年十大新兴网络安全威胁

欧盟网络安全局&#xff08;ENISA&#xff09;已发布了一份全面的清单&#xff0c;列出了预计到2030年将影响数字领域的十大新兴网络安全威胁。 该预测是为期八个月的广泛研究的成果&#xff0c;融合了ENISA前瞻专家小组、CSIRTs网络以及欧盟CyCLONe专家的见解。 这项研究突显…

Wpf 使用 Prism 实战开发Day23

自定义对话框服务 当原有对话框不能满足需求的时候&#xff0c;可以通过自定义对话框来实现特殊的需求 一.自定义对话框主机服务步骤&#xff1a; 1.建立一个IDialogHostService 接口类&#xff0c;继承自 IDialogService 对话框服务类。并且自定义基类的服务方法。 public …

真实案例分享,终端pc直接telnet不到出口路由器。

1、背景信息 我终端pc的网卡地址获取的网关是在核心交换机上&#xff0c;在核心交换机上telnet出口路由器可以实现。 所有终端网段都不能telnet出口路由器&#xff0c;客户希望能用最小的影响方式进行解决。 2、现有配置信息 终端的无线和有线分别在两个网段中&#xff0c;…

案例题(第一版)

案例题目 软件架构设计考点&#xff08;历年必考&#xff09; 软件架构设计通常在每年的第一题&#xff0c;该题必考 必备概念 必备概念即考试必须要默写出来的概念 概念描述软件架构风格是指描述特定软件系统组织方式和惯用模式。组织方式描述了系统的组成构件和这些构件的组…

从“图形可视化”到“图生代码”,低代码平台的新挑战

前言&#xff1a; 低代码平台最大的一个特点就是可视化&#xff0c;将代码采用可视化的方式展示管理。一时间拥有图形化界面的各类系统都挂上了低代码的标签。但更多的代码从业者在使用中却发现&#xff0c;在众多的低代码平台中都是“别人家的代码”其可视化主要是别人家的代…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-23.1,2 讲 I2C驱动

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

SpringBoot+layuimini实现角色权限菜单增删改查(layui扩展组件 dtree)

角色菜单 相关组件方法效果图MySQL代码实现资源菜单树组件实现权限树方法js这里我先主要实现权限树的整体实现方法&#xff0c;如果是直接查看使用的话可以只看这里&#xff01; 后端代码Controlle层代码Service代码及实现类代码Service代码ServiceImpl代码 resourceMapper 代码…

指数分布的理解,推导与应用

指数分布的定义 在浙大版的教材中&#xff0c;指数分布的定义如下&#xff1a; 若连续型的随机变量 X X X的概率密度为&#xff1a; f ( x ) { 1 θ e − x θ , x>0 0 , 其他 f(x) \begin{cases} \frac{1}{\theta} e^{-\frac{x}{\theta}}, & \text{x>0}\\ 0, &a…

Jenkins 构建 Web 项目:构建服务器和部署服务器分离的情况

构建命令 #!/bin/bash node -v pnpm -v pnpm install pnpm build:prod # 将dist打包成dist.zip zip -r dist.zip dist

BLE学习笔记(0.0) —— 基础概念(0)

前言 &#xff08;1&#xff09;本章节主要是对BLE技术进行简单的介绍&#xff0c;熟悉蓝牙技术的发展过程&#xff0c;了解相关术语方便后续的学习。 &#xff08;2&#xff09;为了防止单篇博客太长以至于看不下去&#xff0c;因此我基础概念章节分为两篇来写。 &#xff08;…

创新指南|利用电商产品视频进行渠道营销的最佳策略,不断提升销售额

无论企业的利基市场如何&#xff0c;电商产品视频都已被证明是非常可靠的资产&#xff0c;可以让目标受众了解您所提供的产品——关键功能、展示重要的差异化优势甚至改变大多数营销活动的游戏规则。阅读本文&#xff0c;全面了解电商产品视频如何融入营销推广&#xff0c;以最…

IDEA 自定义注解(类注释、方法注释)

一、生成类注释 1、打开设置位置 打开File —> Settings —> Editor —> File and Code Templates —> Files —> Class 2、将自定义的类注解规则&#xff0c;复制到Class中。 /** * * 功能: * * 作者: 暗自着迷 * * 日期: ${YEAR}-${MONTH}-${DAY} ${HOU…

AI图片过拟合如何处理?答案就在其中!

遇到难题不要怕&#xff01;厚德提问大佬答&#xff01; 厚德提问大佬答8 你是否对AI绘画感兴趣却无从下手&#xff1f;是否有很多疑问却苦于没有大佬解答带你飞&#xff1f;从此刻开始这些问题都将迎刃而解&#xff01;你感兴趣的话题&#xff0c;厚德云替你问&#xff0c;你解…

头歌openGauss-存储过程第2关:修改存储过程

任务描述 本关任务&#xff1a; 修改存储过程pro0101&#xff0c;并调用&#xff1b; --修改sel_course表中成绩<60的记录为成绩10&#xff0c;然后将计算机学院所有学生的选课成绩输出&#xff1b; --a、需要先删除存储过程pro0101&#xff1b; drop procedure if exists p…

JAVA开发 基于最长公共子序列来计算两个字符串之间的重复率

计算两个字符串之间的重复率 最长公共子序列实现代码 最长公共子序列 基于最长公共子序列&#xff08;Longest Common Subsequence, LCS&#xff09;的重复率的中心逻辑是首先找到两个或多个序列中同时出现的、不一定连续但保持相对顺序的最长子序列&#xff0c;然后计算这个最…

5款AI工具,PS插件的智能升级

在Photoshop插件的世界里&#xff0c;创新和效率是永远的主题。随着AI技术的融入&#xff0c;传统的PS插件正在经历一场革命。本文将介绍五款结合了人工智能技术的PS插件&#xff0c;它们不仅提升了设计工作的效率&#xff0c;还拓展了创意的边界。 StartAI —— 智能设计的未来…

【因果推断从入门到精通二】随机实验3

目录 检验无因果效应假说 硬币投掷的特殊性何在&#xff1f; 检验无因果效应假说 无因果效应假说认为&#xff0c;有些人存活&#xff0c;有些人死亡&#xff0c;但接受mAb114治疗而不是ZMapp与此无关。在174例接受mAb14治疗的患者中&#xff0c;113/17464.9%存活了28天&…

画图工具之PlantUML插件使用

文章目录 1 PlantUML插件1.1 引言1.2 什么是PlantUML1.3 PlantUML插件1.3.1 IntelliJ IDEA中插件1.3.2 VS Code中插件1.3.3 使用例子 1.4 PlantUML时序图语法1.4.1 声明参与者1.4.2 消息传递1.4.2.1 同步消息1.4.2.2 异步消息1.4.2.3 返回消息1.4.2.4 自调用 1.4.3 生命线&…

字符函数:分类函数与转换函数

字符函数 一.字符分类函数二.字符转换函数 在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了方便操作字符和字符串&#xff0c;C语⾔标准库中提供了一系列库函数&#xff0c;接下来我们就学习⼀下这些函数。 一.字符分类函数 C语言中有⼀系列的函数是专门…