1. 程式人生 > >作業系統(經典程序同步問題)之寫者優先

作業系統(經典程序同步問題)之寫者優先

  一個數據檔案或記錄可以被多個程序共享使用,我們將讀檔案的程序稱為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