1. 程式人生 > >管程機制處理程序同步問題

管程機制處理程序同步問題

程序同步機制有很多,主要有PV操作和訊號量,管程,以及訊息傳遞等。

由於PV操作的使用分散在各個程序之中,不利於對臨界資源的統一管理,還有PV操作的使用需要小心,若順序不對,或忘一個沒寫,很容易陷入死鎖,所以,管程就能解決上面問題。

管程的基本思路是:將分散在各個程序中的臨界區集中起來進行統一控制和管理,並且將系統中的共享資源用資料結構抽象的描述出來,然後對臨界區的訪問通過管程進行統一管理

管程:就是由若干個資料結構、變數,以及方法(函式)所組織成的一種特殊的結構。

管程有以下特性:

①互斥性,任何時刻只能最多一個程序進入管程活動,其他想進入管程必須等待。

②安全性,管程中的區域性變數只能由管程的方法或函式來訪問,其他程序或管程是不能夠對該區域性變數進行直接訪問

③共享性,管程中的特定的方法或函式可以被其他管程或程序訪問,這樣的方法或函式應該有特殊說明。

管程的一般結構:

struct Minitor{

    管程內部的變數說明;

    condition  條件變數列表;

    define    函式或方法;

    use    函式或方法;    外部函式,直接使用

    void  函式名(){}

    。。。

    void  函式名(){}

    void init(){ 對管程中的區域性變數進行初始化;

    }

};

在管程有一類特殊的變數稱為條件變數,即condition變數。由於管程的訪問具有互斥性,所以要引入條件變數,條件變數是管程的一種特殊的資料結構,在條件變數有兩個相關操作wait()和signal()。他們都是原語,不可被打斷

執行wait()原語的程序被阻塞,同時開放管程,將當前程序排在某條件變數的等待佇列中,執行signal()原語,喚醒在對應條件變數的上的程序。

漢森方法實現管程:

wait()原語:即等待原語,當一個程序由於自身原因進行不下去了,就執行該原語,從而開放管程,自己進入阻塞態。

signal()原語:喚醒在相應條件變數上的等待程序佇列的一個程序,執行signal()的程序要立即離開管程。

check()原語:檢查管程是否可用,若可用,則進入,不可用,則進入等待呼叫狀態。

release()原語:檢查是否有等待呼叫的程序,若有,則喚醒該程序,無,則開放管程。