最近開始看操作系統的書(本身不是這個方向的),單看書本管程還是不能完全理解,現在簡單總結一下吧。 1.管程 (英語:Monitors,也稱為監視器) 是一種程式結構,結構內的多個子程式(對象或模塊)形成的多個工作線程互斥訪問共用資源。這些共用資源一般是硬體設備或一群變數。管程實現了在一個時間點,最多 ...
最近開始看操作系統的書(本身不是這個方向的),單看書本管程還是不能完全理解,現在簡單總結一下吧。
1.管程 (英語:Monitors,也稱為監視器) 是一種程式結構,結構內的多個子程式(對象或模塊)形成的多個工作線程互斥訪問共用資源。這些共用資源一般是硬體設備或一群變數。管程實現了在一個時間點,最多只有一個線程在執行管程的某個子程式。與那些通過修改數據結構實現互斥訪問的併發程式設計相比,管程實現很大程度上簡化了程式設計系統中的各種硬體資源和軟體資源,均可用數據結構抽象地描述其資源特性,即用少量信息和對資源所執行的操作來表徵該資源,而忽略了它們的內部結構和實現細節。利用共用數據結構抽象地表示系統中的共用資源,而把對該共用數據結構實施的操作定義為一組過程。
像一個中介站,程式利用共用資源要通過這個的子程式(操作具體共用資源的一個過程,已經將具體硬體軟體資源抽象成一種數據結構,對這個過程進行操作相當於使用資源),最多一個線程執行保證互斥。
2.管程的條件變數:條件變數是在管程內部的數據結構,且只有在管程內才能被訪問,它對管程內所有過程是全局的,只能通過wait(),signal()兩個操作訪問。
wait():掛起調用進程並釋放管程,直至另一進程在條件變數上執行signal()。 signal():如果有其他進程因對條件變數執行wait()而被掛起,便釋放之,如果沒有進程等待,則信號被忽略,不保存。 wait和signal是利用資源的內部語句,條件變數相當於要用的資源,如果已經被別的調用,就wait改變數,用好了別的資源會signal,然後這個程式再利用 3.管程有一個很重要的特性,即任一時刻管程中只能有一個活躍進程,這一特性使管程能有效地完成互斥。管程是編程語言的組成部分,編譯器知道它們的特殊性,因此可以採用與其他過程調用不同的方法來處理對管程的調用。典型的處理方法是,當一個進程調用管程過程時,該過程中的前幾條指令將檢查在管程中是否有其他的活躍進程。如果有,調用進程將被掛起,直到另一個進程離開管程將其喚醒。如果沒有活躍進程在使用管程,則該調用進程可以進入。 4. 從語言的角度看,管程主要有以下特性:(1)模塊化。管程是一個基本程式單位,可以單獨編譯;
(2)抽象數據類型。管程是中不僅有數據,而且有對數據的操作;
(3)信息掩蔽。管程外可以調用管程內部定義的一些函數,但函數的具體實現外部不可見; 5.簡單點說就是只能被單個線程執行的代碼了,舉個例子假如一個管程類叫atm(取款機),裡面有兩個方法叫提款 取款,不同的人為不同的線程,但是atm只允許一個人在一個時間段中進行操作,也就是單線程,那麼這個atm就需要一個鎖,單一個人在使用時,其他的人只能wait。再者一個人如果使用的時間太長也不行,所以需要一個條件變數來約束他。條件變數可以讓一個線程等待時讓另一線程進入管程,這樣可以有效防止死鎖 6.因為調用wait原語後,使進程等待的原因有多種,為了區別它們,引入了條件變數,就是為了排不同wait的隊列(等待原因不同)