PV操作和訊號量

2021-06-25 14:33:12 字數 4341 閱讀 8548

1.訊號量的型別定義

訊號量(semaphore)的資料結構為乙個值和乙個指標,指標指向等待該訊號量的下乙個程序。訊號量的值與相應資源的使用情況有關。當它的值大於0時,表示當前可用資源的數量;當它的值小於0時,其絕對值表示等待使用該資源的程序個數。注意,訊號量的值僅能由pv操作來改變。

一般來說,訊號量s>=0時,s表示可用資源的數量。執行一次p操作意味著請求分配乙個單位資源,因此s的值減1;當s<0時,表示已經沒有可用資源,請求者必須等待別的程序釋放該類資源,它才能執行下去。而執行乙個v操作意味著釋放乙個單位資源,因此s的值加1;若s<0,表示有某些程序正在等待該資源,因此要喚醒乙個等待狀態的程序,使之執行下去。

2.pv原語

pv操作是典型的同步機制之一。用乙個訊號量與乙個消 息聯絡起來,當信 號量的值為0時,表示期 望的訊息尚未產生;當訊號 量的值非0時,表示期望的訊息已經存在。用p v操作實現程序同步時,呼叫p操作測試訊息是否到達,呼叫v操作傳送訊息。

對乙個訊號量變數可以進行兩種原語操作:p操作和v操作,定義如下:procedure p(var s:samephore);

procedure v(var s:samephore);

其中用到兩個標準過程:

asleep(s.queue);執行此操作的程序的pcb進入s.queue尾部,程序變成等待狀態

wakeup(s.queue);將s.queue頭程序喚醒插入就緒佇列

s.value初值為1時,可以用來實現程序的互斥。

3、同步和互斥的概念

互斥:是指某一資源同時只允許乙個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。

同步:是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問,更強調程序間的協作,如同生產者消費者問題。

4、利用訊號量和pv原語進行同步和互斥

利用訊號量和pv操作實現程序互斥的一般模型是:

程序p1 程序p2 …… 程序pn

……  ……  ……

p(s);  p(s);  p(s);

臨界區;  臨界區;  臨界區;

v(s);  v(s);  v(s);

……  ……  …… ……

其中訊號量s用於互斥,初值為1。

使用pv操作實現程序互斥時應該注意的是:

⑴每個程式中使用者實現互斥的p、v操作必須成對出現,先做p操作,進臨界區,後做v操作,出臨界區。若有多個分支,要認真檢查其成對性。

⑵p、v操作應分別緊靠臨界區的頭尾部,臨界區的**應盡可能短,不能有死迴圈。

⑶互斥訊號量的初值一般為1。

利用訊號量和pv操作實現程序同步:

pv操作是典型的同步機制之一。用乙個訊號量與乙個訊息聯絡起來,當訊號量的值為0時,表示期望的訊息尚未產生;當訊號量的值非0時,表示期望的訊息已經存在。用pv操作實現程序同步時,呼叫p操作測試訊息是否到達,呼叫v操作傳送訊息。

使用pv操作實現程序同步時應該注意的是:

⑴分析程序間的制約關係,確定訊號量種類。在保持程序間有正確的同步關係情況下,哪個程序先執行,哪些程序後執行,彼此間通過什麼資源(訊號量)進行協調,從而明確要設定哪些訊號量。

⑵訊號量的初值與相應資源的數量有關,也與p、v操作在程式**中出現的位置有關。

⑶同一訊號量的p、v操作要成對出現,但它們分別在不同的程序**中。

5、典型理解偏差

三個問題:

一,以v原語的1、2步來做,sem不就永遠大於0,那程序不就一直迴圈執行成為死迴圈了?

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

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

析疑:一,p操作對sem減1的。p、v原語必須成對使用!從而不會造成死迴圈。

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

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

為了進一步加深理解,再引入二個問題:

四,如果是互斥訊號量的話,應該設定訊號量sem=1,但是當有5個程序都訪問的話,最後在該訊號量的煉表裡會有4個在等待,也是說s=-4,那麼第乙個程序執行了v操作使s加1,釋放了資源,下乙個應該能夠執行,但喚醒的這個程序在執行p操作時因s〈0,也還是執行不了,這是怎麼回事呢?

五,sem的絕對值表示等待的程序數,同時又表示臨界資源,這到底是怎麼回事?

析疑:四,當乙個程序阻塞了的時候,它已經執行過了p操作,並卡在臨界區那個地方。當喚醒它時就立即進入它自己的臨界區,並不需要執行p操作了,當執行完了臨界區的程式後,就執行v操作。

五,當訊號量sem小於0時,其絕對值表示系統中因請求該類資源而被阻塞的程序數目.s大於0時表示可用的臨界資源數。注意在不同情況下所表達的含義不一樣。當等於0時,表示剛好用完。

6、應用題

【例1】生產者-消費者問題

在多道程式環境下,程序同步是乙個十分重要又令人感興趣的問題,而生產者-消費者問題是其中乙個有代表性的程序同步問題。下面我們給出了各種情況下的生產者-消費者問題,深入地分析和透徹地理解這個例子,對於全面解決作業系統內的同步、互斥問題將有很大幫助。

(1)乙個生產者,乙個消費者,公用乙個緩衝區。

定義兩個同步訊號量:

empty——表示緩衝區是否為空,初值為1。

full——表示緩衝區中是否為滿,初值為0。

生產者程序

while(true)

消費者程序

while(true)

(2)乙個生產者,乙個消費者,公用n個環形緩衝區。

定義兩個同步訊號量:

empty——表示緩衝區是否為空,初值為n。

full——表示緩衝區中是否為滿,初值為0。

設緩衝區的編號為1~n-1,定義兩個指標in和out,分別是生產者程序和消費者程序使用的指

,指向下乙個可用的緩衝區。

生產者程序

while(true)

消費者程序

while(true)

(3)一組生產者,一組消費者,公用n個環形緩衝區

在這個問題中,不僅生產者與消費者之間要同步,而且各個生產者之間、各個消費者之間還必須互斥地訪問緩衝區。

定義四個訊號量:

empty——表示緩衝區是否為空,初值為n。

full——表示緩衝區中是否為滿,初值為0。

mutex1——生產者之間的互斥訊號量,初值為1。

mutex2——消費者之間的互斥訊號量,初值為1。

設緩衝區的編號為1~n-1,定義兩個指標in和out,分別是生產者程序和消費者程序使用的指標,指向下乙個可用的緩衝區。

生產者程序

while(true)

消費者程序

while(true)

需要注意的是無論在生產者程序中還是在消費者程序中,兩個p操作的次序不能顛倒。應先執行同步訊號量的p操作,然後再執行互斥訊號量的p操作,否則可能造成程序死鎖。

【例2】桌上有一空盤,允許存放乙隻水果。爸爸可向盤中放蘋果,也可向盤中放桔子,兒子專等吃盤中的桔子,女兒專等吃盤中的蘋果。規定當盤空時一次只能放乙隻水果供吃者取用,請用p、v原語實現爸爸、兒子、女兒三個併發程序的同步。

分析 在本題中,爸爸、兒子、女兒共用乙個盤子,盤中一次只能放乙個水果。當盤子為空時,爸爸可將乙個水果放入果盤中。若放入果盤中的是桔子,則允許兒子吃,女兒必須等待;若放入果盤中的是蘋果,則允許女兒吃,兒子必須等待。本題實際上是生產者-消費者問題的一種變形。這裡,生產者放入緩衝區的產品有兩類,消費者也有兩類,每類消費者只消費其中固定的一類產品。

解:在本題中,應設定三個訊號量s、so、sa,訊號量s表示盤子是否為空,其初值為l;訊號量so表示盤中是否有桔子,其初值為0;訊號量sa表示盤中是否有蘋果,其初值為0。同步描述如下:

int s=1;

int sa=0;

int so=0;

main()

}son()

daughter()

}                    }                  } 

思考題解答:

(1)定義二個訊號量s1、s2,初值均為1,即:s1=1,s2=1。其中程序a和c使用訊號量s1,程序b和d使用訊號量s2。

(2)從[1]到[8]分別為:p(s1) v(s1) p(s2) v(s2) p(s1) v(s1) p(s2) v(s2)

PV操作和訊號量

乙個程序被分為了 就緒 ready 執行 running 和 阻塞 blocking 三個工作狀態,當前用處理器的哪個程序是 執行 狀態,當前已經具備了使用處理器的條件而等待處理器的程序是處於就緒狀態的程序,當執行的程序由於某種原因無法繼續使用處理器的時候就停止他使用處理器使他進入 阻塞 狀態,當他...

訊號量,PV操作

它從整型訊號量 記錄型訊號量,進而發展為 訊號量集 機制 訊號量集,就是訊號量的集合 現在要用的是記錄型訊號量 1,訊號量幹嘛用的?訊號量 解決程序間同步與互斥問題 2.訊號量的組成 訊號量 分很多種,在此寫記錄型訊號量 record semaphore 訊號量組成 每個訊號量s除乙個整數值s.va...

訊號量同步 P V 操作

訊號是 e.w.dijkstra 在二十世紀六十年代末設計的一種程式設計架構。dijkstra 的模型與鐵路操作有關 假設某段鐵路是單線的,因此一次只允許一列火車通過。訊號將用於同步通過該軌道的火車。火車在進入單一軌道之前必須等待訊號燈變為允許通行的狀態。火車進入軌道後,會改變訊號狀態,防止其他火車...