作業系統之PV操作

2021-05-27 17:26:37 字數 4840 閱讀 4305

在計算機作業系統中,pv操作是程序管理中的難點。

首先應弄清pv操作的含義:pv操作由p操作原語和v操作原語組成(原語是不可中斷的過程),對訊號量進行操作,具體定義如下:

p(s):①將訊號量s的值減1,即s=s-1;

②如果s³0,則該程序繼續執行;否則該程序置為等待狀態,排入等待佇列。

v(s):①將訊號量s的值加1,即s=s+1;

②如果s>0,則該程序繼續執行;否則釋放佇列中第乙個等待訊號量的程序。

pv操作的意義:我們用訊號量及pv操作來實現程序的同步和互斥。pv操作屬於程序的低階通訊。

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

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

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

程序p1              程序p2           ……          程序pn

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

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

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

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

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

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

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

(3)互斥訊號量的初值一般為1。

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

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

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

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

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

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

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

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

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

定義兩個同步訊號量:

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

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

生產者程序

while(true)

生產乙個產品;

p(empty);

產品送往buffer;

v(full);

消費者程序

while(true)

p(full);

從buffer取出乙個產品;

v(empty);

消費該產品;

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

定義兩個同步訊號

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

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

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

生產者程序

while(true)

生產乙個產品;

p(empty);

產品送往buffer(in);

in=(in+1)mod n;

v(full);

消費者程序

while(true)

p(full);

從buffer(out)中取出產品;

out=(out+1)mod n;

v(empty);

消費該產品;

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

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

定義四個訊號量:

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

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

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

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

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

生產者程序

while(true)

生產乙個產品;

p(empty);

p(mutex1);

產品送往buffer(in);

in=(in+1)mod n;

v(mutex1);

v(full);

消費者程序

while(true)

p(full)

p(mutex2)

從buffer(out)中取出產品;

out=(out+1)mod n;

v(mutex2);

v(empty);

消費該產品;

需要注意的是無論在生產者程序中還是在消費者程序中,兩個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()

cobegin

father();      /*父親程序*/

son();        /*兒子程序*/

daughter();    /*女兒程序*/

coend

father()

while(1)

p(s);

將水果放入盤中;

if(放入的是桔子)v(so);

else  v(sa);

son()

while(1)

p(so);

從盤中取出桔子;

v(s);

吃桔子;

daughter()

while(1)

p(sa);

從盤中取出蘋果;

v(s);

吃蘋果;

思考題:

四個程序a、b、c、d都要讀乙個共享檔案f,系統允許多個程序同時讀檔案f。但限制是程序a和程序c不能同時讀檔案f,程序b和程序d也不能同時讀檔案f。為了使這四個程序併發執行時能按系統要求使用檔案,現用pv操作進行管理,請回答下面的問題:

(1)應定義的訊號量及初值:                    。

(2)在下列的程式中填上適當的p、v操作,以保證它們能正確併發工作:

a()                b()                  c()                 d()

[1];                [3];                  [5];                 [7];

read f;             read f;                read f;              read f;

[2];                [4];                  [6];                 [8];

思考題解答:

(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操作

1.pv原語的含義 p操作和v操作是不可中斷的程式段,稱為原語。pv原語及訊號量的概念都是由荷蘭科學家e.w.dijkstra提出的,其基本思路是用一種新的變數型別 semaphore 來記錄當前可用資源的數量。訊號量sem是一整數,sem大於等於零時代表可供併發程序使用的資源實體數,但sem小於零...

作業系統 PV操作

分析 進入書店p sn 與離開書店v sn 操作對應題目中的 該書店最多允許n個購書者進入 因為假如進入書店的人數超過了最大的限制,p操作會被阻塞,知道v操作執行後釋放空間。接下來分析購書與收費的流程,現實生活中購書付款是顧客提出繳費的要求後,收銀員才能進行收費。所以收銀員預設是處於待機狀態即阻塞狀...

作業系統之pv經典習題

作業系統之pv經典習題 1.有一閱覽室,共有100個座位。讀者進入時必須先在一種登記表上登記,該錶為每一座位列乙個表目,包括座號和讀者姓名。讀者離開時要登出掉登記內容。試用wait和signal原語描述讀者程序的同步問題。semaphore empty 100 記錄空座位 semaphore mut...