作業系統中幾個典型的互斥問題的探究
這學期開了作業系統課,老師系統的講解了很多東西,尤其是程序間併發的問題。
實現互斥控制的幾種方式
1.訊號量:分為互斥訊號量與資源訊號量。以p/v操作實現對資源的控制機制。p操作為reduce,v操作為increase,並且具有通知機制,如一個典型的生產者消費者用訊號量實現
semaphore num = 0;
semaphore mutex = 1;
//生產者 //消費者
while (true) { while (true) {
produce(); P(num);
P(mutex); P(mutex);
填充buffer; 消費buffer;
V(mutex); V(mutex);
V(num); consume();
} }
其中num為資源訊號量,mutex為互斥訊號量。
2.管程。 之前我用過java的synchronized,這個就是一個很好的管程實現多執行緒併發同步的例子。
管程概念:管程實現了在一個時間點,最多隻有一個執行緒在執行管程的某個子程式。與那些通過修改資料結構實現互斥訪問的併發程式設計相比,管程實現很大程度上簡化了程式設計
3.其實還有其他的幾種方式,如共享記憶體,訊息佇列,socket等。上課主要討論的就是那兩種
之前也寫過一些多執行緒的程式,所以對這裡比較感興趣,而且併發時的執行緒安全和控制也是一個難的點。接下來就寫一點對這幾個問題的理解吧。
1.生產者消費者
2.讀者/寫者
3.銀行家就餐問題
上面已經用p/v操作實現了一個簡單的生產者與消費者的例子。其實在生產過程中,我們不可能用一個數字就代表了緩衝區,一般是用訊息列隊來實現。而且當模型較為複雜的時候,會出現多個消費者與多個生產者,我們需要加互斥鎖來實現控制。
對讀者/寫者問題,需要進行互斥操作的就是讀-寫,寫-寫兩組操作,對於讀-讀無限制。其次,是讀優先還是寫優先,也是需要考慮的問題,因為可能會產生飢餓(如讀優先,寫操作可能一直不能進行)。
銀行家就餐問題:待完善