这次的比喻场景要升级了,因为它既能解决互斥问题,也能解决同步问题。我们用一个更综合的场景:一个拥有多辆共享单车的站点

  • 共享单车 (资源):站点里有多辆共享单车,数量是有限的。
  • 你 (进程):想借一辆车去办事。
  • 站点管理员 (操作系统):他提供了一套标准化的借车、还车流程(P、V操作)。

1. 为什么需要新工具?—— 回顾历史遗留问题

在发明信号量之前,我们遇到的最大问题是 “忙等待”。无论是 Peterson 算法还是 TSL 指令,当一个进程拿不到锁(借不到车)时,它只会在原地打转,不停地问“有车了吗?有车了吗?”,白白浪费自己的精力(CPU资源)。这不高效!

我们需要一个更聪明的机制,让进程在借不到车时,可以去旁边的休息室睡觉,等有车了再被叫醒。

2. 信号量机制的核心思想

  • 信号量 (Semaphore):你可以把它理解成站点门口的一个记分牌,上面写着当前可用单车的数量。比如,牌子上写着5,就表示还有5辆车可用。
  • 原语 (Primitive):管理员提供了一对不可分割的、标准化的操作流程,叫做原语。这意味着,当管理员在执行这个流程时,谁也不能打扰他,必须让他一气呵成地做完。这两个流程就是大名鼎鼎的 P操作 和 V操作

3. 整型信号量 - “简陋的记分牌”

这是信号量的第一版设计,比较简单,但也暴露了问题。

  • 数据结构:就是一个简单的整数 S (比如,int S = 5;)。

  • P操作 (荷兰语 Proberen, 尝试):相当于“借车”流程。

    1. 你想借车,就去执行P操作。
    2. 管理员看一眼记分牌 S
    3. 只要 S > 0(还有车),他就让 S--(车数减一),然后让你通过。
    4. 如果 S <= 0(没车了),他就把你拦在门口,让你在门口一直等while(S<=0);),直到有人还车。
  • V操作 (荷兰语 Verhogen, 增加):相当于“还车”流程。

    1. 你用完车,回来执行V操作。
    2. 管理员直接让 S++(车数加一)。
  • 存在的问题

    • 这个设计最大的问题是,当没车时,你还是得在门口“忙等待”,死死盯着记分牌,没有解决根本问题。它不满足“让权等待”原则

4. 记录型信号量 - “带排队系统的智能记分牌”

这是整型信号量的完美升级版,也是我们现在操作系统中真正使用的信号量。它解决了“忙等待”问题。

  • 数据结构:它不再是一个简单的整数,而是一个“智能记分牌”,包含两个部分:

    • 一个整数 value:表示当前可用资源的数量。
    • 一个等待队列 L:这是一个“排队列表”,用来记录所有正在等待借车的进程。
  • P操作 (智能的“借车”流程)

    1. 你想借车,执行P操作。
    2. 管理员先让 value--。这一步很有意思,可以理解为“先预定一辆车”。
    3. 然后他检查 value 的值:
      • 如果 value >= 0:这说明在你预定之前,车是富余的。你预定成功,直接骑车走人。
      • 如果 value < 0:这说明在你预定之前,车就已经没了(甚至已经有人在排队等了)。你的这次“预定”让欠账变得更多了。于是,管理员会把你这个进程**“挂起”(阻塞),然后把你的名字登记到那个等待队列 L** 上,让你去休息室睡觉。
  • V操作 (智能的“还车”流程)

    1. 你用完车,回来执行V操作。
    2. 管理员先让 value++。这可以理解为“还了一辆车回来,可用资源增加了”。
    3. 然后他检查 value 的值:
      • 如果 value > 0:这说明即使加上你还的这辆车,也没有人在排队等车。一切正常。
      • 如果 value <= 0:这说明在你还车之前,是有人在排队等车的(value是负数或零)。现在你还了一辆车,正好可以满足一个在排队的人。于是,管理员会从等待队列 L 里唤醒一个进程,让他从休息室出来,把这辆车骑走。
  • 精髓所在

    • 记录型信号量通过引入“等待队列”和“阻塞/唤醒”机制,完美地实现了**“让权等待”**。进程在获取不到资源时,会主动让出CPU去“睡觉”,而不是空转,极大地提高了系统效率。
    • value 的绝对值在 value < 0 时,也巧妙地表示了正在等待队列中排队的进程数量。

一句话总结:记录型信号量 = 资源计数器 + 等待队列,是实现进程同步与互斥的终极武器之一。


必会题与详解

题目一:什么是“原语”?为什么P、V操作必须是原语?如果不是原语会发生什么?

答案详解

  1. 原语的定义:原语(Primitive)是由若干条指令组成的,用于完成特定功能的一个过程。它最大的特点是执行的原子性,即它的执行过程是不可中断的,必须一气呵成。这通常是通过硬件支持(如关中断/开中断、TSL指令等)来实现的。

  2. 必须是原语的原因:P、V操作都涉及到对信号量 S 的检查和修改。如果这个过程可以被中断,就会出现严重问题。

    • 以P操作为例P(S) 的伪代码是 S--。如果两个进程同时执行 P(S),正确的逻辑是S被减2。但如果 S-- 不是原语,它在机器层面可能分为三步:1. 读S到寄存器;2. 寄存器减1;3. 写回S。
    • 可能发生的错误
      1. 进程A执行第1步,读取S=1到自己的寄存器。
      2. 此时发生中断,切换到进程B。
      3. 进程B也执行第1步,读取S=1到自己的寄存器。然后执行完2、3步,将S写回为0。
      4. 切换回进程A,它从第2步继续执行,将自己的寄存器(值仍为1)减1得0,再写回S。
      • 结果:两个进程都执行了P操作,但S最终只被减了1,而不是2。这会导致一个资源被两个进程同时获取,破坏了互斥性。
  3. 结论:因此,P、V操作必须是原语,以确保对信号量变量访问的原子性,从而保证进程互斥与同步的正确实现。

题目二:记录型信号量是如何实现“让权等待”的?请与整型信号量进行对比说明。

答案详解

“让权等待”指的是进程在无法获取所需资源时,应主动释放CPU,进入阻塞状态。

  1. 记录型信号量的实现方式

    • 它通过一个等待队列(阻塞队列)阻塞/唤醒原语来实现让权等待。
    • 当一个进程执行P操作,发现资源不足(value变为负数)时,操作系统会调用**block原语**,将该进程的状态从“运行态”变为“阻塞态”,并将其PCB(进程控制块)放入信号量的等待队列中。这个过程进程主动放弃了CPU。
    • 当其他进程执行V操作释放资源,并发现等待队列中有人时,操作系统会调用**wakeup原语**,从等待队列中取出一个进程,将其状态从“阻塞态”变为“就绪态”,放入就绪队列,等待被调度。
    • 通过这种“睡下-被叫醒”的模式,CPU在进程等待期间可以去服务其他进程,实现了“让权等待”。
  2. 与整型信号量的对比

    • 整型信号量在资源不足时(S<=0),其P操作会进入一个while(S<=0);的循环。进程会一直处于“运行态”,持续占用CPU来反复检查S的值,这就是“忙等待”。它没有让出CPU,因此不满足“让权等待”原则,效率低下。

题目三:在一个使用记录型信号量的系统中,若某个信号量S的当前值为-3,这代表什么物理含义?

答案详解

在记录型信号量机制中,S.value 的值具有双重含义:

  • 当 S.value >= 0 时,它表示当前系统中剩余可用资源的数量
  • 当 S.value < 0 时,它表示当前没有可用资源,并且其绝对值代表正在该信号量的等待队列中排队等待的进程数量

因此,如果信号量S的当前值为-3,其物理含义是:

  1. 该类资源已经全部被分配完毕,没有剩余可用资源。
  2. 有 3个 进程因为请求该资源而被阻塞,并正在该信号量的等待队列中排队等待。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

零基础 “入坑” Java--- 十、继承

文章目录一、何为继承二、继承语法三、父类成员访问1.成员变量2.成员方法四、super关键字五、子类构造方法六、super和this辨析七、再谈初始化八、protected关键字九、继承方式十、final关键字十一、继承与组合根据我们学过的类的知识&#xff0c;我们来定义两个类&#xff1a;…

JS进阶-day1 作用域解构箭头函数

作用域全局作用域——>尽量少使用&#xff0c;避免变量污染局部作用域——>函数作用域、块级作用域作用域链——>底层变量查找机制&#xff08;先在当前函数作用域查找&#xff0c;如果找不到&#xff0c;就沿着作用域链向上级作用域查找&#xff0c;直到全局作用域&a…

Arduino 无线通信实战:使用 RadioHead实现 315MHz 433M模块数据传输

本文将介绍如何使用 Arduino 和 RadioHead 库实现 315MHz&#xff08;或 433MHz&#xff09;ASK 无线通信。通过两个 Arduino 控制板&#xff0c;一个作为发射端&#xff0c;一个作为接收端&#xff0c;实现“按键控制 → 无线发送 → LED 控制”的基础通信功能&#xff0c;非常…

012_PDF处理与文档分析

PDF处理与文档分析 目录 PDF支持概述支持的功能文档限制上传方式分析能力应用场景最佳实践 PDF支持概述 核心能力 Claude现在可以直接处理PDF文档&#xff0c;提供全面的文档分析能力。这项功能支持&#xff1a; 文本内容分析&#xff1a;提取和理解PDF中的文本图像识别&…

系规备考论文:论IT服务知识管理

论IT服务知识管理 摘要 2022年7月,我公司中标某市化工厂网络视频监控管理系统综合平台运维服务项目,并任命我为系统规划与管理师。该项目组织结构为项目型,合同金额为115.5万元(含税),工期为1年。本运维服务项目的主要工作包括系统软件和网络设备的日常监控与维护,定期…

2025.7.12总结

最近又两三天没写总结了&#xff0c;如今必须要写一稿&#xff0c;毕竟事关赚钱认知的一次颠覆。在我原有的认知里&#xff0c;赚钱&#xff0c;就是通过出卖自己的劳动时间&#xff0c;精力&#xff0c;给他人提供价值输出。但是&#xff0c;赚钱&#xff0c;只能通过出卖体力…

把 DNA 当 PCIe:一条 365 nt 链实现 64 Gbps 片上光互连——基于链式 Förster 共振的分子级波分复用链路

作者 | Blossom.118 2025-07-13 关键词&#xff1a;DNA 光子学、FRET 波分复用、分子 PCIe、零能耗光链路、CMOS 兼容、开源版图 ---- 1. 为什么用 DNA 做光互连&#xff1f; • 带宽密度&#xff1a;硅光 1 m 波导最高 0.4 Tbps/mm&#xff1b;一条 2 nm 直径的 DNA 双链&am…

[论文阅读]Text Compression for Efficient Language Generation

Text Compression for Efficient Language Generation [2503.11426] Text Compression for Efficient Language Generation NAACL 2025 提出了“Generative Pretrained Thoughtformer”&#xff08;GPTHF&#xff09;&#xff0c;这是一个分层 transformer 语言模型&#xf…

SwiftUI 7 新 WebView:金蛇出洞,网页江湖换新天

概述 崇祯年间&#xff0c;华山派武学虽盛&#xff0c;却在应对江湖新局时渐显颓势&#xff1b;如今 SwiftUI 江湖亦是如此 ——WWDC 25 之前&#xff0c;若要在 SwiftUI 中显示网页&#xff0c;开发者恰似袁承志初闯江湖&#xff0c;纵有一身本领&#xff0c;却苦无称手兵刃。…

LeetCode|Day9|976. 三角形的最大周长|Python刷题笔记

LeetCode&#xff5c;Day9&#xff5c;976. 三角形的最大周长&#xff5c;Python刷题笔记 &#x1f5d3;️ 本文属于【LeetCode 简单题百日计划】系列 &#x1f449; 点击查看系列总目录 >> &#x1f4cc; 题目简介 题号&#xff1a;976. 三角形的最大周长 难度&#x…

华擎B150M Pro4S魔改bios上8代U

100、200系主板魔改bios在DIY领域当属于历史性事件&#xff0c;2018年左右兴起。虽然现在已经是2025年&#xff0c;魔改bios已经没有多大意义&#xff0c;但是跟着前辈的教程魔改一次&#xff0c;可以重温下当年DIY玩家的激情。 魔改教程在SMXDIY网站&#xff0c;写的非常详细&…

音视频学习(三十七):pts和dts

概念 PTS&#xff08;Presentation Time Stamp&#xff09;显示时间戳 表示&#xff1a;该帧应该在什么时间被显示/播放。主要用于&#xff1a;同步音频与视频&#xff0c;控制播放节奏。举例&#xff1a;视频帧 A 的 PTS 是 300ms&#xff0c;表示应在视频播放第 300 毫秒时显…

关于数据库的慢查询

1.数据库的慢查询慢查询是指执行时间超过预设阈值的数据库查询操作。它是数据库性能优化的一个重要指标和切入点。慢查询的主要特点执行时间长&#xff1a;超过了数据库系统设定的慢查询阈值&#xff08;如MySQL默认是10秒&#xff09;资源消耗大&#xff1a;可能占用大量CPU、…

【Rust日报】 Python 核心开发者对 Rust 的期望

半月刊&#xff1a;The Embedded Rustacean Issue #49亮点&#xff1a;&#x1f4e2; 乐鑫 DevCon 2025 演讲嘉宾征集&#x1f9ba; CISA 和 NSA 参与内存安全对话&#x1f510; 微软宣布 RIFT &#xff08;Rust 恶意软件分析工具&#xff09;&#x1f4b0;️ Nordic 收购 Memf…

vue是什么

Vue简介Vue&#xff08;Vue.js&#xff09;是一个用于构建用户界面的渐进式JavaScript框架。它专注于视图层&#xff0c;易于集成到现有项目中&#xff0c;也可用于开发复杂的单页面应用&#xff08;SPA&#xff09;。Vue的核心特点是轻量、灵活和高效&#xff0c;通过数据绑定…

10分钟掌握 Nginx 配置文件结构

在实际部署前端或后端项目时&#xff0c;Nginx 配置文件&#xff08;nginx.conf&#xff09; 是我们无法绕开的第一道门槛。 本文将带你用10分钟掌握 nginx.conf 的核心结构与常见配置方法&#xff0c;并提供一篇完整的实战文档链接&#xff0c;适合初学者快速掌握。 &#x1…

典型的前后端交互数据示例

提供几种典型的前后端交互数据示例&#xff1a; 前端如何组织数据&#xff0c;以及后端如何接收数据。 文章目录1. POST请求后端实体类接收前端js后端接收结果查看2. GET请求后端实体类接收前端js后端接收结果查看3. GET请求后端基本类型接收前端js后端接收结果查看1. POST请求…

计算机毕业设计springboot影视周边推荐系统 基于SpringBoot的电影衍生品智能推荐平台 JavaWeb实现的影视文化周边个性化服务系统

计算机毕业设计springboot影视周边推荐系统6c31q9 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。疫情之后&#xff0c;线上娱乐需求激增&#xff0c;人们对电影及其衍生商品的关…

(4)机器学习小白入门YOLOv :图片标注实操手册

(1)机器学习小白入门YOLOv &#xff1a;从概念到实践 (2)机器学习小白入门 YOLOv&#xff1a;从模块优化到工程部署 (3)机器学习小白入门 YOLOv&#xff1a; 解锁图片分类新技能 (4)机器学习小白入门YOLOv &#xff1a;图片标注实操手册 (5)机器学习小白入门 YOLOv&#xff1a;…

【JMeter】调试方法

文章目录取样器&#xff1a;发送请求、接收响应>>察看结果树断言&#xff1a;验证响应>>察看结果树提取器&#xff1a;创建变量>>调试取样器自定义断言&#xff1a;代码>>日志了解JMeter的内部细节&#xff0c;排查错误的原因。取样器&#xff1a;发送…