1973年,Hoare和Hanson提出管程思想:將共享變量及對共享變量能夠進行的所有操作集中在一個模塊中。
一、管程的組成:
-
一組局部變量
-
對局部變量操作的一組過程
-
對局部變量進行初始化的語句。
二、管程的特點:
- 任何進程只能通過調用管程提供的過程入口才能進入管程訪問共享數據;
就如同使用臨界資源,就要先通過其信號量的申請。 - 任何時刻,僅允許一個進程在管程中執行某個內部過程。
管程如何實現同步?
-
對共享變量互斥操作:管程的特點直接實現了該要求,進程一次一個進入管程調用內部過程操作共享變量。
管程的互斥訪問完全由編譯程序在編譯時自動添上,無須程序員關心,能保證正確。 -
操作的同步控制:靠條件變量的操作管理實現。進入管程但不能獲取資源操作的過程將阻塞,並在滿足條件時被喚醒執行。
生產者-消費者問題的管程解決方法:
生產者:
producer:
begin
repeat
生產an item in nextp;
p_c.put(nextp);
until
end
消費者:
consumer:
begin
repeat
p_c.get(nextc);
消費an item in nextc;
until
end
管程的優點
- 保證進程互斥地訪問共享變量,並方便地阻塞和喚醒進程。管程可以以函數庫的形式實現。相比之下,管程比信號量好控制。
- 管程可增強模塊的獨立性:系統按資源管理的觀點分解成若干模塊,用數據表示抽象系統資源,使同步操作相對集中,從而增加了模塊的相對獨立性
- 引入管程可提高代碼的可讀性,便於修改和維護,正確性易於保證:採用集中式同步機制。一個操作系統或併發程序由若干個這樣的模塊所構成,一個模塊通常較短,模塊之間關係清晰。
管程的缺點
大多數常用的編程語言中沒有實現管程,如果某種語言本身不支持管程,那麼加入管程是很困難的。
雖然大多數編程語言也沒有實現信號量,但可將P、V操作作爲一個獨立的子例程或操作系統的管理程序調用加入。
三、條件變量
主要作用就是進程同步的阻塞和喚醒控制
局部於管程的變量有兩種:
- 普通變量
- 條件變量(用於控制進程阻塞和喚醒)
類似信號量變量,但不取具體值;相當於每個阻塞隊列的隊列指針。
對條件變量的操作需結合對普通變量的條件判斷,從而控制進程狀態。
關於條件變量的操作
- x.wait將執行進程掛到x對應的等待隊列上
- x.signal喚醒x相應的等待隊列上的一個進程
signal操作,是重新啓動一個被阻塞的進程,但如果沒有進程被阻塞,則不產生任何效果
而信號量機制中的signal操作,若沒有需要喚醒的進程,必須要做的還有修改信號量變量的值。