作業系統(9)程序--訊號量、管程、經典同步問題
阿新 • • 發佈:2018-11-13
文章目錄
1. 訊號量
在上節中,提到了併發和同步,其中,多執行緒併發會導致資源競爭,相應的解決辦法就是同步,同步主要就是協調多執行緒對共享資源的訪問,使得任何時刻只有一個執行緒執行臨界區程式碼。
確保同步正確的方法主要有基於底層的硬體實現和高層次的程式設計抽象。而訊號量和管程就屬於高層次的抽象方法。其中,訊號量是和鎖處於同一層次的方法。
1. 訊號量相關概念
-
訊號量引入
下圖中的軟體同步指的是上節中的基於軟體的同步辦法
-
訊號量組成
訊號量是一種抽象資料模型,由一個整型(sem)變數(表示系統資源的數量)和兩個原子操作組成。
P和V執行的原子性是由作業系統保護的,執行不會被打斷,不同於基於軟體的方法(它在操作過程中可能發生中斷,導致變數的改變)。 -
訊號量的特性
-
訊號量的實現
2. 訊號量的使用
- 訊號量分類
- 用訊號量實現臨界區的互斥訪問
- 用訊號量實現條件同步
- 生產者消費者問題
1號箭頭表示當快取區滿時,生產者必須等待消費者。因為沒有空快取區時,eB=n,生產者的p()的條件不滿足,進入等待,等到生產者v()執行了就可以了。注意,此時p(),v()和第一節中的p()和v()不同
2號箭頭表示當快取區為空時,消費者必須等待生產者
- 使用訊號量的困難
2. 管程
管程是為改進訊號量在處理臨界區的一些麻煩,管程試圖把pv操作集中在一起,它也是一種併發程式的程式設計方法。它是與臨界區處於同一層次,同時,在抽象層加入條件變數。
- 管程概念(程式結構)
- 管程組成
- 條件變數
條件變數是管程內部的等待機制,進入管程的執行緒因為資源被佔用而進入等待狀態,每個條件變量表示一種等待原因,對應著一個等待佇列。然後在條件變數上再新增兩個操作。
- 利用管程解決生產者消費者問題
- 管程條件變數的釋放處理方式
在Hansen管程中(當前在管程中執行的執行緒優先順序高),T1進入等待後,放棄管程,T2進入管程,然後T2喚醒了T1,但此時T2並不放棄管程,直到執行完才退出管程。然後T1再開始執行,Hore則相反。
Hansen的while表示:當條件變數釋放之後,也僅是一個提示,仍得重新檢查條件。再次檢查就說明要再次重新排隊,因為另外一個程序在釋放條件變數之後,仍會繼續執行,這個過程可能導致條件變數發生變化。
Hoare的if表示:當另外一個釋放條件變數後,也就放棄了管程訪問,立即轉到當前程序了。也就是說等待條件變數的程序優先順序中更高