現代作業系統 程序間通訊

2021-08-18 07:22:26 字數 1063 閱讀 9165

如何避免競爭條件:

1.任何兩個程序不能同時處於其臨界區

2.不應對cpu的速度和數量做任何假設

3.臨界區外執行的程序不得阻塞其他程序

4.不得使程序無限期等待進入臨界區

生產者-消費者問題:

兩個程序共享乙個公共的固定大小的緩衝區,其中乙個是生產者,將資訊放入緩衝區,另乙個是消費者,從緩衝區中取出資訊。

問題在於當緩衝區已滿,而生產者還想放入乙個新的資料,解決方法是讓生產者休眠,直到消費者取出乙個時喚醒。反之亦然,當消費者試圖從緩衝區取資料而緩衝區為0時,消費者休眠。

該方法存在競爭條件的問題,如果緩衝區最多存放n個資料,則生產者首先判斷是否為n,若是,則生產者休眠,否則生產者生成乙個資料放入緩衝區。消費者類似。

因此會出現競爭條件,對於資料的訪問未加限制,有可能出現以下情況:緩衝區為0,消費者剛剛讀取為0,因此暫停消費者並啟動生產者,加入資料,變為1,生產者認為由於緩衝區為0,消費者一定處於睡眠,會呼叫weak up來喚醒消費者。但消費者實際上未處於睡眠,weak up訊號丟失,當消費者下次執行時,將測試先前讀到的資料發現為0,於是睡眠,生產者遲早會填滿整個緩衝區然後睡眠,因此兩個程序都將永遠睡眠下去。

問題的實質在於發給乙個未睡眠程序的weakup訊號丟失,若沒有丟失,則一切正常。一種快速的方法是加上乙個喚醒等待位,若乙個wakeup訊號傳送給乙個清醒的程序訊號時,將該位置1,隨後當程序要休眠時,若喚醒等待位為1,則將該位清除,而該程序仍保持清醒。

但是若有更多程序,乙個喚醒等待位就不夠了,那麼可以加入多個等待位,但這並沒有從根本上解決問題。

根本上解決生產者消費者問題的方法是引用訊號量

訊號量的取值可以為0(表示沒有儲存下來的喚醒操作),也可以為正值(表示多個喚醒操作)。

訊號量有兩種操作,down(p)和up(v),分別為一般化後的sleep和wakeup,對一訊號量執行down操作,則是檢查其值是否大於0,若大於0,則減1,用掉乙個儲存的喚醒訊號,若該值為0,則程序將睡眠。up操作是對訊號量的值增1。

也就是說,訊號量是提供了多個程序對於乙個共享資料的訪問保護,使程序按照順序排隊訪問。

如果不需要訊號量的計數能力,也可以使用簡化版本,互斥量。

作業系統 程序間通訊

程序間通訊涉及到3個問題 1.乙個程序如何把資訊傳遞給另乙個程序 2.確保兩個或多個程序之間不會在關鍵活動中出現交叉 3.程序間執行的順序對執行結果的影響。注意 確保程序對臨界區的 互斥 訪問。忙等待的互斥 1.遮蔽中斷 當乙個程序進入臨界區後立即遮蔽所有中斷,時鐘中斷也被遮蔽 這樣cpu就不會進行...

作業系統 程序間通訊

include include include include include include ifndef semun h 條件編譯,即若semun在標頭檔案中沒有被定義,就進行下面的編譯 define semun h union semun endif static int set semval...

作業系統 程序間通訊

程序間通訊方式總結 優缺點 linus下的程序通訊手段基本上是從unix平台上的程序通訊手段繼承而來的。1 無名管道通訊 半雙工通訊,只能在具有親緣關係的程序間使用 1 管道 2 高階管道通訊 將另乙個程式當做乙個新的程序在當前程式程序中啟動,則它算是當前程式的子 程序 3 有名管道通訊 半雙工通訊...