進程互斥
競爭資源(臨界資源)
-
當並發進程競爭使用同一資源時,他們之間就會發生沖突。如果操作系統將資源分配給其中的某一個進程使用,另一個進程就必須等待,直到申請的資源可用時,由操作系統分配給他們。
-
如果競爭資源的進程太多,這些進程還必須等待在一個隊列中,如就緒隊列,阻塞隊列等。
-
一種極端的情況是,被阻塞進程永遠得不到申請的資源,而死鎖。
采用互斥方式,使用臨界資源
資源的互斥,進程使用上述這類資源的時候,只能有一個進程對資源進行處理。下面是臨界區的使用圖和注解。
進程同步
進程同步和互斥的解決方法
互斥與同步的解決方法--軟件方法
控制p0,p1互斥的進入臨界區。
while循環為進入區應該做的事情。當不符合條件的時候,進行do{nothing}操作。
使用軟件解決方法,有一個公認的比較好的算法,為Dekker算法。下面是Dekker算法介紹。
Dekker算法介紹:
上面是Dekker算法的偽代碼,還有p0進程的執行流程圖。
互斥與同步的解決方法--硬件方法
硬件方法包括屏蔽中斷和專用機器指令。
屏蔽中斷:
由於進程切換需要依賴中斷來實現,如果屏蔽中斷,則不會出現進程切換。
因此,為了實現對臨界資源的互斥使用,可以在進程進入臨界區之前,屏蔽中斷。當進程退出臨界區時,打開系統中斷。這樣就實現了同步和互斥的問題的解決。
專用機器指令:
(指令系統是計算機硬件的語言系統,也叫機器語言)
利用一些專用機器指令也能實現互斥,機器指令在一個指令周期內執行,不會受到其他指令的干擾,也不會被中斷。
下面就是一個使用機器指令的例子:


(左邊為機器指令方法,右邊為實現代碼)
互斥與同步的解決方法--信號量
信號量方法,就是用一個信號量來控制進程之間的使用。(就像是交通中的紅路燈(信號量)與汽車之間的關系和作用)
信號量的類型(count):
互斥信號量:用於申請或者釋放資源的使用權,常初始化為1.
資源信號量:用於申請或者歸還資源,可以初始化為大於1的正整數,表示系統中可用資源的個數。(比如說,我有多個顯示屏,那么就可以使用count表示顯示屏的個數。)
信號量的操作:wait和signal(操作系統中,用系統調用的形式來提供wait和signal原語)
s.conut為為信號量
wait為申請資源 (優先於signal)
signal為釋放資源 (滯后於wait)
下面是wait,signal操作的偽代碼:
信號量的使用例子:
根據上面的信號量,我們可以總結出信號量的物理意義:
互斥與同步的解決方法--管程
管程是一種在程序設計級控制進程互斥與同步的機制,具有信號量的功能,且更容易使用和控制。
管城只要用於面向對象程序設計。

消息傳遞同步操作原語:
兩個進程之間的通訊,需要一些操作。我們使用操作系統提供的原語來完成這些操作。
send原語:發送消息
receive原語:接受消息,如果沒有消息可以接受,那么則等待。
常用的進程通訊:
-
基於共享存儲區的方法
-
郵箱的方式
分別介紹:
基於共享存儲區的方式:
通訊的雙方是基於共享存儲區來通訊的。這個共享數據區屬於每個相互通訊的進程的組成部分。然后通訊之間向里面存儲數據,提取數據。

郵箱方式:
只要保證郵箱中,只有一個消息,那么就可以實現消息之間的互斥這樣,就保證了進程之間的互斥。