作業系統——讀者-寫者問題的解決方法
阿新 • • 發佈:2021-10-12
參考部落格:https://blog.csdn.net/c1194758555/article/details/52805918
https://www.cnblogs.com/wkfvawl/p/11538431.html
問題描述
不允許Write程序和Read程序或其他Write程序同時訪問檔案,Read程序可以和其他Read程序同時訪問。
分為三種類型。
讀者優先
要求:
1.多個讀者可以同時訪問檔案
2.同一時間只允許一個寫者訪問檔案
3.讀者和寫者程序互斥
解決方法:
用一個readcounter記錄是第幾個讀者在讀,如果是第一個讀者,則不能讓寫者寫,需要一個鎖。因為readcounter是臨界資源,也需要一個互斥量。
semaphore rc_mutex = 1, wmutex = 1; readcounter = 0; void writer{ do{ wait(wmutex); //write signal(wmutex); }while(TRUE); } void reader{ do{ wait(rc_mutex); if(readcounter == 0) wait(wmutex); readcounter ++; signal(rc_mutex); // read wait(rc_mutex); readcounter --; if(!readcounter) signal(wmutex); signal(rc_mutex); }while(TRUE); }
寫者優先
要求:
1.讀者寫者互斥
2.寫者讀者同時等待時,所有等待的寫者優先,等所有寫者結束後,讀者才能讀
3.沒有寫者時,讀者能同時讀
4.寫者到來時,不會終止已經進行的讀者操作
解決方法:
semaphore rc_mutex = 1, wmutex = 1; semaphore wc_mutex = 1, prior = 1; //寫者計數器,優先訊號量 readcounter = 0, writercounter = 0; void writer{ do{ wait(wc_mutex); //申請更改wc的許可權 if(writercounter == 0) //如果是第一個寫者,就申請優先許可權 wait(prior); writercounter ++; signal(wc_mutex); wait(wmutex); //write signal(wmutex); wait(wc_mutex); writercounter --; if(!writercounter) signal(prior); //當最後一個寫者操作完成後,釋放優先順序許可權 signal(wc_mutex); }while(TRUE); } void reader{ do{ wait(prior); //先申請優先順序許可權,如果前面還有寫者就等待 wait(rc_mutex); if(readcounter == 0) wait(wmutex); readcounter ++; signal(rc_mutex); signal(prior); //釋放優先順序許可權 // read wait(rc_mutex); readcounter --; if(!readcounter) signal(wmutex); signal(rc_mutex); }while(TRUE); }
讀寫均等
semaphore rc_mutex = 1, wmutex = 1;
semaphore prior = 1; //讀者和寫者都等待在一個佇列上,實現讀寫均等
readcounter = 0, writercounter = 0;
void writer{
do{
wait(prior);
wait(wmutex);
//write
signal(wmutex);
signal(prior);
}while(TRUE);
}
void reader{
do{
wait(prior);
wait(rc_mutex);
if(readcounter == 0) wait(wmutex);
readcounter ++;
signal(rc_mutex);
signal(prior);
//read
wait(rc_mutex);
readcounter --;
if(!readcounter) signal(wmutex);
signal(rc_mutex);
}while(TRUE);
}
有錯誤請指出!
作者:inss!w! 出處:https://www.cnblogs.com/Hfolsvh/ 版權宣告:本部落格所有文章除特別宣告外,均採用 BY-NC-SA 許可協議。轉載請註明出處!