計算機作業系統 訊號量經典問題

2021-10-12 08:43:36 字數 1854 閱讀 4288

不能生產者在生產的時候 消費者進行消費 反之也不行

如果倉庫堆滿了 生產者不能再進行生產

如果倉庫空了 消費者不能再進行消費

semaphore mutex=1;

//實現互斥

semaphore empty=n;

//空緩衝的數量

semaphore full=0;

//滿緩衝的數量

void

producer()

void

customer()

semaphore mutex=1;

//實現互斥

semaphore empty=n;

//空緩衝的數量

semaphore full=0;

//滿緩衝的數量

void

producer()

void

customer()

void

get(item x)

//這裡就是初始化資料

}pc;

void

produce()

//這個是乙個程序

}void

consumer()

}void

main()

五個哲學家圍坐在一張圓桌上 每個哲學家面前乙個碗乙隻筷子 只有拿到兩隻筷子時才能進餐 進餐結束放下筷子

問題:如果讓併發執行可能大家都只拿到一支筷子而死鎖

解決辦法:

1.最多隻允許四個哲學家去拿筷子 這樣一定會有人可以拿到兩支筷子 然後釋放資源

2.(and型)僅當哲學家能拿到左右兩支筷子時才能去拿筷子 要不然不能拿

3.讓奇數號的哲學家先拿左邊的筷子 再拿右邊的筷子 讓偶數號的哲學家先拿右邊的筷子 再拿左邊的筷子 (就是最開始相鄰的兩個人都競爭同一支筷子只有競爭拿到筷子的人才能拿另乙隻 否則就等待)

semaphone chopstick[5]

=;dowhile

(true)

;

允許同時多個讀者讀一本書 但是只允許乙個寫者寫書 並且在讀者和寫者不能同時讀寫一本書

semaphore wmutex =1;

semaphore rmutex =1;

//rmutex是防止多個程序同時對readcount進行更改 引起混亂 比如如果沒有wait(rmutex)和signal(rmutex)則假設有兩個讀者r1,r2 其中乙個已經在讀書 另乙個剛來 執行順序如下

/*r1從readcount--開始 r2從if(readcount == 0)開始

此時 readcount = 1 wmutex = 0(因為r1進來時執行過wait(wmutex);)

r1 readcout-- //readcout = 0

r2 if(readcount == 0) //通過

r2 wait(wmutex) //wmutex = -1

r2 readcount++ //readcount = 1

r1 if(readcount == 0)//不通過

。。。直到r2 signal(wmutex) //wmutex = 0

此時就出現了問題 因為此時沒有讀者在讀書 但是wmutex = 0(應該是1的) 寫者也進不去

*/int readcount =0;

void

reader()

while

(true);}

void

writer()

while

(true);}

void

main()

作業系統訊號量

本文將針對較為簡單的生產者消費者問題,給出利用訊號量解決問題的方法。生產者 能產生並投放資源的程序 消費者 單純使用 消耗 資源的程序 問題表述 一組 生產者程序和一 組消費者程序 設每組有多個程序 通過緩衝區發生聯絡。生產者程序將生產的產品 資料 訊息等統稱為產品 送入緩衝區,消費者程序從中取出產...

作業系統 訊號量

代表了一類物理資源,是相應的物理資源的抽象,通常為整型或結構體型,除了初始化之外,其他情況下只能使用p v進行操作 執行一次p s 則s.value減一,若執行p s 之後s.value 0,則表示該類資源可用,否則不可用 執行一次v s 則s.value加一,若執行v操作以後,s.value的值仍...

作業系統 訊號量機制

用乙個整數型的變數作為訊號量,用來表示股系統中某種資源的數量。與普通整數變數的區別 對訊號量的操作只有三種,初始化,p操作,v操作。p操作 相當於wait原語,進入區 v操作 signal原語,相當於退出區。大體實現 wait 方法一氣呵成,避免併發導致的問題。但是不滿足 讓權等待原則 程序會處於忙...