二、操作系統——用信號量機制實現進程互斥、同步、前驅關係(詳解)

一、什麼是進程同步?

在這裏插入圖片描述

二、什麼是進程互斥?

臨界資源:一個時間段內只允許一個進程使用的資源
在這裏插入圖片描述
在這裏插入圖片描述

爲了實現對臨界資源的互斥訪問,同時保證系統整體性能,需要遵循以下原則:

  1. 空閒讓進。臨界區空閒時,可以允許一個請求進入臨界區的進程立即進入臨界區;
  2. 忙則等待。當已有進程進入臨界區時,其他試圖進入臨界區的進程必須等待;
  3. 有限等待。對請求訪問的進程,應保證能在有限時間內進入臨界區(保證不會飢餓);
  4. 讓權等待。當進程不能進入臨界區時,應立即釋放處理機,防止進程忙等待。

在這裏插入圖片描述
注意:
5. 進程同步也可以說是進程之間的直接制約(合作)關係:因爲進程之間是有直接的合作的,需要進程之間進行相互配合,各進程的工作推進需要遵循一定的先後順序
6. 進程互斥也可以說是進程之間的互斥制約(合作)關係:因爲進程之間並沒有直接的合作關係,他們之間只是想要互斥的使用某種系統的臨界資源,所以纔會產生這種制約關係

三、信號量機制

在這裏插入圖片描述
用戶進程可以通過使用操作系統提供的一對原語來對信號量進行操作,從而很方便的實現了進程互斥、進程同步。

  1. 信號量其實就是一個變量(可以是一個整數,也可以是更復雜的記錄型變量),可以用一個信號量來表示系統中某種資源的數量,比如:系統中只有一臺打印機,就可以設置一個初值爲1的信號量。
  2. 原語是一種特殊的程序段,其執行只能一氣呵成,不可被中斷。原語是由關中斷/開中斷指令實現的。軟件解決方案的主要問題是由“進入區的各種操作無法一氣呵成”,因此如果能把進入區、退出區的操作都用“原語”實現,使這些操作能“一氣呵成”就能避免問題。
  3. 一對原語wait(S)原語signal(S)原語,可以把原語理解爲我們自己寫的函數,函數名分別爲wait和signal,括號裏的信號量s其實就是函數調用時傳入的一個參數。
    wait、signal原語常簡稱爲P、V操作(來自荷蘭語proberen和verhogen)。因此,做題的時候常把wait(S)、signal(S)兩個操作分別寫爲P(S)、V(S)

1)整型信號量

在這裏插入圖片描述

2)記錄型信號量

進入wait原語時:
S.value 先進行了-1操作,如果S.value的值在經過-1操作之後 < 0,則說明原本的S.value的值是<=0的,而S.value的數值其實就代表着資源的數量,所以資源的數量是 <= 0, 則需要使用block原語來使該進程由運行態進入阻塞態,並掛到信號量S的等待(阻塞)隊列中

進入signal原語時:
S.value 先進行了+1操作,如果S.value的值在經過+1操作之後 <= 0,則說明原本的S.value的值是<= -1的,而此時的S.value的數值的絕對值可以理解爲等待隊列中的進程數量,所以等待隊列中的進程數量是 >= 1的, 則需要使用wakeup原語喚醒等待隊列中的一個進程(即位於隊頭的進程)讓該進程從阻塞態變爲就緒態

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

四、用信號量機制實現進程互斥

  1. 爲什麼要把互斥信號量mutex的初值設置爲1?
    答:信號量的初值其實表示的是系統中某種資源的數量,而臨界區在一個時間段內也只能運行一個進程對它進行訪問,所以我們可以把臨界區也理解成一種特殊的資源,並且這個資源只有一個,也就是說臨界區只能被分配給一個進程使用。只有這個進程釋放了這個臨界區資源之後,才能被其他進程訪問。

  2. 在臨界區之前執行P(mutex)

  3. 在臨界區之後執行V(mutex)

  4. P、V操作必須成對出現。缺少P(mutex)就不能保證臨界資源的互斥訪問。缺少V(mutex)會導致資源永不被釋放,等待進程永不被喚醒。
    在這裏插入圖片描述

五、用信號量機制實現進程同步

在這裏插入圖片描述

  1. 設置同步信號量S,初值爲0
  2. 在“前操作”之後執行V(S)
  3. 在“後操作”之前執行P(S)
    在這裏插入圖片描述

六、用信號量機制實現前驅關係

對於前驅圖的理解:只有S1執行完之後,才能執行S2、S3。而只有S2執行完之後,才能執行S4、S5。剩下的以此類推。。。

其實,前驅關係可以看作是多層的同步關係
在這裏插入圖片描述
記住:

  1. 互斥問題,信號值初值爲1(互斥訪問臨界區)
  2. 同步問題,信號值初值爲0(進程間相互配合工作,遵循一定的先後順序)
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章