雖然訊號量及其p、v操作是一種既方便又有效的程序同步工具,但如果採用這種同步機制來編寫併發程式,對於共享變數及訊號量變數的操作將被分散與各個程序中,有如下缺點:
a.程式易讀性差。因為要了解對於一組共享變數及訊號量的操作是否正確,則必須通讀整個系統或者併發程式。
b.不利於修改和維護。因為程式的區域性性很差,所以任一組變數或一段**的修改都可能影響全域性。
c.正確性難以保證。因為作業系統或併發程式通常很大,要保證這樣乙個複雜的系統沒有邏輯錯誤是很難的。
在解決上述問題的過程中,產生了一種新的程序同步工具-管程。
(1)定義:
把所有程序對某一種臨界資源的同步操作都集中起來,構成乙個所謂的「秘書」程序。凡要訪問該臨界區的程序,都需先報告「秘書」,再由「秘書」來實現各個程序對同一臨界資源的互斥使用。
乙個管程定義了乙個資料結構和在該資料結果上能為併發程序所執行的一組操作,這組操作能同步程序和改變管程中的資料。
管程是由若干公共變數及其說明和所有訪問這些變數的過程所組成的。
管程在結構上由三部分組成:
a.管程所管理的共享資料結構(區域性變數和條件變數),這些資料結構是對相應臨界資源的抽象。
b.建立在該資料機構上的一組操作(函式)。
c.對上述資料結構置初值的語句。
語法如下:
monitor monitor-name; /*管程名字*/
/*以下為區域性變數和條件變數說明
define 本管程內所定義、本管程外可呼叫的過程(函式)名字表
use 本管程外所定義、本管程內將呼叫的過程(函式)名字表*/
void entry p1(...) /*對資料結構進行操作的函式*/
void entry p2(...)
...void entry pn(...)
在上述定義中,管程管理的資料結構僅能由管程內定義的函式所訪問,而不能由管程外的函式訪問。管程中定義的函式又分為兩種型別:一是外部函式(帶有識別符號entry);二是內部函式(不含entry識別符號)。外部函式是程序可以從外部呼叫的函式,而內部函式是只能由管程內的函式呼叫的函式。整個管程的功能相當於「一道牆」,它把共享變數所代表的資源和對它進行操作的若干函式圍了起來,所有程序要訪問臨界資源,都必須經過管程這道「門」才能進入,而管程每次只允許乙個程序進入,即便它們呼叫的是管程中不同的函式。以此自動的實現臨界資源在不同程序間的互斥使用。那些要求進入管程但因互斥原因而暫時不能進入的程序需要排隊等待。由於管程是乙個語言成分,所以管程的互斥訪問完全由編譯程式在編譯時自動新增上,無須程式設計師關心,而且保證正確。
(2)條件變數:
管程通過防止對乙個共享資源的併發訪問,達到實現臨界區的效果,從而實現了程序互斥。實現程序同步需要引入同步機制,是程序在資源不能滿足無法繼續執行的情況下被阻塞,同時還不需要開放管程。管程使用稱為條件變數的同步機制,讓等待的程序臨時放棄管程的控制權,然後在適當的時刻,再嘗試監測管程內狀態的變化。
因為管程是互斥進入的,所以當乙個程序試圖進入乙個已被占用的管程時,它應當在管程的入口處等待,因而在管程的入口處應當有乙個程序等待佇列,稱為入口等待佇列。
條件變數是當呼叫管程過程的程序無法執行時,用於阻塞程序的訊號量。為了區別各種不同等待原因,在管程內設定若干條件變數,侷限於管程,並僅能從管程內進行訪問var c:condition;對於條件型變數c,可以執行wait和signal操作。
wait(c)。當乙個管程過程發現無法繼續時(如發現沒有可用資源),它在某些條件變數上執行wait,這個動作引起呼叫程序阻塞。
signal(c)。指定條件變數上的乙個程序被釋放。
注:wait和signal雖然和p、v原語操作類似,但它們還是有明顯區別的。signal操作是重新啟動乙個被阻塞的程序,但如果沒有程序被阻塞,則操作不產生任何後果,這就與訊號量的v操作不同,因為,v操作總是要執行s.value++操作,因而總會改變訊號量的值。
當乙個進入管程的程序執行wait操作時,它應當釋放管程的互斥權;當使用signal釋放乙個等待程序時(如p喚醒q),可能出現兩個程序同時停留在管程內,怎樣決定哪個程序執行、哪個程序等待,處理方法有兩種:p等待q繼續,直到q退出或等待;q等待p繼續,直到p退出或等待。
(3)基本思想:
通過管程中過程的互斥呼叫解決程序的互斥,通過條件變數上的wait、signal操作解決程序的同步。
正確的管程實現機制必須滿足:當乙個程序進入管程時,它封鎖管程,不允許其他程序再進入;當程序離開管程時,它開放管程,允許其他程序進入;當乙個程序在管程內時因為程序同步的要求而掛起時(wait操作),它必須在掛起之前開放管程,允許其他程序進入;當乙個程序使用了signal釋放另乙個程序時,為避免兩個程序同時在管程之內,它必須確定哪個程序等待,哪個程序執行。
(4)生產者-消費者問題:
注:本例只有兩個程序,乙個生產者程序,乙個消費者程序,不考慮出現多個程序的情況。
建立乙個管程,命名為producer-consumer(簡稱pc管程),其中包含兩個外部函式:
a.put(item)函式。生產者程序利用該函式將自己生產的「產品」放入緩衝區中的乙個緩衝單元內,並用變數count計數在緩衝區中已有的「產品」數量,當count>=n時,表示緩衝區已滿,生產者需等待。
b.get(item)函式。消費者程序利用該過程從緩衝區中的某個緩衝單元取得乙個「產品」,當count<=0時,表示緩衝池已空,無「產品」可供消費,消費者應等待。
pc管程定義如下:
monitor pc;
int in,out,count;
item buffer[n];
condition notfull,notempty;
void entry put(item)
void entry get(item)
有了pc管程的定義之後,生產者-消費者問題的解可描述如下:
cobegin
void producer()
} void consumer()
} coend
程序互斥與同步
1.解釋併發與並行,並說明兩者關係。併發的實質是乙個物理cpu 也可以多個物理cpu 在若干道程式之間多路復用,併發性是對有限物理資源強制行使多使用者共享以提高效率。並行性指兩個或兩個以上事件或活動在同一時刻發生。在多道程式環境下,並行性使多個程式同一時刻可在不同cpu上同時執行。併發與並行是兩個既...
程序互斥與同步
1 併發與並行是兩個既相似而又不相同的概念 併發性,又稱共行性,是指能處理多個同時性活動的能力 並行是指同時發生的兩個併發事件,具有併發的含義,而併發則不一定並行,也亦是說併發事件之間不一定要同一時刻發生。兩者區別 乙個是交替執行,乙個是同時執行.2 程序之間存在同步和互斥兩種關係 同步是因合作程序...
程序互斥與同步
1.解釋併發與並行,並說明兩者關係。並行 是指兩個或者多個事件在同一時刻發生 併發 是指兩個或多個事件在同一時間間隔發生。並行是併發的特例,併發是並行的擴充套件。2.程序間有哪幾種關係?分別要採取什麼策略?程序間有競爭 協作兩種關係 競爭採用的程序互斥的策略 協作採用的程序同步的策略 3.為什麼說程...