【操作系統】進程管理——信號量機制(個人筆記)

學習日期:2024.7.9

內容摘要:信號量機制,用信號量實現進程的同步與互斥


信號量機制

信號量的概念

在上節內容中,我們學習了進程互斥的軟件和硬件解決方案,但這些方案都有各自的問題,雙標志法都因為檢查和上鎖兩個步驟不能一氣呵成,會導致兩個進程一起進入臨界區,而Peterson算法和幾個基于硬件實現方式的方法雖然解決了這些問題,但這些方法都會導致忙等。

1965年,荷蘭科學家Dijkstra(就是《數據結構》圖論那位)提出了一種實現進程同步、互斥的方法——信號量機制。

信號量其實就是一個變量(可以是一個整數,也可以是更復雜的數據結構的變量),可以用一個信號量來表示系統中某種資源的數量,比如系統只有一臺打印機,就可以設置一個初始值為1的信號量。

用戶進程可以通過操作系統提供的一對原語來對信號量進行操作,從而很方便的實現進程互斥和同步。

一對原語:wait(S)原語和signal(S)原語,信號量S是函數調用時傳入的一個參數,而wait和signal兩個原語常簡稱為P,V操作(來自荷蘭語proberen和verhogen),簡寫為P(S)和V(S)

整型信號量

用一個整數型的變量作為信號量,用來表示系統中某種資源的變量。

例:假如某系統中有一臺打印機,初始化整型信號量S,S=1。P操作是占用資源,S=S-1,V操作是釋放資源,S=S+1,每次調用之前先判斷S的值,如果S>=1,就P一次,否則等待。

邏輯很簡單,就是用S來計數,因為用了原語實現檢查和上鎖一氣呵成,避免了并發、異步導致的問題。

缺點:還是要利用while結果循環等待,不滿足“讓權等待”原則,沒有解決忙等問題。

記錄型信號量(重點)

整型信號量的缺陷是存在忙等問題,因此人們又提出了記錄型信號量,即用一種記錄型數據結構表示信號量

假如S=2,每次進行一次P操作,S.value--,每次執行一次V操作,S.value++,如果P操作后小于0,進程阻塞,當S為負時,S.value的絕對值就是正在等待資源的進程的數目

P操作中一定是先S.value--,之后如果S<0再block;V操作中一定是先S.value++,之后如果S.value<=0再wakeup。注意理解原因

S.value的初始值表示系統中某種資源的數目,S.value++后<=0,說明有進程在等待資源,因此調用wakeup原語喚醒等待隊列中的第一個進程(被喚醒進程從阻塞態轉換為就緒態)。

S.value==0,資源恰好分配完,S.value==-x,有x個進程正在等待資源。

因為在資源不足時,進程會使用block原語自我阻塞,主動放棄處理機,所以遵循了讓權等待原則,不會出現忙等

用信號量機制實現進程的同步與互斥

一個信號量對應一種資源,信號量的值=這種資源的剩余數量(信號量的值如果小于0,說明有進程在等待這個資源,絕對值即為等待的進程數)

信號量機制實現進程互斥

1.分析并發進程的關鍵活動,劃分臨界區

2.設置互斥信號量mutex,初始值為1,對不同的臨界資源要設置不同的互斥信號量

3.在進入區P(mutex),申請資源

4.在退出區V(mutex),釋放資源

注意:P,V操作必須要成對出現,申請資源和釋放資源一定會成對出現。

信號量機制實現進程同步

知識回顧:進程同步:讓各并發的進程按照某種我們期望的順序推進。

1.分析什么地方需要同步關系,即分析需要“一前一后”的兩個(或更多)操作

2.設置同步信號量S初始值為0

3.在“前操作”之后執行V(S)

4.在“后操作”之前執行P(S)

比如說兩個進程A,B,我們希望A先執行,B后執行。此時S代表一個信號,即A已經完成的信號。在A執行完之后,釋放信號在B執行之前,檢查信號。簡記為“前V后P,前后后前

如果先執行到B,因為會先進行P(S)操作,此時S--后S=-1,表示此時沒有可用資源,因此P操作中會執行block原語,進程會進入阻塞隊列。當執行完A之后,S++,此時S>=0,就會在V操作中執行wakeup原語,喚醒B進程,這樣就實現了按我們期望的順序推進進程。


感謝您看到這里,如果滿意的話麻煩您點個贊支持一下,個人主頁還有更多內容分享。

內容總結自王道計算機考研《操作系統》 和 人民郵電出版社《操作系統導論》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/43991.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43991.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/43991.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【自用】【高昆輪概率論與數理統計筆記】2.1 分布函數的概念與性質

不定期更新&#xff0c;前面的章節會在學完后補回來&#xff0c;重新學學概率&#xff0c;當年考研考的數學二&#xff0c;沒有概率基礎&#xff0c;想自己補補&#xff0c;視頻課是高昆輪老師講的浙大四版概率論教材的視頻課&#xff0c;地址&#xff1a; 第一章&#xff1a;h…

數據庫MySQL---基礎篇

存儲和管理數據的倉庫 MySQL概述 數據庫相關概念 數據庫&#xff08;DataBase&#xff09;---數據存儲的倉庫&#xff0c;數據是有組織的進行存儲 數據庫管理系統&#xff08;DBMS&#xff09;-----操縱和管理數據庫的大型軟件 SQL----操作關系型數據庫的編程語言&#xff…

Python:安裝/Mac

之前一直陸陸續續有學python&#xff01;今天開始&#xff01;正式開肝&#xff01;&#xff01;&#xff01; 進入網站&#xff1a;可能會有點慢&#xff0c;多開幾個網頁 https://www.python.org 點擊下載&#xff0c;然后進入新的頁面&#xff0c;往下滑 來到File&#xff0…

實時溫濕度監測系統:Micropython編碼ESP32與DHT22模塊的無線數據傳輸與PC端接收項目

實時溫濕度監測系統 前言項目目的項目材料項目步驟模擬ESP32接線連接測試搭建PC端ESP32拷錄環境對ESP32進行拷錄PC端搭建桌面組件本地數據接收桌面小組件部分 實驗總結 前言 人生苦短&#xff0c;我用Python。 由于我在日常工作中經常使用Python&#xff0c;因此在進行該項目…

基于java+springboot+vue實現的校園二手書交易平臺(文末源碼+Lw)287

摘 要 信息數據從傳統到當代&#xff0c;是一直在變革當中&#xff0c;突如其來的互聯網讓傳統的信息管理看到了革命性的曙光&#xff0c;因為傳統信息管理從時效性&#xff0c;還是安全性&#xff0c;還是可操作性等各個方面來講&#xff0c;遇到了互聯網時代才發現能補上自…

Vue中v-for和v-if優先級(2、3)

Vue中v-for和v-if優先級&#xff08;2、3&#xff09; Vue2 在Vue2當中,v-for優先級要優于v-if,也就是說&#xff0c;當它倆同時沿用時&#xff0c;v-for先遍歷&#xff0c;v-if再判斷。 Vue2源碼位置 \vue-dev\src\compiler\codegen\index.js export function genElement…

如何構建數據驅動的企業?爬蟲管理平臺是關鍵橋梁嗎?

一、數據驅動時代&#xff1a;為何選擇爬蟲管理平臺&#xff1f; 在信息爆炸的今天&#xff0c;數據驅動已成為企業發展的核心戰略之一。爬蟲管理平臺&#xff0c;作為數據采集的第一站&#xff0c;它的重要性不言而喻。這類平臺通過自動化手段&#xff0c;從互聯網的各個角落…

windows的遠程桌面連接docker

1. Docker容器中運行遠程桌面服務 (RDP)&#xff1a;您的Docker容器需要安裝和運行遠程桌面服務。通常&#xff0c;遠程桌面服務在Windows操作系統上可用。如果您使用的是Linux容器&#xff0c;則需要安裝一個支持RDP協議的桌面環境和RDP服務器。 2. 開放RDP端口&#xff1a;通…

什么是RPC?有哪些RPC框架?

定義 RPC&#xff08;Remote Procedure Call&#xff0c;遠程過程調用&#xff09;是一種允許運行在一臺計算機上的程序調用另一臺計算機上子程序的技術。這種技術屏蔽了底層的網絡通信細節&#xff0c;使得程序間的遠程通信如同本地調用一樣簡單。RPC機制使得開發者能夠構建分…

【常見開源庫的二次開發】一文學懂CJSON

簡介&#xff1a; JSON&#xff08;JavaScript Object Notation&#xff09;是一種輕量級的數據交換格式。它基于JavaScript的一個子集&#xff0c;但是JSON是獨立于語言的&#xff0c;這意味著盡管JSON是由JavaScript語法衍生出來的&#xff0c;它可以被任何編程語言讀取和生成…

Django 實現子模版繼承父模板

背景 Django的占位符&#xff0c;如果不繼承父模板的內容&#xff0c;會被子模版所覆蓋&#xff0c;有些業務場景子模版也需要使用到父模板中的內容 可以使用Django自帶的標簽{% block super %}來實現此效果 base.html 最基礎html&#xff0c;相當于第一層html&#xff0c;bl…

代碼隨想錄算法訓練營day76 | Floyd 算法精講、A * 算法精講

本次題目來自于卡碼網 ??97. 小明逛公園 &#xff08;Floyd 算法精講&#xff09; 1、確定dp數組以及下標的含義 grid[i][j][k] m&#xff0c;表示 節點i 到 節點j 以[1...k] 集合為中間節點的最短距離為m 2、確定遞推公式 分兩種情況&#xff1a; 節點i 到 節點j 的最…

01 | 基礎架構:一條SQL查詢語句是如何執行的?

此系列文章為極客時間課程《MySQL 實戰 45 講》的學習筆記&#xff01; 引言 在了解 SQL 查詢語句如何執行之前&#xff0c;先了解下MySQL 的基本架構示意圖。 MySQL 分為 Server 層和引擎層。 Server 層包括連接器、查詢緩存、分析器、優化器、執行器等&#xff0c;涵蓋 M…

微球無菌篩分技術的巔峰之作:納維加特PV系列

在醫藥行業中&#xff0c;對微球的制備和篩分要求極高&#xff0c;納維加特&#xff08;Navector&#xff09;憑借其自主創新的PV系列微球無菌旋振篩&#xff0c;成功突破這一領域的技術壁壘。該產品不僅擁有高效率、高精度的篩分能力&#xff0c;同時還兼顧了高衛生級別的要求…

uniapp自動升級

一、創建云服務空間&#xff08;https://unicloud.dcloud.net.cn&#xff09; 云空間用于關聯需要版本控制升級的項目&#xff0c;如果已擁有云空間則省略此步驟。 二、搭建 uni升級中心 - 后臺管理系統&#xff08;升級中心 uni-upgrade-center - Admin&#xff09; uni-adm…

Linux調試器-gdb使用以及Linux項目自動化構建工具-make/Makefile

目錄 1.gdb背景2.開始使用gdb3.make/makefile 背景4.實例代碼5.依賴關系6.依賴方法7.原理8.項目清理 1.gdb背景 程序的發布方式有兩種&#xff0c;debug模式和release模式 Linux gcc/g出來的二進制程序&#xff0c;默認是release模式 要使用gdb調試&#xff0c;必須在源代碼生…

c++的makeFile怎么做

makeFile30分鐘 1 介紹&#xff08;makeFile是什么&#xff0c;30分鐘入門搞懂&#xff09;2 為什么要用makeFile3 如何制作makeFile文件&#xff1f;4 參考 makeFile真的很簡單&#xff0c;不要想的一下子全都學懂了&#xff0c;先入門了&#xff0c;然后在實踐中去使用&#…

Apache部署與配置

概述 介紹 Apache HTTP Server(簡稱Apache)是Apache的一個開源的網頁服務器&#xff0c;它源自NCSAhttpd服務器&#xff0c;并經過多次修改和發展&#xff0c;如今已經成為全球范圍內廣泛使用的Web服務器軟件之一 特點 跨平臺&#xff1a;可以運行在幾乎所有廣泛使用的計算機平…

36 特殊類設計

類&#xff0c;不能被拷貝 拷貝只會放生在兩個場景中&#xff1a;拷貝構造函數以及賦值運算符重載&#xff0c;因此想要讓一個類禁止拷貝。 c98 將拷貝構造函數與賦值云懸浮重載只聲明不定義&#xff0c;并且將其訪問權限設置為私有 class CopyBan{// ...private:CopyBan(co…

Apache中使用SSI設置

先停服務在修改httpd.conf&#xff0c;備份下 Apache\Apache24\conf 設置httpd.conf LoadModule ssl_module modules/mod_ssl.so 取消該命令前的注釋符# AddType text/html .shtml AddOutputFilter INCLUDES .shtml 取消該命令前的注釋符# 加入html AddType text/html .…