最近開始看操做系統的書(自己不是這個方向的),單看書本管程仍是不能徹底理解,如今簡單總結一下吧。編程
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的隊列(等待緣由不一樣)