作業系統之管程

2021-10-10 09:30:30 字數 1560 閱讀 9827

管程的出現是一種程序同步工具。管程的特性保持了程序互斥,無須程式設計師自己實現互斥,從而降低了死鎖發生的可能性。同時管程提供了條件變數,可以讓程式設計師靈活地實現程序同步。

管程有點類似於在物件導向時候學習到的類。

管程有四個部分組成:

①管程的名字

②區域性於管程內部的共享結構資料說明;

③對該資料結構進行操作的一組過程(可以理解為函式)

④對區域性於管程內部的共享資料設定初始值的語句。

可能通過文字來看不是很明白,下面舉個生產者消費者的例子(生產者消費者是經典的程序同步問題,這裡只做簡述,詳細的內容可以移步另一篇文章。一組生產者和一組消費者共享乙個初始為空,大小為n的緩衝區,只有緩衝區沒滿時,生產者才能放東西,否則等待;只有緩衝區不空即有東西時,消費者才能取,否則等待。注:緩衝區是臨界資源):

monitor producerconsumer  

item remove()  

}  由編譯器負責實現各程序互斥地進入管程中的過程。管程中設定條件變數和等待/喚醒操作,以解決程序同步問題。

管程的基本特徵:

①區域性管程的資料只能被區域性於管程的過程所訪問。

②乙個程序只有通過呼叫管程內的過程才能進入管程訪問共享資料。

③每次僅允許乙個程序在管程內執行某個內部過程。

條件變數

當乙個程序進入管程後被阻塞,直到阻塞的原因解除時,在此期間,如果該程序不釋放管程,那麼其他程序無法進入管程。為此,將阻塞原因定義為條件變數(condition)。通常乙個程序阻塞的原因不止乙個,所以要設定很多條件變數。每個條件變數儲存了乙個等待佇列,用於記錄因該條件變數而阻塞的所有程序,對條件變數只有兩種操作,就是wait和signal

比較條件變數和訊號量:

相似點:條件變數的wait/signal操作類似訊號量p/v操作,可以實現程序的阻塞/喚醒。

不同點:條件變數是「沒有值」的,僅實現了「排隊等待」功能,而訊號量是「有值」的,訊號量的值反映了剩餘資源數,而在管程中,剩餘資源數用共享資料結構記錄

最後,總結一下引入管程。

引入管程的目的無非就是要更方便地實現程序互斥和同步

需要在管程中定義共享資料(如生產者消費者中的快取區)

需要在管程中定義用於訪問這些共享資料的「入口」——即函式

只有通過這些特定的「入口」才能訪問共享資料

管程中有很多「入口」,但是每次只能開放其中乙個「入口」,並且只能讓乙個程序或執行緒進入。注意:這種互斥是由編譯器負責實現的,程式設計師不用關心

可在管程中設定條件變數及「等待/喚醒操作」以解決同步問題。可以讓乙個程序或執行緒在條件變數上等待(此時,該程序線釋放管程的使用權,也就是讓出「出口」);可以通過喚醒操作將等待在條件變數上的程序或執行緒喚醒。

作業系統 管程

在前面 程序 中提到,有訊號量與互斥量之後,似乎程序間通訊就很容易了。但事實上並不然,pv操作不慎是很容易導致兩個程序都被阻塞的,這種情況就叫做死鎖 dead lock 為了更容易編寫出正確的程式,1973和1974年hansen與hoare提出了另一種高階同步原語,稱為管程 monitor 但他們...

作業系統原理 管程

將共享變數及操作共享變數的所有方法封裝在乙個模組中。一組區域性變數 共享變數 操作區域性變數的一組方法 區域性變數的初始語句 任何程序只能通過管程提供的入口才能訪問共享資料 任何時刻只允許乙個程序訪問管程的某個方法 對共享變數的互斥操作 管程的特點決定了對共享資源的互斥操作,管程同一時刻只允許乙個程...

作業系統 管程

1.管程 英語 monitors,也稱為監視器 是一種程式結構,結構內的 多個子程式 物件或模組 形成的多個工作執行緒互斥訪問共享資源。這些共享資源一般是硬體裝置或一群變數。管程實現了在乙個時間點,最多只有乙個執行緒在執行管程的某個子程式。與那些通過修改資料結構實現互斥訪問的併發程式設計相比,管程實...