操作系統--進程的互斥與同步


進程互斥

進程互斥:在多個程序中,有兩個進程不可以同時進行(例如讀,寫操作)。
 

競爭資源(臨界資源)

  • 當並發進程競爭使用同一資源時,他們之間就會發生沖突。如果操作系統將資源分配給其中的某一個進程使用,另一個進程就必須等待,直到申請的資源可用時,由操作系統分配給他們。

  • 如果競爭資源的進程太多,這些進程還必須等待在一個隊列中,如就緒隊列,阻塞隊列等。

  • 一種極端的情況是,被阻塞進程永遠得不到申請的資源,而死鎖。

采用互斥方式,使用臨界資源

資源的互斥,進程使用上述這類資源的時候,只能有一個進程對資源進行處理。下面是臨界區的使用圖和注解。

                                           

 

進程同步

多個進程常常需要共同修改某些共享變量,表格,文件數據庫等,協作完成一些功能。這個時候,就需要用到進程之間的同步。
我們把異步環境下的一組並發進程因直接制約而互相發送消息、進行互相合作、互相等待,使得各進程按一定的速度執行的過程稱為進程間的同步。
 
 

進程同步和互斥的解決方法

互斥與同步的解決方法--軟件方法

控制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原語:接受消息,如果沒有消息可以接受,那么則等待。

 

常用的進程通訊

  1. 基於共享存儲區的方法

  2. 郵箱的方式

分別介紹:

基於共享存儲區的方式:

通訊的雙方是基於共享存儲區來通訊的。這個共享數據區屬於每個相互通訊的進程的組成部分。然后通訊之間向里面存儲數據,提取數據。


郵箱方式: 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM