1. 程式人生 > >【作業系統】PV 操作經典例題---三個程序之間的同步

【作業系統】PV 操作經典例題---三個程序之間的同步

問題:

總共有 讀入、執行、列印 三個程序,試用PV操作描述讀入B1列印B2的同步過程。

問題解讀:

這個問題就是說了這樣一件事:一個輸入B1,被操作之後,成為B2,將B2列印。怎樣用PV操作來說這件事。那麼新的問題來了:啥是個PV操作?

就拿這道題來解釋PV操作吧,我想列印一個值,前提條件是這個值存在吧,如果不存在,那麼列印這個動作就不應該被執行,不能說啥也沒有在那瞎列印吧。那麼怎樣才能讓它不執行呢?

這就需要引入訊號量機制了,當一個操作的訊號量為負數的話,就會掛起等待,不執行。當一個操作的訊號量為0或者正數的時候,就可以執行。

P操作會使訊號量 -1,V操作會使訊號量 +1。

解決問題:

按理說,我有三個操作,讀入(Reader)、執行(Executer)、列印(Printer),應該對應設定三個訊號量R、E、P,對應PV操作流程如下圖所示:

解釋上圖的步驟:

首先,將輸入訊號量R初始化為1,保證讀入程序Reader能夠啟動。

如果這時候沒有從Reader程序開始執行,而是試圖執行Executer或者Printer程序,由於訊號量E、P初始值都是0,而且一上來就是P操作,所以會使訊號量E、P成為 -1,這樣程序將會掛起等待,不執行。

所以,能執行的程序只有讀入程序Reader。

接著看,執行P(R),會使訊號量R-1得0,執行輸入B1操作,這時候B1已經被輸入了,繼續執行V(E)操作來喚醒Executer程序,再往下就是執行V(R)操作來再次喚醒讀入程序。這就有Bug了,因為剛剛輸入的B1還不一定被Executer程序處理了呢,就喚醒了下次的讀入,這就有可能出現第二次的讀入內容將第一次的讀入內容覆蓋,導致結果錯誤。

為了避免這樣的Bug發生,我們需要引入第四個訊號量N,即Next輸入訊號量,並且初始化為0。

現在總共就有四個訊號量了,分別是輸入訊號量R=1,Next輸入訊號量N=0,B1存在訊號量E=0,B2存在訊號量P=0,對應PV操作流程如下圖所示:

解釋上圖的步驟:

在三個訊號量的基礎之上,加入了Next輸入訊號量N,並初始化為0。

當Reader程序執行到P(N)的時候,由於N的初始訊號量為0,對N進行一次P操作,N-1 = -1,Reader程序將被掛起等待,無法繼續執行。等到Executer程序執行完輸出B2的時候,下一步執行V(N),對N進行一次V操作,N+1 = 0,Reader程序將被喚醒。這樣,在將B1執行的結果B2輸出之後,才允許第二次輸入,可以避免因第二次輸入覆蓋第一次輸入而導致結果錯誤的Bug。


這裡我再給出老師課堂上給出的答案,我個人認為兩個版本的差別不是很大,所以這個就不再一步一步解釋了:

結尾:

在課堂上我給出了我的解法思路,結果一下課問同學們理解不理解我的思路?結果是問一個一個不懂,很是鬱悶。遂作此文。其實我覺得我那個版本還存在問題,但是由於是自己想出來的,思維定式,一時半會找不出來,希望看懂的同學給指點指點,定當感激。


作業系統老師課堂語錄收集:

1、師父領進門,修行靠個人。

2、學生的主業就是上課,所以你們沒事就都來上課啊。

3、編故事也是一種能力,描述能力。

4、非我族類,其心必異。

5、要想有秩序,必須有規則。

6、千萬不要等著,掌握了70%就上,做著做著就到90%了。

7、有時候方法簡單一點,你就會忽略這實際上是一種方法;有時候方法複雜一點,多想幾步,這個方法就上升成為一種策略了。

8、我那時候的作業系統老師對我們講:作業系統這門課你們現在學是學不懂的,等畢業你就懂了。

9、一等人才制定遊戲規則,二等人才執行遊戲規則,三等人才玩遊戲。

10、要想有說服力,需要用量化。

未完待續......

.


看完如果覺得不錯,留個贊再走。


.