二、讀者與寫者問題
三、哲學家進餐過程
設定3個訊號量:mutex=1,full=0,empty=n(假設緩衝池大小為n)
p(empty)
p(mutex)
寫入資料
v(mutex)
v(full)
p(full)
p(mutex)
讀取資料
v(mutex)
v(empty)
乙個資料物件(如檔案、記錄)可以被多個程序共享。這些程序可以分為兩類:
這類問題具有以下特點:
讀者程序之間不互斥
寫者與寫者、寫者與讀者之間互斥
設定3個訊號量:mutex,readercount,writer
p(mutex)
//臨界區沒有讀者時,先判斷當前臨界區是否有寫者程序
//由第乙個進入臨界區的讀者程序來阻塞後來的寫者程序
if(readercount == 0)
p(writer);
//當此時臨界區已經存在讀者程序時,countreader++
++readercount;
v(mutex)
讀資料p(mutex)
--readercount;
//由最後乙個離開臨界區的讀者程序喚醒可能被阻塞的寫者程序
if(readercount == 0)
v(writer);
v(mutex)
p(writer)
寫資料v(writer)
五個哲學家,他們的生活方式是交替地進行思考和進餐。哲學家們共用一張圓桌,分別坐在周圍的五張椅子上,在圓桌上有五個碗和五支筷子。
對於上述問題,很容易想到這樣一種方法:設定乙個互斥訊號量陣列,第i個哲學家進餐時,分別p(mutex[i-1])和p(mutex[i])。
while(1)
但是上述方法很容易引起死鎖。為了解決死鎖問題,可以考慮以下方法: 經典程序同步與互斥問題
1.1 簡單的 生產者 消費者 問題 設程序a b是兩個相互合作的程序,它們共享乙個緩衝區,程序a向其中寫入資料,程序b從中讀出資料。producer 生產者程序,consumer 消費者程序。當緩衝區不空時,消費者便可以讀資料 當緩衝區為空時,生產者便可以寫資料。設定訊號量 full 表示有資料緩...
程序同步與互斥
程序同步與互斥 首先,我們看乙個例子 程序p1 p2公用乙個變數count,初始值為0 p1 p2兩個程序的執行順序是隨機的,p1 p2可能順序執行或交錯執行。由圖可見,不同的執行順序,count值會不同,這是不允許的。在多道程式系統中,由於資源共享或程序合作,使程序間形成間接相互制約和直接相互制約...
程序同步與互斥
為什麼要引入程序同步的概念?多道程式環境下的程序併發執行,它們相互之間存在著不同的制約關係,為了理解和協調這種制約的關係,引入了程序同步的概念。臨界資源是一次只能為乙個程序使用的資源。由於臨界資源的特性,就決定了 對它的訪問必須是互斥的。在每個程序中,訪問臨界資源的那段 稱為臨界區。為了保證臨界資源...