操作系統設計與實現 第二章 進程(五)

2.2.7 管程

管程是由過程、變量及數據結構等組成的集合,它們組成一個特殊的模塊或軟件包。

進程可在任何需要時調用管程中的過程,但它們不能在管程外的過程中直接訪問管程中的數據結構。

管程有一個很重要的特性,這使得它們能有效地完成互斥:任意時刻管程中只能有一個活躍進程。典型地,當一個進程調用管程中的過程時,前幾條指令將檢查在管程中是否有其他的活躍進程。如果有,調用進程將其掛起,直到另一個進程離開管程。如果沒有,則調用進程以便進入管程。

對進入管程實現互斥由編譯器負責,但通常的做法是用一個互斥或二進制信號量。因爲是由編譯器而非程序員來安排互斥,出錯的可能性要小得多。

這裏還需要一種辦法使得進程在無法繼續運行時被阻塞。解決辦法在於引入條件變量以及相關的兩個操作:wait和signal。當一個管程過程發現它無法繼續時,它在某些條件變量上執行wait,如full。這個動作引起調用進程阻塞。它允許另一個先前被擋在管程外邊的進程現在進入管程。

發佈了49 篇原創文章 · 獲贊 96 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章