抽象解釋
2.16.1 讀者寫者問題的三個約束條件
2.16.2 讀者寫者問題vs生產者消費者問題
不能像生/消問題那樣嚴格互斥讀者寫者雖然可以保證資料的正確,卻無法實現同時讀的特點
生產者消費者問題:資料消費後就沒有了;讀者寫者問題:資料可多次讀
生產者消費者問題:消費者彼此互斥;讀者寫者問題:讀者可以同時讀
2.16.3 解決讀者寫者問題的三種方案
策略一 讀者優先
變數設定
偽**
int readcount=
0; semaphore x =
1, wsem=1;
void
reader()
}void
writer()
}
讀者優先的相關思考
ⅰ、ⅱ語句能否互換?
答:不能,readcount的判斷一定要在鎖內,否則會出現讀寫不互斥:假設此時寫者在臨界區,第乙個讀者到來後readcount++,阻塞在p(wsem),第二個讀者到來後直接可以修改count++,導致跨過p(wsem)直接進入臨界區,讀寫不互斥。這時失去的條件是:先有乙個讀者進入臨界區時等其進入後後面的讀者才能修改count。ⅲ、ⅳ語句能否互換?
答:不能,交換後考慮最後乙個程序退出時又到來乙個讀者程序的情況:交換後readcount=0,尚未判斷if時,讀者仍會進入臨界區,判斷後釋放臨界區許可權,寫者也進入臨界區,這時讀寫不互斥。這時失去的條件是:最後乙個讀者退出臨界區時等其退出後才能修改count考慮如下程序序列(設序列中從右到左為程序先後到達順序),下列哪一種情況下可能存在寫者飢餓
1.r r r
2.w w w
3.r w
4.r r w
5.r r w r
6.w w r
7.w r r w
答:5.rrwr時有乙個r先到臨界區,後面的讀者程序在等待時會越過p(wsem)直接進入臨界區,也就是越過了w,造成寫者飢餓
策略二 公平優先
變數設定
偽**
int readcount=
0, semaphore x=l, wrsem=
1, wsem=l;
void
reader()
}void
writer()
}
與讀者優先相比
在讀者優先中,wsem只對第乙個讀者起阻塞作用,後續讀者不受其影響。為了保證按照到達順序處理,故公平優先方式設定wrsem,讀者/寫者按到達順序在wrsem上排隊。
策略三 寫者優先
變數設定
偽**
int readcount =
0, writecount =0;
semaphore x=l, y=
1, wsem=
1, rsem=l;
void
reader()
}void
writer()
}
與公平優先相比
在公平優先中,讀者和寫者都會受到wrsem的限制,而寫者優先中,由於增加了if (writecount ==1) p(rsem)的語句,當寫者到來時會比讀者優先進入臨界區,但wrrrr的情況寫者不會優先
策略四 寫者優先改進
變數設定
偽**
int readcount=
0,writecount=0;
semaphore x=l, y=
1,z=
1,wsem=
1,rsem=l;
void
reader()
}void
writer()
}
寫者優先改進方法的思考
z訊號量起到了什麼作用?
p(z)和p(rsem)能否互換位置?
不能, 否則p(z)失去限制作用
2.16.4 讀者寫者問題示例
示例一情境描述
請用p、v操作來實現東西兩端行人過橋問題分析
偽**
semaphore s =1;
//互斥訊號量
void
east_west()
}void
west_east()
}
示例二
情境描述
請用p、v操作來實現東西兩端行人過橋問題分析
偽**
int counta=
0, countb=
0;semaphore x=
1, mutexa=
1, mutexb=1;
void
east_west()
}void
west_east()
}
示例三
情境描述
請用p、v操作來實現東西兩端行人過橋問題分析
偽**
int counta=
讀者寫者問題 作業系統
動機 共享資料的訪問 兩種型別使用者 讀者 不需要修改資料 寫者 讀取和修改資料 問題的約束 允許同一時間有多個讀者,但在任何時候只有乙個寫者 當沒有寫者是讀者才能訪問資料 當沒有讀者和寫者時,寫者才能訪問資料 在任何時候只有乙個執行緒能操作共享變數 多個併發程序的資料集共享 rcount 有多少個...
作業系統 讀者 寫者問題
讀者間可以同時訪問資源 任一寫者必須與其他寫者或者讀者互斥訪問共享資源 分析 寫者與任一程序互斥訪問共享資源 讀者互斥訪問readcount變數 1申請對檔案的使用權p mutex 2寫檔案 3釋放對檔案的使用權v mutex 設正在讀的讀者個數readcount初 0 1第乙個讀者來 申請對檔案的...
作業系統 讀者寫者問題
乙個資料檔案或記錄可以被多個程序共享。唯讀的程序為 reader程序 其他程序為 writer程序 允許多個物件同時讀乙個共享物件,但是不允許乙個writer程序和其他reader程序同時共享物件。使用記錄性訊號量解決讀者與寫者問題 互斥訊號量wmutex 實現reader與writer程序間在讀或...