1. 程式人生 > >作業系統 程序同步訊號量

作業系統 程序同步訊號量

~~

一、訊號量機制

~~
1、整型訊號量
1)訊號量定義為一個整型量;
2)根據初始情況賦相應的值;
3)僅能通過兩個原子操作來訪問。
在這裡插入圖片描述
整型訊號量符合“有限等待”原則
signal釋放資源後,當CPU被分配給等待程序後,等待程序仍可繼續執行,可以符合“有限等待”。
但整型訊號量不符合“讓權等待”原則
整型訊號量的wait操作,當s ≤0時,當前程序會佔著CPU不斷測試;
訊號量原語不能被打斷,這個佔有CPU的程序會一直不斷的佔據CPU迴圈下去,陷入忙等。
2、記錄型訊號量
改進:條件不符時應能夠主動放棄CPU
新問題:放棄CPU的程序進入阻塞佇列:因等待某訊號量而放棄CPU的等待程序會有“若干”個,需將它們組織管理起來,並在合適的時候喚醒。
訊號量結構資訊發生變化
不僅要有值的處理,還有佇列的處理。
此時形成記錄型資料結構,包括兩部分:
整型變數value(代表資源數目)
程序連結串列L(連結所有等待程序):
程式碼描述:

type  Semaphore=record
	value:integer;
	L:list  of  PCB;
end; 

操作:S.Value,S.L
P、V操作也有所變化
不僅修改資源數,還要處理程序的阻塞、喚醒等操作。先修改資源數,再判斷處理。
P操作wait():

S.value = S.value - 1;
if  S.value < 0  then  block(S,L)

V操作signal():

**S.value = S.value + 1;
if  S.value <= 0 then wakeup(S,L)**

定義訊號量semaphore代表可用資源實體的數量。又叫訊號燈。
當≥0,代表可供併發程序使用的資源實體數
當<0,表示正在等待使用該資源的程序數。
建立一個訊號量必須經過說明,包括
訊號量所代表的意義
賦初值
建立相應的資料結構,以便指向等待使用臨界區的程序。
除初值外,訊號量的值僅能由標準原子操作P、V操作來改變。 PV操作是荷蘭語通過和釋放的意思。
3.訊號量的基本應用


1)實現程序互斥
①實現多個程序互斥
程序i:

P(mutex);
 S.value = S.value - 1;
 if  S.value < 0  then  block(S,L)
 critical section操作共享資源R
 V(mutex);
  S.value = S.value + 1;
 if  S.value <= 0 then wakeup(S,L)

②互斥訊號量注意點
互斥訊號量mutex初值為1;
每個程序中將臨界區程式碼置於P(mutex)和V(mutex)原語之間
必須成對使用P和V原語(在同一程序中),不能次序錯誤、重複或遺漏:
遺漏P原語則不能保證互斥訪問
遺漏V原語則不能在使用臨界資源之後將其釋放(給其他等待的程序);

2)實現程序間的前趨關係(有序)
①前趨關係:
併發執行的程序P1和P2中,分別有程式碼C1和C2,要求C1要在C2開始前完成;為每對前趨關係設定一個同步訊號量S12,並賦初值為0。則只有V操作所在程序獲得cpu時能執行

P1 : C1 ;signal(S);
P2 : wait(S);C2 ;

在這裡插入圖片描述

②控制同步順序的注意點
訊號量值為0的點是限制的關鍵所在;
成對使用P和V原語(在有先後關係的兩個程序中),不能次序錯誤、重複或遺漏,否則同步順序出錯
三、訊號量題目做題一般方法:

  1. 分析問題,找出同步、互斥關係

  2. 根據資源設定訊號量變數

  3. 寫出程式碼過程,並注意P、V操作的位置

  4. 檢查程式碼,模擬機器執行,體驗訊號量的變化和程式執行過程是否正確。
    四、AND型訊號量
    出現原因:一些應用往往需要兩個或多個共享資源,而不是前述的一個資源。程序同時要求的共享資源越多,發生死鎖可能性越大。
    在這裡插入圖片描述
    解決思想:
    一次性分配給程序所需資源,用完一起釋放。Wait操作時對它所有需要的資源都要判斷,有AND條件,故稱“AND同步”、“同時wait”。

    Swait(S1, S2, …, Sn)
    if (S1 >=1 and … and Sn>=1 )then
    for i:=1 to n do
    Si:= Si -1 ;
    endfor
    else
    將程序阻塞在第一個不能滿足資源訊號量的佇列中。
    endif
    Ssignal(S1, S2, …, Sn)
    for i:=1 to n do
    Si:= Si +1 ;
    喚醒所以與si相關的阻塞程序
    endfor
    五、訊號量集
    引入原因:
    每次只能獲得或釋放一個單位的資源,低效;
    某些時候資源分配有下限的限制;
    修改:在大於可分配設定的下界值t前提下,每次可分配d個。

    、訊號量集的一個特例

    只有一個訊號量S的幾種特殊情況:
    Swait(S, d, d),,允許每次申請d個資源,若現有資源數少於d,不予分配。
    Swait(S, 1, 1),蛻化為一般的記錄型訊號量,一次申請一個,至多分配一個(S>1時可計數,或S=1時可控制互斥)。
    Swait(S, 1, 0),當S>=1時,允許多個程序進入某特定區,當S變為0後,阻止任何程序進入特定區,相當於可控開關。並不對S資源的數量產生影響。

重點
熟練掌握整型訊號量,記錄型訊號量
熟練掌握實現訊號量的基本應用——互斥同步