作業系統之程序 訊號量及其操作 (三)

2021-08-30 21:46:41 字數 3831 閱讀 5646

有一環形緩衝池,包含n個緩衝區(0~n-1)。有兩組程序:一組生產者程序和一組消費者程序,生產者程序向空的緩衝區中放產品,消費者程序從滿的緩衝區中取走產品

p1、p2(生產者執行緒)各生產出乙個產品,系統共有兩個產品

作業系統實現程序同步的機制,它通常由同步原語組成

訊號量與pv操作

管程訊息傳遞 

將交通管制中多種顏色的訊號燈管理交通的方法引入作業系統,讓兩個或多個程序通過特殊變數展開互動。

原語是作業系統核心中執行時不可中斷的過程,即原子操作

兩個訊號量的操作原語

利用訊號量和p、v操作既可以解決併發程序的競爭問題,又可以解決併發程序的協作問題

隨著訊號量的發展,先後出現了以下幾種形式的訊號量:整型訊號量、結構型訊號量、訊號量集機制

(1)資料型別:整型量s

(2)操作:

(3)原子操作:操作不能被中斷

(4) p(s)、v(s)操作定義

(5) s初值:一般取可用資源數目

缺陷:未遵循「讓權等待」原則 若s=0,則程序便在while  s≤0  do  no-op無限迴圈進行等待,白白浪費cpu時間 為實現讓權等待(當程序不能進入臨界區,應該立即釋放處理機,防止程序忙等待),引進了結構性訊號量機制 

(1)解決問題:讓權等待

(2)辦法:等待時阻塞自己

(3)資料結構

typedef struct semaphore 

p(s)、v(s)操作定義

(1)解決問題

克服整型及記錄型訊號量一次僅能獲得乙個單位的一種臨界資源(乙個單位是指乙個訊號量+對應的pv操作),從而容易導致死鎖(違背有限等待原則)的缺陷 (如果有多個訊號量容易導致死鎖)。

(2) and 同步機制思想:對於程序在整個執行過程中需要的所有資源,要麼一次性地全部分配給該程序,要麼乙個也不分

(3)資料結構:類同記錄型訊號量的資料結構

(4)操作定義

swait(s1 ,  s2 , … ,  sn )

if s1≥1 and … and sn≥1 then

for i:=1 to n do

si := si -1;

endfor

else

將程序放在與si相關聯的阻塞佇列,si是最先發現小於1的,並且將程序的程式計數器置於swait操作的開頭;

endif

ssignal(s1 , s2 , … , sn )

for i:=1 to n do

si := si + 1;

將與si相關聯的阻塞佇列中的所有程序移出放入到就緒佇列;

endfor

(1)解決問題: 某程序一次需要n個某類臨界資源時,避免執行n次p操作 當資源量《下限值時不分配

(2)資料結構:訊號量s,需求值d,下限值t

(3)操作定義

swait(s1 , t 1,d1; … ;  sn , tn  , dn )

if s1≥ t 1 and … and sn≥ tn then

for i:=1 to n do

si := si - di;

endfor

else

將程序放在與si相關聯的阻塞佇列,si是最先發現小於ti的,並且將程序的程式計數器置於swait操作的開頭;

endif

ssignal(s1 ,d1 , … , sn ,dn )

for i:=1 to n do

si := si + di ;

將與si相關聯的阻塞佇列中的所有程序移出放入到就緒佇列;

endfor

為臨界資源設一互斥訊號量mutex,初值為1,將臨界區置於p(mutex)和v(mutex)之間, p(mutex)和v(mutex)一定成對出現在同乙個程序中 

對於兩個併發程序,互斥訊號量的值僅取1、0和-1三個值

五位哲學家圍坐一張圓桌,桌上放五根筷子,每位哲學家只能拿起與他相鄰的兩根筷子吃飯 哲學家的生活方式是交替地進行思考和進餐

操作描述:第i位哲學家的活動如下: 

semaphore fork[5];

for (int i=0;i<5;i++) fork[i]=1;

cobegin

process philosopher_i()

}coend

若每個哲學家都各自拿起他左邊的一根筷子,然後再去拿他右邊的筷子時,將都拿不到右邊的筷子,大家又都不會放下手中的筷子,大家在相互等待別人釋放筷子,系統於是進入死鎖狀態 

1)至多允許有四位哲學家同時去拿左邊的筷子,最終保證至少有一位哲學家能夠進餐,(至多可以有兩位哲學家能夠進餐)

此時已經有四位哲學家拿起了筷子,所以哲學家4不能再拿筷子了,哲學家3可以拿起筷子4,從而擁有兩根筷子可以吃飯

2)僅當哲學家的左右兩根筷子均可用時,才允許他拿起筷子進餐。這種方案可以採用and訊號量機制來實現

3)規定奇數號哲學家先拿他左邊的筷子,然後再去拿右邊的筷子;偶數號哲學家先拿他右邊的筷子,然後再去拿左邊的筷子

semaphore fork[5];

for (int i=0;i<5;i++) fork[i]=1;

cobegin

process philosopher_i()

}coend

資料結構:

操作要求:多個生產者程序之間、多個消費者程序之間、生產者程序與消費者程序之間均能正確同步

操作描述:

注意:1)在每個程式中用於互斥的p(mutex)和v(mutex)必須成對出現。

2)對資源訊號量empty和full的操作也同樣必須成對出現,但它們在不同的程式中。

3)在每個程式中的多個p操作順序不能顛倒,否則容易引起死鎖 ,程序應先申請資源訊號量p(empty)/p(full),再申請互斥訊號量p(mutex)!

s. value大於0那就表示有臨界資源可供使用,為什麼不喚醒程序?

s大於0的確表示有臨界資源可供使用,而且這個時候沒有程序被阻塞在這個資源上,也就是說沒有程序因為得不到這類資源而阻塞,所以沒有被阻塞的程序,自然不需要喚醒。

s. value小於0應該是說沒有臨界資源可供使用,為什麼還要喚醒程序?

v原語操作的本質在於:乙個程序使用完臨界資源後,釋放臨界資源,使s加1,以通知其它的程序,這個時候如果s<0,表明有程序阻塞在該類資源上,因此要從阻塞佇列裡喚醒乙個程序來「接手」該類資源。比如,有兩個某類資源,四個程序a、b、c、d要用該類資源,最開始s=2,當a進入,s=1,當b進入s=0,表明該類資源剛好用完, 當c進入時s=-1,表明有乙個程序被阻塞了,d進入,s=-2。當a用完該類資源時,進行v操作,s=-1,釋放該類資源,而這時s<0,表明有程序阻塞在該類資源上,於是喚醒乙個。

作業系統訊號量

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

作業系統 訊號量

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

作業系統之 訊號量機制

訊號量機制是一種卓越成效的程序同步工具,訊號量機制已經被廣泛的使用於單處理機,和多處理系統的計算機網路中。訊號量s 是乙個整數,s大於等於零代表可供併發程序使用的資源實體數,當 s小於零時則表示正在等待使用臨界區的程序數,整型訊號量 整型訊號量定義乙個用於表示資源數目的整型量數目s 但是僅能通過兩個...