【作業系統】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、要想有說服力,需要用量化。
未完待續......
.
看完如果覺得不錯,留個贊再走。
.