1.設有一台計算機,有兩條i/o通道,分別接一台卡片輸入機和一台印表機。卡片機把一疊卡片逐一輸入到緩衝區b1中,加工處理後再搬到緩衝區b2中,並在印表機上列印。
【解】(0)分析題意,畫出草圖:
(1)設定三個程序:
i程序:負責把卡片上的資訊輸入緩衝區b1
p程序:負責從緩衝區b1中取到資訊並加工處理,送到緩衝區b2
c程序:負責從緩衝區b2中取到資訊,在印表機上列印
(2)假設b1緩衝區大小是m個單元,b2緩衝區大小是n個單元。
(3)設定四個訊號量:
b1full:b1緩衝區已經使用的單元數,初始化為0
b1empty:b1緩衝區未使用的單元數,初始化為m
b2full:b2緩衝區已經使用的單元數,初始化為0
b2empty:b2緩衝區未使用的單元數,初始化為n
(4)根據題設書寫演算法:
i程序:
repeat
p(b1empty)
把卡片資訊寫入緩衝區b1
v(b1full)
util false
p程序:
repeat
p(b1full)
p(b2empty)
從b1中取資訊
加工處理
送到b2
v(b1empty)
v(b2full)
until false
c程序:
repeat
p(b2full)
從b2取資訊
列印 v(b2empty)
util false
2.生產者-消費者問題(緩衝區大小是1)
b程序:消費者從緩衝區取產品,消費掉
設定訊號量full和empty,full表示緩衝區已經使用的空間,初始化為0,empty表示緩衝區尚未使用的空間,初始化為1
a程序:
repeat
生產產品
p(empty)
放入緩衝區
v(full)
util false
b程序:
repeat
p(full)
從緩衝區取產品
v(empty)
消費掉產品
false
3.生產者-消費者問題(緩衝區大小是k)
a程序:生產程序
b程序:消費程序
設定訊號量full和empty,full表示緩衝區已經使用的空間,初始化為0,empty表示緩衝區尚未使用的空間,初始化為k。設定訊號量mutex,初始值為1,用來互斥。
a程序:
i = 0;
repeat
生產產品
p(empty)
p(mutex)
往緩衝區的i位置放入產品
i = (i+1)%k;
v(mutex)
v(full)
false
b程序:
j = 0;
repeat
p(full)
p(mutex)
從緩衝區的j位置取產品
j = (j+1)%k;
v(mutex)
v(empty)
消費掉產品
false
筆者認為,既然i和j都初始化為0,兩個程序對環形緩衝池這一資源不需要做互斥。上述的互斥**可用去掉。
4.讀者-寫者問題
多個程序可用同時讀檔案,任意乙個程序在寫檔案的時候其他程序就不得對檔案進行寫或讀操作,有程序在讀檔案的時候不允許別的程序寫檔案。
設定兩個程序a(讀程序)和b(寫程序)。
設定訊號量mutex對臨界區資源做互斥,初始值為1。
設定訊號量readercount表示讀者數量,初始值是0。
設定訊號量write表示可用做寫操作的能力,初始值為1。
a:
repeat
p(mutex)
readercount++;
if(readercount == 1)
v(mutex)
讀檔案p(mutex)
readercount--;
if(readercount == 0)
v(mutex)
util false
b:
repeat
p(write)
寫檔案v(write)
util false
5.哲學家就餐問題
說的是乙個桌子周圍坐5個哲學家,每個哲學家左右都只有乙個叉子,每個哲學家要想吃飯,就必須同時拿起兩個叉子,怎麼5個哲學家同時拿起一側的叉子而發現另一側沒有叉子的尷尬局面(死鎖)?
筆者參考了《作業系統–精髓與設計原理》(美)william stallings著的解決方案,書中說的真有趣,一種方案是教會哲學家用乙個叉子吃飯就ok了!!哈哈哈哈,另一種方案就是增加乙個服務生,每次只允許4個哲學家同時就坐,下面就是這個演算法啦:
規定:哲學家編號依次是0,1,2,3,4,第i個哲學家左側叉子編號是i,右側叉子編號是(i+1)%5
int fork = new int;//5個叉子都能用,初始化為1
void philosopher(int i)
}void main()
PV操作 經典問題分析
為了提高在實際問題中分析和思考多個執行緒之間同步互斥問題的能力,接下來將講解 pv操作,這也是作業系統中的重點和難點。本文將會先簡要介紹下 pv操作的 和基本使用方法,然後再通過兩道經典的計算機考研真題 放水果和安全島來示範如何運用 pv操作。先講講pv操作的起源和用法。1962年,荷蘭學者dijk...
PV操作 經典問題分析
為了提高在實際問題中分析和思考多個執行緒之間同步互斥問題的能力,接下來將講解 pv操作,這也是作業系統中的重點和難點。本文將會先簡要介紹下 pv操作的 和基本使用方法,然後再通過兩道經典的計算機考研真題 放水果和安全島來示範如何運用 pv操作。先講講pv操作的起源和用法。1962年,荷蘭學者dijk...
PV操作經典例題 哲學家進餐問題
哲學家進餐問題 五個哲學家共用一張圓桌,分別坐在周圍的五張椅子上,在桌子上有五隻碗和五隻筷子,他們的生活方式是交替地進行思考和進餐。平時,乙個哲學家進行思考,飢餓時便試圖取用其左右最靠近他的筷子,只有在他拿到兩隻筷子時才能進餐。進餐畢,放下筷子繼續思考。分析 放在桌子上的筷子是臨界資源,在一段時間內...