信號量機制,互斥的避免自旋鎖的實現方法(操作系統)

這次的比喻場景要升級了,因為它既能解決互斥問題,也能解決同步問題。我們用一個更綜合的場景:一個擁有多輛共享單車的站點

  • 共享單車 (資源):站點里有多輛共享單車,數量是有限的。
  • 你 (進程):想借一輛車去辦事。
  • 站點管理員 (操作系統):他提供了一套標準化的借車、還車流程(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;發送…