1. 程式人生 > >作業系統中幾個典型的互斥問題的探究

作業系統中幾個典型的互斥問題的探究

這學期開了作業系統課,老師系統的講解了很多東西,尤其是程序間併發的問題。


實現互斥控制的幾種方式

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操作實現了一個簡單的生產者與消費者的例子。其實在生產過程中,我們不可能用一個數字就代表了緩衝區,一般是用訊息列隊來實現。而且當模型較為複雜的時候,會出現多個消費者與多個生產者,我們需要加互斥鎖來實現控制。


對讀者/寫者問題,需要進行互斥操作的就是讀-寫,寫-寫兩組操作,對於讀-讀無限制。其次,是讀優先還是寫優先,也是需要考慮的問題,因為可能會產生飢餓(如讀優先,寫操作可能一直不能進行)。


銀行家就餐問題:待完善