1. 程式人生 > >作業系統 第二章 3 程序同步

作業系統 第二章 3 程序同步

1、程序同步:

  使併發執行的諸程序之間能有效地共享資源相互合作,從而使程式的執行具有可再現性

  多個相互合作的程序,在一些關鍵點上可能需要互相等待或互相交換資訊,這種相互制約關係稱為程序同步關係

  互斥:當一個程序進入臨界區使用臨界資源時,另一個程序必須等待,直到佔用臨界資源的程序退出臨界區,我們稱程序之間的這種相互制約關係為“互斥”。

2、臨界區

每個程序中訪問臨界資源的那段程式碼叫臨界區。 為了正確同步,對臨界區的程式碼要增加控制。

進入區:對欲訪問的臨界資源進行檢。若此刻未被訪問,設正在訪問的標誌 。不被打斷,防止同步中的問題出現。

臨界區:訪問臨界資源的程式碼。

退出區:將正在訪問的標誌恢復為未被訪問的標誌

剩餘區:其餘部分

3、臨界資源

    一次僅允許一個程序使用的資源。

ep

   1+1不等於2的問題:

共享資源x應按臨界資源處理,

一個程序還沒用完前不能讓其他程序使用

4、同步機制原則

  • 空閒讓進:資源使用最基本原則
  • 忙則等待:保證互斥
  • 有限等待:合適時被喚醒防止死等
  • 讓權等待:能主動釋放CPU防止忙等

5、舉個栗子

6、同步控制關鍵

不應被打斷(原語,OS核心態執行),不被打斷的進行標誌值的判斷和修改

7、訊號量機制

7.1  整型訊號量

  * P操作  wait(S):      

While S<=0 do no-op;      

                                     S=S-1;

   * V操作  signal(S):      S=S+1;

s是整型訊號量,只能用於wait、signal,不能s=s+1,但可以賦值。s的值不會小於等於-2.

ep:

初始化s=1;

1)程式1:s=1,執行wait(s),s=1,s不符合while,不執行空操作,往下執行s--,—>  s=0 —> 使用R

2)設此時程式2也申請使用R :s=0,符合while  —> 空操作,不能使用R

3)當程式2時間片耗完,則會轉到程式1  —>執行signal —> s=s+1=1

4)程式1,執行完轉回接著執行程式2,—>執行程式2的while  —> 條件不符合while  —>執行s-- —>使用R  —>執行signal

整型訊號量的wait操作,當s ≤0時,當前程序會佔著CPU不斷測試; 訊號量原語不能被打斷,這個佔有CPU的程序會一直不斷的佔據CPU迴圈下去,陷入忙等。

整型資訊量可以控制同步,符合“有限等待”原則,不符合“讓權等待”原則,效率低,使用使用用記錄型訊號量

 7.2 記錄型訊號量

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)

ep:

初始化s.value=1;

1)程式1:s=1,執行wait(s),s.value=s.value-1=0,不符合if,不執行if,往下執行使用R 

2)設此時程式2也申請使用R :執行wait—> s.value=s.value-1=-1,符合 if條件—> 被block,不能使用R  —>跳回程式1 

3)程式1:執行signal (s.value=s.value+1=0) —>符合if條件  —>  wakeup(s.l)—> 轉回執行程式2

4)  轉回接著執行程式2(因為是if,使用轉回執行程式2,直接執行if下一條指令),—>使用R  —>執行signal(s.value=1,不符if,執行結束)

8、訊號量

只能被訊號量原語操作(wait、signal),在原語內通過判斷,控制是否操作,起程式控制作用,用於程序控制的變數。