天天看點

作業系統_讀者寫者問題讀者寫者問題

目錄

讀者寫者問題

問題的提出

程序資源共享關系和同步關系分析

解決方案

第一搏

存在的問題?

沒問題了嗎?

(初次學習,若存在問題,還望評論區多多指正)

讀者寫者問題

問題的提出

  • 多個讀者、多個寫者共享資源(例如檔案、資料等);
  • 允許多個讀者同時通路資源;
  • 寫者寫時不允許其他程序讀或寫(互斥通路資源);
  • 請用記錄型信号量進行同步
作業系統_讀者寫者問題讀者寫者問題

程序資源共享關系和同步關系分析

思考:

  • 幾個程序?:讀者程序,寫者程序;
  • 怎樣共享資源?:可以有多個讀者程序讀取檔案,寫者程序與其他寫者/讀者程序互斥;
作業系統_讀者寫者問題讀者寫者問題

解決方案

第一搏

先考慮寫者程序與其他程序互斥的問題(類似于前面的生産者-消費者問題,是以柿子先挑軟的捏,哈哈哈);

可以很直覺的想到使用Wmutex(寫互斥信号量),将讀者/寫者程序中的讀/寫操作包圍起來,形成臨界區,這樣當有一個寫者程序時,其他讀者/寫者程序均會被阻塞;

作業系統_讀者寫者問題讀者寫者問題

存在的問題?

确實可以實作寫者程序與其他程序互斥 的功能!

但是題目還有一個要求:可以同時存在多個讀者程序。

按照上面的格式,Wmutex為1,即隻能有一個讀者或寫者程序。

……

那麼現在需要解決的問題是:如果有讀者程序了,如何允許其他的讀者程序并發,而拒絕寫者程序并發。

可以想到用一個變量readcount來标記讀者的程序數目。有了readcount就可以了解到此時是否有讀者程序正在執行,當readcount=0時,允許讀者/寫者程序執行,readcount≠0時,隻允許讀者程序并發。

配合第一搏中的Wmutex,就可以實作多讀者程序并發,讀者/寫者程序互斥;

作業系統_讀者寫者問題讀者寫者問題

沒問題了嗎?

設想,當第一個讀者程序執行完wait(wmutex)後,時間片用盡,發生了程序切換,另一個讀者程序進入,此時由于上一個讀者程序未将readcount+1,是以此時readcount仍等于0,但Wmutex已經變為0,因而被阻塞,造成了“另一個寫者程序正在執行”的錯覺,違背了空閑讓進原則。

類似,若最後一個讀者程序執行完readcount=readcount-1時,進入了一個讀者程序,此時readcount=0,該讀者程序被阻塞,同樣違背了空閑讓進原則。

……

究其原因就是,readcount也為臨界資源。

是以多個讀者程序對它的通路,也需要設計互斥信号量。

于是考慮使用Rmutex互斥信号量,來保證對readcount的通路是互斥的。

作業系統_讀者寫者問題讀者寫者問題

以上便是讀者-寫者問題的标準解決方案!

繼續閱讀