管程

管程

管程 (英語:Moniters,也稱為監視器) 是一種程序結構,結構內的多個子程序(對象或模塊)形成的多個工作線程互斥訪問共享資源。這些共享資源一般是硬體設備或一群變數。管程實現了在一個時間點,最多只有一個線程在執行管程的某個子程序。與那些通過修改數據結構實現互斥訪問的併發程序設計相比,管程實現很大程度上簡化了程序設計系統中的各種硬體資源和軟體資源。

簡介


系統中的各種硬體資源和軟體資源,均可用數據結構抽象地描述其資源特性,即用少量信息和對資源所執行的操作來表徵該資源,而忽略了它們的內部結構和實現細節。
利用共享數據結構抽象地表示系統中的共享資源,而把對該共享數據結構實施的操作定義為一組過程。
代表共享資源的數據結構,以及由對該共享數據結構實施操作的一組過程所組成的資源管理程序,共同構成了一個操作系統的資源管理模塊,我們稱之為管程。
Hansan為管程所下的定義:“一個管程定義了一個數據結構和能為併發進程所執行(在該數據結構上)的一組操作,這組操作能同步進程和改變管程中的數據”。

組成


有上述定義可知,管程由四部分組成:
1.管程的名稱;
2.局部於管程內部的共享數據結構說明;
3.對該數據結構進行操作的一組過程;
4.對局部於管程內部的共享數據設置初始值的語句。
局部於管程的數據結構,只能被局部於管程的過程所訪問,任何管程之外的過程都不能訪問它;反之,局部於管程的過程也只能訪問管程內的數據結構。由此可見,管程相當於圍牆,它把共享變數和對它進行操作的若干個過程圍了起來,所有進程要訪問臨界資源時,都必須經過管程才能進入,而管程每次只允許一個進程進入管程,從而實現了進程的互斥。
管程的條件變數:條件變數是在管程內部的數據結構,且只有在管程內才能被訪問,它對管程內所有過程是全局的,只能通過wait(),signal()兩個操作訪問。
wait():掛起調用進程並釋放管程,直至另一進程在條件變數上執行signal()。
signal():如果有其他進程因對條件變數執行wait()而被掛起,便釋放之,如果沒有進程等待,則信號被忽略,不保存。