乙個P,V操作的習題

2021-07-25 16:31:00 字數 1239 閱讀 4624

題目:

在乙個盒子裡,混裝了數量相等的黑白圍棋子。現在用自動分揀系統把黑子、白子分開,設分揀系統有二個程序p1 和p2 ,其中p1 揀白子;p2 揀黑子。規定每個程序每次只揀一子;當乙個程序在揀時,不允許另乙個程序去揀;當乙個程序揀了一子時,必須讓另乙個程序去揀。試寫出兩程序p1 和p2 能併發正確執行的程式。

分析: pv

操作的題,也就是與訊號量處理相關的問題,對於學生而言,一般是比較棘手的。不知道該如何入手。一般而言,主要是上課聽課不認真,另外就是沒有做過練習題造成的。

訊號量,說白了,就是生活中的乙個標誌。比如火車上的衛生間,為了防止大家誤入,衛生間門上有個標誌,進去了的人將標誌設為「有人」,出來以後再設定為「無人」,大家約定,看到「有人」就不能進入,否則就可以進入。如果大家都遵守這個約定,那麼就不會多個人一同進去了。「有人」「沒人」就可以在計算機中用0和1來表示。衛生間進人,需要將「沒人」變成「有人」,實際上就是將1變成0。人從衛生間出來,需要將「有人」變成「沒人」,就是將0變成1。  好了,將1變成0,我們用p來表示(減一),將0變成1我們用v來表示(加一),p v操作就有了。

解決pv的習題,就是要想辦法設定好這個標誌,然後對標誌進行加減操作。

解答:思路一:

撿棋子,這個問題的關鍵就在於,我撿完了你撿,你撿完了我撿,不能連續撿。如果讓兩個程序在盒子裡撿,那麼很明顯,我們要設定兩個標誌f1,f2。f1=1表示p1可以撿,f2=1表示p2可撿,另外p1,p2要約定好,某個程序準備撿的時候要先將自己的標誌置0,撿完了,要把對方的標誌置1。這樣就可以防止兩次連續進入了。

因此設定訊號量:f1=0,f2=1(哪個為0,哪個為1無所謂)。p1:

p(f1)

撿白子v(f2) p2

: p(f2)

撿黑子v(f1)

思路二:

設定訊號量s=1,代表盒子,盒子同一時刻只能有乙個程序訪問

設定訊號量k=1,代表剛剛p1操作過。如果k=0,代表p2剛剛操作過。p1:

p(s)

if(k=1)

else v

(s) p2:

p(s)

if(k=0)

else v

(s)

思路二也是對的,程式也可以正確執行。但是相比思路一,思路二程式的效率肯定不高。

因此pv操作的答案是不唯一的。都可能對,且保證不出錯,但是效率的高不高可不一定。

乙個可以刷PV的工具

using system using system.drawing using system.collections using system.componentmodel using system.windows.forms using system.threading using system....

作業系統之pv經典習題

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

乙個PV操作題引發的思考,如何看待程序間同步 互斥

這是一道選擇題,答案是 設,收銀員和顧客的私有訊號量為s1和s2 a p sn b1 v s1 b2 p s2 c1 p s1 c2 v s2 我是這樣理解pv定義的,在b1處執行v s1 操作,那麼執行 v操作的程序即是私有訊號量s1的所有者 收銀員程序的,那麼此處s1 1 進而執行收銀員程序。在...