【操作系統】同步與互斥

同步與互斥

  • 一、同步與互斥的概念
    • 1.1 同步與異步
    • 1.2 進程互斥
  • 二、進程互斥的實現
    • 2.1 軟件實現
      • 2.1.1 單標志法
      • 2.1.2 雙標志先檢查法
      • 2.1.3 雙標志后檢查法
      • 2.1.4 Peterson法
    • 2.2 硬件實現
      • 2.2.1 中斷指令
      • 2.2.2 TestAndSet指令
      • 2.2.3 Swap指令
  • 三、互斥鎖
  • 四、信號量機制
    • 4.1 整型信號量
    • 4.2 記錄型信號量
    • 4.3 信號量機制實現
      • 4.3.1 實現進程互斥
      • 4.3.2 實現進程同步
      • 4.3.3 實現進程的前驅關系

一、同步與互斥的概念

1.1 同步與異步

在這里插入圖片描述

  • 異步性是指,各并發執行的進程以各自獨立的、不可預知的速度向前推進。

    • 例如:進程通信----管道通信
      在這里插入圖片描述
      讀進程和寫進程并發地運行,由于并發必然導致異步性,因此“寫數據”和“讀數據”兩個操作執行的先后順序是不確定的。而實際應用中,又必須按照“寫數據→讀數據”的順序來執行的。如何解決這種異步問題,就是“進程同步”所討論的內容。
  • 同步亦稱直接制約關系,它是指為完成某種任務而建立的兩個或多個進程,這些進程因為需要在某些位置上協調它們的工作次序而產生的制約關系。進程間的直接制約關系就是源于它們之間的相互合作。

1.2 進程互斥

在這里插入圖片描述
進程的“并發”需要“共享”的支持。各個并發執行的進程不可避免的需要共享一些系統資源(比如內存,又比如打印機、攝像頭這樣的I/O設備)
在這里插入圖片描述

我們把一個時間段內只允許一個進程使用的資源稱為臨界資源。許多物理設備(比如攝像頭、打印機)都屬于臨界資源。此外還有許多變量、數據、內存緩沖區等都屬于臨界資源。對臨界資源的訪問,必須互斥地進行。

互斥,亦稱間接制約關系。進程互斥指當一個進程訪問某臨界資源時,另一個想要訪問該臨界資源的進程必須等待。當前訪問臨界資源的進程訪問結束,釋放該資源之后,另一個進程才能去訪問臨界資源。

  • 對臨界資源的互斥訪問,可以在邏輯上分為如下四個部分
    在這里插入圖片描述

  • 為了實現對臨界資源的互斥訪問,同時保證系統整體性能,需要遵循以下原則:

    1.空閑讓進。臨界區空閑時,可以允許一個請求進入臨界區的進程立即進入臨界區;

    2.忙則等待。當已有進程進入臨界區時,其他試圖進入臨界區的進程必須等待 (拒絕搶資源)

    3.有限等待。對請求訪問的進程,應保證能在有限時間內進入臨界區 (保證不會饑餓)

    4.讓權等待。當進程不能進入臨界區時,應立即釋放處理機,防止進程忙等待(不讓“占茅坑”)

二、進程互斥的實現

2.1 軟件實現

在這里插入圖片描述

2.1.1 單標志法

  • 算法思想:兩個進程在訪問完臨界區后會把使用臨界區的權限轉交給另一個進程。也就是說每個進程進入臨界區的權限只能被另一個進程賦予。
    在這里插入圖片描述
  • 出現的問題:①⑤
    這個算法只能按 P0 →P1→P0 →P1→…這樣輪流訪問。這種必須“輪流訪問”帶來的問題是,如果此時允許進入臨界區的進程是 P0,而P0一直不訪問臨界區,那么雖然此時臨界區空閑,但是并不允許P1訪問。因此,單標志法存在的主要問題是:違背“空閑讓進”原則。

2.1.2 雙標志先檢查法

  • 算法思想:設置一個布爾型數組flag[ ],數組中各個元素用來標記各進程想進入臨界區的意愿
    比如“flag[0]=ture”意味著0號進程P0現在想要進入臨界區。每個進程在進入臨界區之前先檢查當前有沒有別的進程想進入臨界區,如果沒有,則把自身對應的標志flag[ ]設為true,之后開始訪問臨界區。
    在這里插入圖片描述
  • 出現的問題:①⑤②⑥③⑦
    P0和P1將會同時訪問臨界區。因此,雙標志先檢查法的主要問題是:違反“忙則等待”原則。原因在于,進入區的“檢查”和“上鎖”兩個處理不是一氣呵成的。“檢查”后,“上鎖”前可能發生進程切換。

2.1.3 雙標志后檢查法

  • 算法思想:雙標志先檢查法的改版。前一個算法的問題是先“檢查”后“上鎖”,但是這兩個操作又無法一氣呵成,因此導致了兩個進程同時進入臨界區的問題。因此,人們又想到 先上鎖后檢查 的方法,來避免上述問題。
    在這里插入圖片描述
  • 出現的問題:①⑤②⑥
    P0和P1將都無法進入臨界區。因此,雙標志后檢查法雖然解決了“忙則等待”的問題,但是又違背了“空閑讓進”和“有限等待”原則,會因各進程都長期無法訪問臨界資源而產生“饑餓”現象。兩個進程都爭著想進入臨界區,但是誰也不讓誰,最后誰都無法進入臨界區。

2.1.4 Peterson法

  • 算法思想結合雙標志法、單標志法的思想。如果雙方都爭著想進入臨界區,那可以讓進程嘗試“孔融讓梨”(謙讓)。做一個有禮貌的進程。
    在這里插入圖片描述

  • 出現的問題:Peterson算法用軟件方法解決了進程互斥問題,遵循了空閑讓進、忙則等待、有限等待三個原則,但是依然未遵循讓權等待的原則。

2.2 硬件實現

在這里插入圖片描述

2.2.1 中斷指令

利用“開/關中斷指令”實現(與原語的實現思想相同,即在某進程開始訪問臨界區到結束訪問為止都不允許被中斷,也就不能發生進程切換,因此也不可能發生兩個同時訪問臨界區的情況)

  • 優點:簡單,高效
  • 缺點:不適用于多處理機(也就是另外一個用戶進程也要使用臨界資源,也使用這樣的方法,那么就會導致兩個進程同時訪問臨界資源的情況);只適用于操作系統內核進程,不適用于用戶進程(因為開/關中斷指令只能運行在內核態,這組指令如果能讓用戶隨意使用會很危險)

2.2.2 TestAndSet指令

TSL指令是用硬件實現的,執行的過程不允許被中斷,只能一氣呵成。以下是用C語言描述的邏輯
在這里插入圖片描述
若剛開始lockfalse,則TSL返回的old值為falsewhile循環條件不滿足,直接跳過循環,進入臨界區。
若剛開始locktrue,則執行TLS后old返回的值為truewhile循環條件滿足,會一直循環,直到當前訪問臨界區的進程在退出區進行“解鎖”。相比軟件實現方法,TSL指令把“上鎖”和“檢查”操作用硬件的方式變成了一氣呵成的原子操作。

  • 優點:實現簡單,無需像軟件實現方法那樣嚴格檢查是否會有邏輯漏洞:適用于多處理機環境

2.2.3 Swap指令

Swap指令是用硬件實現的,執行的過程不允許被中斷,只能一氣呵成。以下是用c語言描述的邏輯
在這里插入圖片描述

三、互斥鎖

在這里插入圖片描述

  • 互斥鎖的主要缺點是:忙等待,當有一個進程在臨界區中,任何其他進程在進入臨界區時必須連續循環調用acquireO。當多個進程共享同一CPU時,就浪費了CPU周期。因此,互斥鎖通常用于多處理器系統,一個線程可以在一個處理器上等待,不影響其他線程的執行。

四、信號量機制

在這里插入圖片描述

  • 信號量:其實就是一個變量,可以用一個信號量來表示系統中某種資源的數量,比如:系統中只有一臺打印機,就可以設置一個初值為1的信號量
  • 一對原語wait(S)原語和signal(S)原語,括號里的信號量S其實就是函數調用時傳入的一個參數。wait(S)、signal(S) 兩個操作分別寫為P(S)、V(S)
  • 對信號量的操作只有三種:初始化、P操作、V操作

4.1 整型信號量

用一個整數型的變量作為信號量,用來表示系統中某種資源的數量。
在這里插入圖片描述

4.2 記錄型信號量

在這里插入圖片描述

  • P(S):申請一個資源S,如果資源不夠就阻塞等待。
  • V(S):釋放一個資源S,如果有進程在等待該資源,就喚醒一個進程。
  • P、V操作必須成對出現。缺少P(mutex)就不能保證臨界資源的互斥訪問。缺少V(mutex)會導致資源永不被釋放,等待進程永不被喚醒。

4.3 信號量機制實現

在這里插入圖片描述

4.3.1 實現進程互斥

在這里插入圖片描述

4.3.2 實現進程同步

在這里插入圖片描述

  • 實現同步的過程
    • 若先執行到V(S)操作,則S++S=1,釋放一個資源S。之后當執行到P(S)操作時,由于S=1,表示有可用資源,會執行S--S=0,P2進程不會執行block原語,而是繼續往下執行代碼4,5,6。
    • 若先執行到P(S)操作,由于S=0S--S=-1,表示此時沒有可用資源,因此P操作中會執行block原語,主動請求阻塞。之后當執行完代碼2,繼而執行V(S)操作,S++,使S變回0,由于此時有進程在該信號量對應的阻塞隊列中,因此會在V操作中執行wakeup原語,喚醒P2進程。這樣P2就可以繼續執行代碼4了

4.3.3 實現進程的前驅關系

在這里插入圖片描述

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

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

相關文章

C++ 正則表達式分組捕獲入門指南

在 C 中,正則表達式(regex)是一種用于匹配字符串模式的強大工具。正則表達式不僅能幫助你查找符合特定模式的字符,還能捕獲匹配的子字符串(即分組捕獲)。這篇文章將介紹 C 正則表達式中的分組捕獲機制&…

使用Docker方式一鍵部署MySQL和Redis數據庫詳解

一、前言 數據庫是現代應用開發中不可或缺的一部分,MySQL和Redis作為兩種廣泛使用的數據庫系統,分別用于關系型數據庫和鍵值存儲。本文旨在通過Docker和Docker Compose的方式,提供一個簡潔明了的一鍵部署方案,確保數據庫服務的穩…

性能附錄:如何計算并發用戶數(摘自高樓老師《性能30講》)

高樓老師《性能30講》: 性能測試實戰30講-極客時間 感興趣的同學可以去讀一下,個人感覺寫的非常好 目錄 什么是并發? 在線用戶數、并發用戶數怎么計算 總結 什么是并發? 我們假設上圖中的這些小人是嚴格按照這個邏輯到達系統的,那顯然,…

基于yolov8的糖尿病視網膜病變嚴重程度檢測系統python源碼+pytorch模型+評估指標曲線+精美GUI界面

【算法介紹】 基于YOLOv8的糖尿病視網膜病變嚴重程度檢測系統 基于YOLOv8的糖尿病視網膜病變嚴重程度檢測系統是一款利用深度學習技術,專為糖尿病視網膜病變早期診斷設計的智能輔助工具。該系統采用YOLOv8目標檢測模型,結合經過標注和處理的醫學影像數…

學習路程八 langchin核心組件 Models補充 I/O和 Redis Cache

前序 之前了解了Models,Prompt,但有些資料又把這塊與輸出合稱為模型輸入輸出(Model I/O)?:這是與各種大語言模型進行交互的基本組件。它允許開發者管理提示(prompt),通過通用接口調…

DeepSeek 開源狂歡周(五)正式收官|3FS并行文件系統榨干SSD

千呼萬喚始出來!在 DeepSeek 開源周 的第五天,今日正式收官!在大模型訓練中,每個epoch都在與存儲系統進行光速競賽——數據加載延遲會扭曲計算時空,KVCache訪問瓶頸將引發推理坍縮。DeepSeek開源的 3FS文件系統&#x…

特征工程中的三大向量化工具詳解

特征工程中的三大向量化工具詳解 在文本處理和特征工程中,TfidfVectorizer、CountVectorizer 和 DictVectorizer 是常用的工具,用于將原始數據轉換為機器學習模型可用的數值特征。以下是它們的核心區別、用法及示例: 1. CountVectorizer&…

C++ Qt常見面試題(4):Qt事件過濾器

在 Qt 中,事件過濾器(Event Filter)提供了一種機制,可以攔截并處理對象的事件(如鼠標事件、鍵盤事件等),在事件到達目標對象之前對其進行預處理。事件過濾器通常用于以下場景: 捕獲和處理特定的事件(如鼠標點擊、按鍵等);對事件進行篩選或修改;實現全局的事件監聽功…

TCP基本入門-簡單認識一下什么是TCP

部分內容來源:小林Coding TCP的特點 1.面向連接 一定是“一對一”才能連接,不能像 UDP 協議可以一個主機同時向多個主機發送消息,也就是一對多是無法做到的 2.可靠的 無論的網絡鏈路中出現了怎樣的鏈路變化,TCP 都可以保證一個…

PING命令TTL解析

在 ping 命令中,TTL(Time to Live,生存時間) 是 IP 數據包的核心字段之一,用于控制數據包在網絡中的生命周期。以下是針對 TTL 的簡明解析: 1. TTL 的核心作用 防循環機制:TTL 是一個計數器&a…

PySide(PyQT)重新定義contextMenuEvent()實現鼠標右鍵彈出菜單

在 PySide中,contextMenuEvent() 是 QWidget 類(以及繼承自它的所有子類)的一個事件處理方法,主要用于處理上下文菜單事件,也就是當用戶在控件上右鍵點擊時觸發的事件。 ? 通過重新定義contextMenuEvent()來實現自定…

GitHub SSH連接問題解決指南

🔍 GitHub SSH連接問題解決指南 問題描述 遇到錯誤:ssh: connect to host github.com port 22: Connection refused 說明您的網絡環境無法訪問GitHub的SSH端口22,常見原因: 防火墻/網絡運營商限制(國內常見&#xf…

Go紅隊開發—并發編程

文章目錄 并發編程go協程chan通道無緩沖通道有緩沖通道創建?緩沖和緩沖通道 等協程sync.WaitGroup同步Runtime包Gosched()Goexit() 區別 同步變量sync.Mutex互斥鎖atomic原子變量 SelectTicker定時器控制并發數量核心機制 并發編程階段練習重要的細節端口掃描股票監控 并發編程…

RabbitMQ 的介紹與使用

一. 簡介 1> 什么是MQ 消息隊列(Message Queue,簡稱MQ),從字面意思上看,本質是個隊列,FIFO先入先出,只不過隊列中存放的內容是message而已。 其主要用途:不同進程Process/線程T…

常用的AI文本大語言模型匯總

AI文本【大語言模型】 1、文心一言https://yiyan.baidu.com/ 2、海螺問問https://hailuoai.com/ 3、通義千問https://tongyi.aliyun.com/qianwen/ 4、KimiChat https://kimi.moonshot.cn/ 5、ChatGPThttps://chatgpt.com/ 6、魔塔GPT https://www.modelscope.cn/studios/iic…

在自己的數據上復現一下LlamaGen

git倉庫:https://github.com/FoundationVision/LlamaGen 數據集準備 如果用ImageFolder讀取,則最好和ImageNet一致。 data_path/class_1/image_001.jpgimage_002.jpg...class_2/image_003.jpgimage_004.jpg......class_n/image_005.jpgimage_006.jpg.…

Go入門之接口

type Usber interface {start()stop() } type Phone struct {Name string }func (p Phone) start() {fmt.Println(p.Name, "啟動") } func (p Phone) stop() {fmt.Println(p.Name, "關機") } func main() {p : Phone{Name: "華為手機",}var p1 U…

【數據結構進階】哈希表

🌟🌟作者主頁:ephemerals__ 🌟🌟所屬專欄:數據結構 目錄 前言 一、哈希表的概念 二、哈希函數的實現方法 1. 直接定址法 2. 除留余數法 三、哈希沖突 1. 開放定址法(閉散列&#xff0…

《深度學習實戰》第4集:Transformer 架構與自然語言處理(NLP)

《深度學習實戰》第4集:Transformer 架構與自然語言處理(NLP) 在自然語言處理(NLP)領域,Transformer 架構的出現徹底改變了傳統的序列建模方法。它不僅成為現代 NLP 的核心,還推動了諸如 BERT、…

高效管理 React 狀態和交互:我的自定義 Hooks 實踐

高效管理 React 狀態和交互:自定義 Hooks 實踐 在 React 中,Hooks 是一種使我們能夠在函數組件中使用狀態和副作用的強大工具。隨著項目的增大,重復的邏輯可能會出現在多個組件中,這時使用自定義 Hooks 就非常合適。它們幫助我們…