1. 程式人生 > >第二章 2.2 程序的控制

第二章 2.2 程序的控制

程序控制的基本過程:1)程序的建立 2)程序的終止 3)程序的阻塞與喚醒 4)程序的掛起與啟用

系統中執行的程序並不都是孤立的,有的程序執行後,會呼叫其他程序來執行,這樣就組成了程序間的父子關係
  • 可用 “程序圖”描述一個程序的家族關係,該圖實際就是一種有向樹
  • 程序間的父子關係關係著資源的繼承。建立和撤銷程序時,其父、子程序要相應的被影響

程序的建立過程:( 過程不能被打斷 )

  • 申請空白PCB
  • 為新程序分配資源
    - 主要是記憶體資源的處理
  • 初始化程序控制塊
    - 識別符號(包括父程序的)、程式計數器指向程式入口地址,就緒態、優先順序等資訊的填寫。
  • 將新程序插入就緒佇列
原語是由若干指令構成的原子操作過程,作為整體實現功能,不可被打斷
  • OS通過呼叫程序建立原語Creat()建立新程序
  • 其他各控制工作也都是由OS核心以“原語”的方式實現,以保證不被打斷

程序的終止:

  • 引起終止的事件
    • 正常結束
    • 異常結束
      - 記憶體越界錯誤
      - 保護錯(許可權錯,如修改只讀檔案等)
      - 非法指令(不存在的指令,程式異常轉向而把資料當指令)
      - 特權指令錯(使用者態程式試圖執行只有OS可執行的指令)
      - 執行超時、運算錯、i/o故障等
    • 外界干預
      - 操作員或作業系統干預(死鎖時,可人為結束)
      - 父程序請求終止子程序
      - 父程序終止,子孫程序也跟著終止
  • 終止過程:(對上述事件,OS呼叫核心終止原語,執行下列過程)
    - 根據程序標示符,檢索出該程序PCB,讀其狀態
    - 歸還全部資源至其父程序或系統
    - 將該程序PCB從所在佇列或連結串列中移出

程序的阻塞與喚醒:( 引起程序阻塞和喚醒的事件 )

  • 請求系統服務的滿足情況
  • 啟動某種需等待(I/O)操作
  • 合作需要的新資料尚未到達
  • 執行某功能的程序暫時無新工作可做(如傳送資料程序)

阻塞與喚醒的過程:

  • 由程序呼叫阻塞原語阻塞自己,是主動行為
    - 將PCB中的狀態改為阻塞
    - 該PCB加入到阻塞佇列中
    - 轉程序排程,將處理機分配給另一程序
    - 進行程序切換,即根據兩切換程序的PCB,保護與重新設定處理機狀態
  • 阻塞與喚醒原語作用相反,成對使用(阻塞程序等待的事件發生時,有關程序(如放棄該資源的程序)呼叫喚醒原語把等待該事件的程序喚醒)
    - 把阻塞程序從等待該事件的阻塞佇列中移出
    - 將其PCB中的現行狀態改為就緒
    - 將PCB插入到就緒佇列中

程序的掛起與啟用:( 掛起原語將指定程序或阻塞程序掛起 )

  • 檢查被掛起程序的狀態,活動就緒則改為靜止就緒,活動阻塞則改為靜止阻塞
  • 將該PCB複製到記憶體(方便檢查)/外存(對換)指定區域
  • 若掛起的程序是執行態,則需重新進行程序排程
    • 注意:程序只能掛起自己或其子孫程序
啟用原語的執行過程:
  • 若掛起程序在外存上,將其調入記憶體
  • 檢查程序狀態,若處於靜止就緒,則改為活動就緒,若處於靜止阻塞,則改為活動阻塞

2.3 程序同步:

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

臨界資源:一次僅允許一個程序使用的資源

互斥:在作業系統中,當一個程序進入臨界區使用臨界資源時,另一個程序必須等待,直到佔用臨界資源的程序退出臨界區,我們稱程序之間的這種相互制約關係為“互斥”
同步:多個相互合作的程序,在一些關鍵點上可能需要互相等待或互相交換資訊,這種相互制約關係稱為程序同步關係。可理解為“有序”

臨界區:每個程序中訪問臨界資源的 那段程式碼 叫臨界區

同步機制遵循的規則:

  • 空閒讓進:資源使用最基本原則
  • 忙則等待:保證互斥
  • 有限等待:合適時被喚醒防止死等
  • 讓權等待:能主動釋放CPU防止忙等
同步控制的關鍵:不應被打斷(原語,OS核心態執行),不被打斷的進行標誌值的判斷和修改

硬體同步機制:( 進入臨界區往往跟其標誌有關,可將標誌看做一個鎖,“鎖開”進入並關鎖,“鎖關”必須等待,初始時鎖是開啟的 )

  • 關中斷:( 進入鎖測試前關閉中斷,直到完成鎖測試並上鎖後才能開啟中斷。程序在臨界區執行期間,系統不響應中斷,從而不引發排程 )
    - 濫用風險
    - 關中斷時間過長會影響效率,限制CPU交叉執行能力
    - 不適用於多CPU系統
  • Test-and-Set 指令
  • Swap 指令