同步機制 讀者寫者問題

2021-09-25 22:29:47 字數 3150 閱讀 4597

【實驗目的】

理解臨界區和程序互斥的概念,掌握用訊號量和pv操作實現程序互斥的方法。

【實驗內容】

在windows或者linux環境下編寫乙個控制台應用程式,該程式執行時能建立n個執行緒,其中既有讀者執行緒又有寫者執行緒,它們按照事先設計好的測試資料進行讀寫操作。請用訊號量和pv操作實現讀者/寫者問題。

讀者/寫者問題的描述如下:

有乙個被許多程序共享的資料區,這個資料區可以是乙個檔案,或者主存的一塊空間,甚至可以是一組處理器暫存器。有一些只讀取這個資料區的程序(reader)和一些只往資料區中寫資料的程序(writer)。以下假設共享資料區是檔案。這些讀者和寫者對資料區的操作必須滿足以下條件:讀—讀允許;讀—寫互斥;寫—寫互斥。這些條件具體來說就是:

(1)任意多的讀程序可以同時讀這個檔案;

(2)一次只允許乙個寫程序往檔案中寫;

(3)如果乙個寫程序正在往檔案中寫,禁止任何讀程序或寫程序訪問檔案;

(4)寫程序執行寫操作前,應讓已有的寫者或讀者全部退出。這說明當有讀者在讀檔案時不允許寫者寫檔案。

對於讀者-寫者問題,有三種解決方法:

1、讀者優先

除了上述四個規則外,還增加讀者優先的規定,當有讀者在讀檔案時,對隨後到達的讀者和寫者,要首先滿足讀者,阻塞寫者。這說明只要有乙個讀者活躍,那麼隨後而來的讀者都將被允許訪問檔案,從而導致寫者長時間等待,甚至有可能出現寫者被餓死的情況。

2、寫者優先

除了上述四個規則外,還增加寫者優先的規定,即當有讀者和寫者同時等待時,首先滿足寫者。當乙個寫者宣告想寫檔案時,不允許新的讀者再訪問檔案。

3、無優先

除了上述四個規則外,不再規定讀寫的優先權,誰先等待誰就先使用檔案。

【實驗原理】

【程式**】

#include #include #include #include #include #include #define max_thread 10           //待測試的執行緒數

typedef structtest_info;

test_info test_data[max_thread]=, // r表示讀者執行緒

, //w表示寫者執行緒

, ,, ,

, , ,

};int read_count=0; //記錄正在讀檔案的讀者數

int write_count=0; //在寫者優先演算法中記錄宣告要寫檔案的寫者數

critical_section cs_data; //用於保護檔案的臨界區變數

handle h_mutex_read_count=createmutex(null,false,"mutex_read_count");

//讀者計數器互斥體

handle h_mutex_write_count=createmutex(null,false,"mutex_write_count");

//寫者計數器互斥體

handle h_mutex_reader_wait=createmutex(null,false,"mutex_reader_wait");

//在寫者優先演算法中用於阻塞讀者的互斥體

handle h_mutex_first_reader_wait=

createmutex(null,false,"mutex_first_reader_wait");

//在寫者優先演算法中用於阻塞第乙個讀者的互斥體

handle h_mutex_wait=createmutex(null,false,"mutex_wait");

//無優先時用於阻塞讀者和寫者的互斥體

//讀者優先時的讀者執行緒

void rf_reader_thread(void *data)

//讀者優先時的寫者執行緒

void rf_writer_thread(void *data)

//讀者優先時的初始化程式

void reader_first()

//無優先時的寫者執行緒

void fifo_writer_thread(void *data)

//無優先時的初始化程式

void first_come_first_served()

//寫者優先時的寫者執行緒

void wf_writer_thread(void *data)

//寫者優先時的初始化程式

void writer_first(){

int i=0;

handle h_thread[max_thread];

printf("寫優先申請次序:");

for(i=0;i【實驗結果】

圖1 初始介面   

圖2 讀優先

圖3 無優先

圖4 寫優先

【實驗心得】

通過本次實驗,我對作業系統的同步機制---讀者寫者問題有了更加深刻的認識,實驗中也學到了很多知識,受益匪淺。讀者寫者問題在計算機領域非常普遍,資料庫的讀寫分離就是為了減少因為讀者寫者問題加鎖帶來的對併發的影響。

讀者寫者問題的解決方案一般都有兩種不同的側重:讀者優先或者寫者優先。簡單來說,讀者優化就是盡量滿足併發的讀操作,當已經有執行緒在讀資料的時候,其他讀執行緒無需等待,而寫執行緒需要等待所有正在進行的讀操作之後才能執行。寫者優先就是盡量滿足寫操作,儘管寫操作不能併發,但是可以排隊,優先於等待的讀執行緒獲得執行權。

經典同步問題 讀者 寫者問題

在讀者 寫者問題中,只對共享資料進行讀取的程序為讀者程序,修改共享資料的程序稱為寫者程序。多個讀者可同時讀取共享資料而不會導致出現錯誤,但是任何時刻多個寫者程序不能同時修改資料,寫者程序和讀者程序也不能同時訪問共享資料。讀者 寫者問題的解決策略有不同的傾向。需要用到的共享變數 semaphore r...

讀者寫者之模型 同步問題

今天介紹讀者寫者模型 讀多寫少的場景 場景描述 寫者負責再資源池中寫 讀者負責從資源池中讀資料 同一時間內不允許多個寫者進行寫,但允許多個讀者進行讀 當寫者和讀者都準備占用資源池時,寫者優先占用資源池 此問題描述的時寫者優先順序高的場景 建立模型 乙個交易場所 資源池 此處用乙個變數供讀者和寫者進行...

經典同步問題 讀者和寫者問題

讀者 寫者問題 讀者 寫者問題是互斥問題的乙個概括。一組併發的執行緒要訪問乙個共享的物件,例如乙個主存中的資料結構,或者是磁碟上的資料庫。有些執行緒唯讀物件,其他執行緒只修改物件。唯讀物件的執行緒叫做讀者,修改物件的線 程的物件叫做寫者。寫者必須擁有對物件的獨佔的訪問,而讀者可以和其他讀者共享物件。...