2.5管程
2.5管程
訊號量機制的不足:
訊號量的控制分佈在多個程序中
正確性分析困難;
分散的P、V操作:易出錯,使用不當可能導致死鎖。
修改、維護困難:易讀性差,任一修改都可能影響全域性;測試期間發現錯誤困難,即使發現錯誤也不容易定位出錯位置。
管程(monitor)機制
將共享變數及對共享變數能夠進行的所有操作集中在一個模組中(把訊號量及其操作原語“封裝”在一個物件內部)
1.管程的組成
一組區域性變數
對區域性變數操作的一組過程
對區域性變數進行初始化的語句。
(聯想面向物件中的類)
2.管程特點
任何程序只能通過呼叫管程提供的過程入口才能進入管程訪問共享資料,如同使用臨界資源,就要先通過其訊號量的申請
任何時刻,僅允許一個程序在管程中執行某個內部過程
管程實現同步
對共享變數互斥操作:
管程的特點直接實現了該要求,程序一次一個進入管程呼叫內部過程操作共享變數
管程的互斥訪問完全由編譯程式在編譯時自動添上,無須程式設計師關心,能保證正確。
操作的同步控制:
靠條件變數的操作管理實現
進入管程但不能獲取資源操作的過程將阻塞,並在滿足條件時被喚醒執行
3.條件變數(主要作用就是程序同步的阻塞和喚醒控制)
區域性於管程的變數有兩種:普通變數
條件變數(用於控制程序阻塞和喚醒)
類似訊號量變數,但不取具體值;相當於每個阻塞佇列的佇列指標
對條件變數的操作需結合對普通變數的條件判斷,從而控制程序狀態
關於條件變數的操作
x.wait將執行程序掛到x對應的等待佇列
x.signal喚醒x相應的等待佇列上的一個程序
signal操作,是重新啟動一個被阻塞的程序,但如果沒有程序被阻塞,則不產生任何效果,而訊號量機制中的signal操作,若沒有需要喚醒的程序,必須要做的還有修改訊號量變數的值
管程的優點
保證程序互斥地訪問共享變數,並方便地阻塞和喚醒程序,管程可以以函式庫的形式實現。相比之下,管程比訊號量好控制
管程可增強模組的獨立性:系統按資源管理的觀點分解成若干模組,用資料表示抽象系統資源,使同步操作相對集中,從而增加了模組的相對獨立性
引入管程可提高程式碼的可讀性,便於修改和維護,正確性易於保證:採用集中式同步機制,一個作業系統或併發程式由若干個這樣的模組所構成,一個模組通常較短,模組之間關係清晰
管程的缺點
大多數常用的程式語言中沒有實現管程,如果某種語言本身不支援管程,那麼加入管程是很困難的
雖然大多數程式語言也沒有實現訊號量,但可將P、V操作作為一個獨立的子例程或作業系統的管理程式呼叫加入