進程同步工具之 管程機制


進程同步、進程互斥的兩種機制,信號量機制(Semaphores)已總結過了,這里簡單總結下另一種機制:管程(Monitor)。

信號量和管程是等價的,即信號量能實現的用管程也能實現,反之亦然。

但管程封裝了同步操作,對進程隱蔽了同步細節,簡化了同步功能的調用,避免了有意或無意的違法同步操作,給編程帶來便利。

 

引入背景

信號量機制是一種方便有效的進程同步工具。但每次訪問臨界資源時都需要進程自身進行wait(S)和signal(S)操作。這樣,大量的同步操作分散在不同進程中,會給系統管理帶來負擔,另一方面同步操作使用不當容易導致死鎖。

 

定義

代表共享資源的數據結構(變量),以及由對該共享數據結構實施操作的一組過程所組成的資源管理程序。管程被請求和釋放資源的進程所調用。

 

組成

1.管程的名稱

2.局部於管程內部的共享數據結構(變量)說明

3.對該數據結構進行操作的一組過程;

4. 對局部於管程內部的共享數據設置初始值的語句

 

特點

互斥性:多個進程對管程的訪問是互斥的。任一時刻,管程中只能有一個活躍進程。

共享性:管程可被其他進程互斥訪問,屬於共享資源

安全性:管程的局部變量只能由管程的過程訪問,不允許進程或其它管程直接訪問,管程也不能訪問非局部於它的變量。

封裝性:管程內的數據結構是私有的,只能在管程內使用,管程內的過程也只能使用管程內的數據結構。進程通過調用管程的過程使用臨界資源。管程在Java中已實現。synchronized 關鍵字及 wait()、notify()、notifyAll() 這三個方法都是管程的組成部分。

 

條件變量

考慮情況:當進程調用管程,在管程過程中被阻塞或掛起,若一直不釋放管程,則其他進程無法進入,被迫長時間等待。

所以,引入了條件變量(condition)。一個進程被阻塞或掛起的條件(原因)可能多個,因此管程中設置多個條件變量,這些條件變量也只能在管程中訪問

管程中對每個條件變量都須予以說明,其形式為:Var x,y:condition。對條件變量的操作僅僅是 wait 和 signal,因此條件變量也是一種抽象數據類型,每個條件變量保存了一個鏈表,用於記錄因該條件變量而阻塞的所有進程,同時提供的兩個操作即可表示為 x.wait和 x.signal。

當進程因x條件被阻塞或掛起,條用x.wait插入x等待隊列,釋放管程。當x條件發生變化,條用x.signal喚醒被阻塞或掛起的進程。

       管程的結構示意圖(參考計算機操作系統)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM