操作系统之进程管理:14、读者-写者问题
14、讀者-寫者問題
- 問題描述
- 解題思路
- 注意
問題描述
解題思路
分析:
無論是寫寫還是讀寫互斥都是對文件的互斥訪問,需要一個互斥信號量rw,在讀和寫的前后加入互斥訪問
問題1:但是這樣的話無法實現多個讀者訪問文件的操作;當reader1讀時,rw=0;在reader1讀的過程中切換到reader2讀時,因為rw=0而阻塞。
解決1:用一個計數變量count=0來對讀者進程計數,當第一個讀者進程開始時加鎖,最后一個讀者進程結束時解鎖
問題2:當倆個讀者進程并發執行時,r1判斷完count=0后切換到r2,此時r2認為count=0,加鎖;在切換回r1繼續執行加鎖,這樣r1進程就會被阻塞
解決2:產生該問題的原因是由于原因在于對count 變量的檢查和賦值無法一氣呵成;為了實現一氣呵成的操作,需要設置一個互斥的信號量mutex=1來互斥的訪問count變量
問題3:當一直有讀者進程到來時,寫進程就會“餓死”
解決3:在設置一個互斥的信號量w=1用于實現“讀寫公平”(或者說“寫優先”’)
分析:
1、讀者1–>讀者2:r1讀執行p(w)后r2阻塞;當r1執行完V(w),后r1讀,r2喚醒;倆個進程并發讀
2、寫者1–>寫者2:w1寫,w=0,w2在P(w)阻塞
3、寫者1–>讀者1:w1執行,w=0;讀者阻塞在P(w)
4、讀者1–>寫者1–>讀者2:r1讀,rw=0,w=1;w1寫,w=0,p(rw)阻塞;r2讀,P(w)阻塞;當r1結束后,w1喚醒;但r2依舊阻塞;這樣就實現了寫進程到來后,讀完立即執行寫進程。
5、寫者1–>讀者1–>寫者2:w1寫,w=0;r1讀,在p(w)阻塞;w2寫,p(w)阻塞;w1寫,由于讀1先入隊,所以執行r1讀,w2依舊阻塞;因此,其實他應該叫做“讀寫公平”比“寫優先”更合適。
注意
總結
以上是生活随笔為你收集整理的操作系统之进程管理:14、读者-写者问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL2012数据库加密方法
- 下一篇: 学习opengl(起步)