作業系統(經典程序同步問題)之寫者優先
阿新 • • 發佈:2018-12-30
一個數據檔案或記錄可以被多個程序共享使用,我們將讀檔案的程序稱為reader,寫檔案的程序成為writer。允許對個程序同屬進行讀取一個共享物件,因此讀操作不會造成資料資料檔案的混亂,但不允許reader,writer進行同時對共享檔案的訪問,因為這種訪問會造成檔案的資料混亂。所謂讀者-寫者問題。 讀者-寫者問題中,讀者優先問題描述下面這種情況。 在檔案的訪問讀取中,如果有寫程序,寫先進行寫程序的排程,讀程序在所有讀程序完成後進行執行。這就是寫者優先。 解決方法如下: 設定wmutex為各寫者間的互斥時間訪問。 設定Filemutex為檔案互斥事件競爭訪問 wcount為寫程序的數量 rcount為讀程序的數量 mutex1讀程序互斥訪問 mutex2寫程序互斥訪問
Writer:begin
wait(mutex1): //申請檔案的寫程序
wcount = wcount+1; //檔案寫程序+1
if wcount = 1 then wait(Filemutex); //判斷檔案是不是有一個寫程序,如果一個寫程序申請檔案使用權,確保檔案無程序使用,否則寫程序阻塞在這裡
signal(mutex1);
wait(wmutex);//申請寫程序開始寫
寫資料;
singal(wmutex);//釋放寫程序
wait(mutex1);//申請檔案寫程序
wcount = wcount - 1; //寫程序-1
if wcount = 0 then singal(Filemutex);//此時,寫程序為0,申請檔案使用權進行釋放寫程序(因為寫寫程序互斥)
singal(mutex1);
end
reader:begin
wait(mutex1); //讀者先進行申請檔案的寫申請,如果能夠申請到mutex1表明有寫程序正在執行,此時讀程序阻塞
singal(mutex1);//獲取mutex1後釋放,讓寫程序能夠隨時申請到寫程序
wait (mutex2);
rcount = rount + 1;
if rcount = 0 then wait(Filemutex);
singal(mutex2);
wait(mutex2);
讀操作;
singal(mutex2);
wait(mutex2)
rcount = rcount -1;
if rcount = 0 then singal(Filemutex);
singal(mutex2);
end