1. 程式人生 > 實用技巧 >作業系統02-程序管理

作業系統02-程序管理

作業系統

第二章:程序管理

程序與執行緒

  • 程序的基本概念

    • 功能: 為了描述併發執行程式的動態特性,引進的新的概念

    • 程式的順序執行及其特徵

      • 單批道處理系統的執行方式,按照前趨圖的順序執行
      • 順序性、封閉性、可再現性
    • 程式的併發執行及其特徵

      • 指若干個程式同時在系統中執行,在執行時間上是重疊的

      • 重疊是指執行程式的長度有重疊

      • 特徵

        • 間斷性

        • 失去封閉性:共享性

        • 不可再現性

    • 程序的特徵與狀態

      • 特徵

        • 結構性:程序實體由程式段、資料段及程序控制塊組成,又稱為程序映像

        • 動態性

          • 資料
          • 程式碼
          • 控制資訊
        • 併發性

          • 多個程序實體同存於記憶體中中
        • 獨立性

          • 地址空間相互獨立
        • 非同步性

          • 互相制約
      • 程序實體

        • 程式段+資料段+PCB
        • 執行緒是作業系統進行執行排程的最小單位
        • 包含在程序之中,是程序中實際執行工作的單位
        • 一個程序可以併發多個執行緒,每個執行緒執行不同的任務

  • 狀態

    - 基本狀態
      
      - 就緒:程序已獲得除處理機以外的所有資源,一旦分配了處理機就可以立即執行,此時程序所處的狀態為就緒狀態
      
      - 執行:程序在處理機上執行
      
      - 阻塞:等待資源
      
    - 圖解
    - 掛起
      
    	- 優先順序的引入
      
    		- 把程序從記憶體轉到外存
      
    	- 優點
      
    		- 提高處理機的效率
    		- 為執行的程序提供足夠的記憶體
    		- 用於除錯
      
    	- 請求種類
      
    		- 終端使用者的請求
    		- 父程序請求
    		- 負荷調劑的需要
    		- 作業系統的需要
      
    	- 種類
      
    		- 就緒掛起
    		- 阻塞掛起
    		- 執行到就緒掛起
      
    			- 搶佔式
    - 啟用
      
    	- 程序從外存轉到記憶體
    	- 種類
      
    		- 就緒啟用
    		- 阻塞啟用
    - 收容
      
    	- 收容一個新程序
      
    		- 進入就緒狀態/就緒掛起
    - 圖解
    

    • 程序控制塊

      • 用於描述和管理程序的資料結構,是程序實體的一部分,程序和PCB是一一對應的,可以參照UNIX中的程序控制塊

      • 程序標識資訊

          	- 程序識別符號、程序名、使用者識別符號、父程序識別符號和子程序識別符號
        
      • 處理機狀態資訊

          	- 用來儲存現場
        
          		- 通用暫存器、指令計數器、程式狀態字(含執行結果狀態、中斷遮蔽碼)、棧指標(每個程序都有與之相關的棧,儲存過程和系統呼叫的地址和引數)
        
      • 程序排程和狀態資訊

          	- 程序狀態、程序優先順序、程序排程的其他資訊、等待事件(程序處於等待狀態的原因)
        
      • 程序控制資訊

          	- 程式和資料地址、程序同步及通訊機制、資源清單、連結指標(處於同一狀態的程序組成一個佇列),連結指標指向隊首
        
      • 組織方式

          	- 連結方式
        
          		- 將處於同一狀態的所有程序控制塊連結在一起,這樣的資料結構稱為程序佇列
        
        		- 索引方式
        
          		- 系統根據程序狀態建立幾張索引表,登記具有相應狀態的PCB地址
        
  • 執行緒

    • 引入目的

      • 減少程式併發執行所付出的時空開銷,使作業系統具有更好的併發性
      • 提高資源的利用率 和系統吞吐量 增加併發程度
    • 執行緒的基本概念

      • 是程序內的一個執行單元

      • 資源分配的實體還是程序

      • 執行緒是排程和分派的基本單位

      • 將程序的兩個屬性分開

      • 屬性

        • 輕型實體

        • 獨立排程和分派的基本單位

        • 可併發執行

        • 共享程序資源

        • 狀態

          • 執行
          • 阻塞
          • 就緒
      • 執行緒控制塊

        • 暫存器
        • 堆疊
        • 執行緒執行狀態
        • 優先順序
        • 執行緒專有儲存器
        • 訊號遮蔽
    • 執行緒和程序關係

      • 一個執行緒必須有一個父程序
      • 一個程序可以有多個執行緒
    • 執行緒間的同步與通訊

      • 互斥鎖
      • 條件變數
      • 訊號量機制
    • 執行緒的實現方式

      • 核心支援執行緒

      • 使用者級執行緒

      • 兩者結合的辦法

      • 使用者級執行緒和核心支援執行緒比較

        • 執行緒的排程和切換速度
        • 系統呼叫
        • 執行緒執行時間
        • 適應性
    • 執行緒的實現

      • 核心支援執行緒

      • 使用者級執行緒

        • 執行在中間系統之上

          • 執行時系統
          • 核心控制執行緒
  • 可以和核心支援執行緒相互關聯

  • 程序通訊

    • 程序通訊的型別

      • 共享儲存器系統

        • 共享資料結構

        • 共享儲存區

          • 建立
          • 附接
          • 斷接
      • 管道通訊系統

        • 互斥
        • 同步
        • 確定對方是否存在
      • 訊息傳遞系統

        • 直接通訊方式
        • 間接通訊方式
      • 客戶機-伺服器系統

        • 套接字

          • 基於檔案型
          • 基於網路型
        • 遠端過程呼叫

        • 遠端方法呼叫

    • 訊息傳遞通訊的實現方式

      • 直接訊息傳遞系統

        • 傳送原語

        • 接受原語

        • 過程

          • 在自己的工作區設定一個傳送區
          • 適用傳送原語傳送給接收程序,將其掛在接收程序的訊息佇列上
          • 呼叫接收原語從自己的訊息佇列中摘下第一個訊息,將內容複製到自己的訊息接收區
        • 訊息緩衝區

        • 增加的資料結構

        • 對稱定址方式

      • 信箱通訊

        • 私用郵箱

          • 使用者程序建立、其餘程序只可傳送
        • 公用郵箱

          • 作業系統建立
        • 共享郵箱

          • 使用者建立,可共享
        • 非對稱定址方式

        • 結構

          • 信箱頭
          • 信箱體
        • 信箱原語

          • 建立和撤銷
          • 訊息的傳送和接收
      • 管道通訊

        • 以管道方式
  • 程序控制

    • 前置概念

      • 原語

        • 原子操作,有若干條機器指令構成,用以完成特定的功能,是不可分割的
    • 程序的建立

      • 引起事件

        • 使用者登入、
          作業排程、
          OS服務、
          應用需求
      • 建立原語

        • 建立一個空閒PCB結構
        • 為新程序分配資源
        • 初始化新的PCB結構
        • 將PCB結構插入相應的佇列
      • 程序圖

        • 描述程序家族關係的一棵有向樹
    • 程序的終止

      • 引起事件

        • 中斷-正常結束
        • 異常結束
        • 外界干預:父程序可以請求終止子程序
      • 終止原語

        • 根據程序識別符號,找到相應的PCB,讀取狀態
        • 如果正處於進行狀態,則停止程序的執行
        • 如果有子程序,終止子程序
        • 歸還資源到父程序或者系統
        • 撤銷PCB
    • 程序的阻塞與喚醒

      • 引起事件

        • 造成阻塞

          • 請求系統服務(如請求分配資源但沒有資源分配)
          • 啟動某種操作(程序必須在某種操作執行之後才能繼續執行)
          • 新資料未到達
          • 無新工作可做
        • 在滿足條件之後就會喚醒

      • 阻塞原語

        • 根據當前執行程序的識別符號找到PCB
        • 停止執行程序,改狀態為阻塞
        • 儲存程序的現場到PCB結構
        • 將該程序PCB插入等待佇列
        • 轉程序排程程式
        • block 原語
      • 喚醒原語

        • 從等待佇列中取出相應程序
        • 改程式狀態為就緒,將程序插入就緒佇列
        • 轉程序排程或返回
        • wakeup原語
    • 程序的掛起與啟用

      • 掛起引起事件

        • 使用者程序請求將自己掛起
        • 父程序請求將自己的某個子程序掛起
      • 掛起原語

        • 根據被掛起程序的識別符號,找到PCB

        • 取PCB的狀態

          • 執行狀態
          • 就緒狀態
          • 等待狀態
        • suspend 原語

      • 啟用原語

        • 系統將外存上被掛起的程序換入記憶體
        • 將程序狀態由掛起改為啟用後的狀態
        • 有需要轉程序排程
        • active原語

處理機排程

  • 處理機排程的層次

    • 高階排程

      • 決定後備佇列中調入主存的作業
      • 多少作業:取決於多道程式度
      • 接納哪些作業:取決於排程演算法
    • 中級排程

      • 快閃記憶體中把暫時不執行的換出外存

      • 決定那些程序被允許參與競爭CPU

      • 處於掛起狀態

      • 引入原因

        • 換出

          • 緊縮:是空閒區間和佔用區間分開到兩端
          • 記憶體空間緊張
          • 就緒佇列程序太多
          • 等待I/O可能要一段時間
          • 便於緊縮
        • 換入

          • 記憶體中有足夠的空間
          • 外存中程序的優先順序高於記憶體中程序
    • 低階排程

      • 程序排程

        • 方式

          • 搶佔式

            • 原則

              • 優先權
              • 短作業優先
              • 時間片
          • 非搶佔式

            • 簡單、系統開銷小、無法處理緊急情況
      • 就緒佇列中分配處理機

    • 作業狀態

      • 提交狀態

        • 使用者作業由輸入裝置向系統外存輸入時作業所處的狀態
      • 後備狀態

      • 執行狀態

      • 完成狀態

    • 只有低階排程是必須的

  • 排程佇列模型和排程準則

    • 排程佇列模型

      • 一級
      • 二級
      • 三級
    • 選擇排程方式和排程演算法的若干準則

      • 面向系統的準則

        • 系統吞吐量
        • CPU利用率
        • 各類資源的平衡利用
      • 面向使用者的準則

        • 週轉時間短

          • 等待時間和執行時間之和
          • 帶權週轉時間:和實際時間的比值
        • 相應時間快

        • 截止時間的保證

      • 演算法的效能準則

        • 易於實現
        • 執行開銷比
        • 穩定性
  • 排程演算法

    • 先來先服務和短作業(程序)優先排程演算法

      • 短作業優先是當前時刻的短時間
      • 多個作業同時到達時,短作業優先排程演算法的平均週轉時間最小
    • 最短剩餘時間優先排程演算法

      • 即當一個新程序進入就緒佇列時,若其需要的執行時間比當前執行程序的剩餘時間短,則它將搶佔CPU

      • 缺點

        • 對長作業不利 並且長作業容易出現飢餓現象
        • 未考慮緊迫程度
        • 只是根據使用者的估計執行時間 容易造假
    • 高優先權優先排程演算法

      • 搶佔式

      • 非搶佔式

      • 優先權

        • 靜態優先權 開銷小但是不準確
        • 動態優先權
    • 最高相應比優先排程演算法

      • 響應比 = (等待時間+要求服務時間 )/ 要求服務時間
    • 基於時間片的輪轉排程演算法

      • 最開始的在隊首,執行完時間片到隊尾

      • 時間片過大 太大退化為先來先服務,會讓隊尾的程序等待過久

      • 時間片過小 程序切換過於頻繁,系統的開銷過大

      • 多級反饋佇列排程演算法

        • 設定多個佇列
        • 優先順序越高,執行時間越短
        • 在第一個佇列執行完以後再執行第二個佇列
        • 執行過的程序放到最後一個佇列的末尾
  • 實時排程

    • 實現實時排程的基本條件

      • 提供必要的資訊
      • 系統處理能力強
      • 採用搶佔式排程機制
      • 具有快速切換機制
    • 實時排程演算法的分類

      • 非搶佔式排程演算法

        • 非搶佔式輪狀排程演算法
        • 非搶佔式優先排程演算法
      • 搶佔式排程演算法

        • 基於時鐘中斷的搶佔式優先權排程演算法
        • 立即搶佔的優先權排程演算法
    • 常用的幾種實時排程演算法

      • 最早截止時間優先

      • 最低鬆弛度優先

        • 鬆弛度
        • 搶佔式的

程序同步

  • 程序同步的基本概念

    • 程序制約關係

      • 相互協作關係
      • 資源共享關係
    • 臨界資源與互斥

      • 臨界資源

        • 一段時間內僅允許一個程序使用的資源
      • 互斥

      • 臨界區

        • 訪問臨界資源的那段程式碼稱為臨界區

          • entry section 進入區
          • critical section 臨界區
          • exit section 退出區
      • 同類臨界區

        • 所有與同一臨界資源相關聯的臨界區
    • 互斥與同步

      • 互斥

        • 解決程序間競爭關係的手段
      • 同步

        • 解決程序間協作關係的手段
    • 同步原則

      • 空閒讓進:資源無佔用,允許使用
      • 忙則等待:資源有佔用,請求程序等待
      • 有限等待:保證有限等待時間能夠使用資源
      • 讓權等待:等待時,程序需要讓出CPU
    • 臨界區互斥

      • 基本方法

        • 軟體方法

          • 單標誌法

            • 違背 空閒讓進
          • 雙標誌先檢查法

            • 違背 忙則等待
          • 雙標誌法後檢查

            • 會導致 飢餓
          • 皮特森演算法

            • 單標誌法和雙標誌後檢查法的結合
        • 硬體方法

          • 中斷遮蔽法

            • 進區關中斷
            • 出區開中斷
          • 硬體指令法

            • 設定立原子操作指令

              • 測試與設定指令TS test and set
              • swap 指令
        • 訊號量

          • 一種有效的程序同步機制

          • 整型訊號量

            • Wait(S) P操作 訊號量減一(僅僅對訊號量大於0有效 小於0的時候不做操作)

            • signal(S) V操作 訊號量加一

            • 缺點

              • 在訊號量小於等於0的時候會不停的測試
              • 沒有做到“讓權等待的原則”
          • 記錄型訊號量

            • 增加記錄資源數目的整型變數value值
            • 增加一個程序連結串列指標L 連結所有等待程序
            • signal和wait原語操作
            • 記錄型資料結構包含value值和連結串列L
          • AND型訊號量集

            • 全部分配或全不分配
            • 適合同時需要多種資源,且每種佔用一個時的情況
          • 訊號量集

            • 和AND型訊號量集一樣

            • 加判斷條件後全分配或全不分配

            • 適合於同時需要多種資源,且每種佔用的數目不同,且可分配的資源還存在臨界值

            • 特殊應用

              • Swait(S,d,d)。此時在訊號量集中只有一個訊號量S,但允許它每次申請d個資源,當現有資源數少於d時,不予分配。
              • Swait(S,1,1)。此時的訊號量集已蛻化為一般的記錄型訊號量(S>1時)或互斥訊號量(S=1時)。
              • Swait(S,1,0)。這是一種很特殊且很有用的訊號量操作。當S≥1時,允許多個程序進入某特定區;當S變為0後,將阻止任何程序進入特定區。換言之,它相當於一個可控開關。
  • 經典程序的同步問題

    • 生產者--消費者問題

      • 用記錄型訊號量解決

        • 用empty和full分別表示空緩衝區的數量和滿緩衝區的數量

          • empty初值為n
          • full初值為0
        • 臨界資源mutex 初值為1

        • 過程

          • 生產一個產品:

            • 看到先要求一個空緩衝區然後要求臨界資源
            • 生產完成以後,釋放臨界資源,生成一個滿緩衝區
          • 取出產品:

            • 需要一個滿緩衝區和臨界資源
            • 取出後,釋放臨界資源並生成一個空緩衝區
      • 用AND訊號量解決

        • 可以將2步wait和signal合成一個,可以避免出現wait順序顛倒的情況
    • 哲學家進餐問題

      • 演算法描述

      • 存在問題

        • 當五個哲學家同時感覺飢餓,並同時拿起自己左邊的筷子,則會出現死鎖
      • 嘗試解決

        • 至多允許四個哲學家同時進餐 還是有可能存在死鎖的問題
        • 同時使用左右筷子 採用AND訊號量解決問題
        • 奇數號哲學家先拿左邊筷子再拿右邊筷子,偶數號哲學家相反
    • 讀者--寫者問題

      • 共享整型變數 readcount 記錄當前正在讀資料的讀者數量

        • 初值為0
      • wmutex 用於寫者與寫者、寫者與讀者之間的互斥

        • 初值為1
      • rmutex 用於讀者互斥地訪問共享變數readcount

        • 初值為1
      • 演算法描述

        • 讀者描述
        • 寫者描述
      • 使用訊號量集解決

        • 至多允許RN個讀者同時讀
        • 引入訊號量L 初值為RN
        • 訊號量mx 初值為1
  • 訊號量的應用

    • 實現互斥

      • wait(mutex)
      • 臨界區
      • signal(mutex)
    • 實現前趨關係

      • S1
      • signal(S)
      • wait(S)
      • S2
  • 管程機制

    • 管程

      • 管程名字
      • 區域性於管程的共享資料結構(變數)
      • 對共享資料結構進行的一組操作(函式)
      • 對區域性於管程的資料設定初始值的語句
    • 基本特性

      • 共享變數僅能由管程內定義函式訪問
      • 一個程序只有通過呼叫管程內函式才能訪問共享變數
      • 管程互斥進入
      • 由編譯程式在編譯時自動新增上
    • 入口等待佇列

    • 緊急等待佇列

      • x.wait
      • x.signal
    • 條件變數

      • 說明

        • 同步原語

          • x.wait
          • x.signal
        • condition x

      • 作用

    • 生產者、消費者

程序死鎖

  • 死鎖

    • 多個程序因競爭系統資源而造成的一種僵局,如果沒有外力作用,這些程序永遠不能向前推進

      • 死鎖: 缺資源不缺CPU
      • 飢 餓 : 缺資源 不缺CPU

  • 產生死鎖的原因

    • 競爭資源

      • 可剝奪資源與不可剝奪
      • 永久性和臨時性
      • 不可剝奪、永久性和臨時性資源可造成死鎖
    • 程序推進順序不當

    • 產生死鎖的必要條件

      • 互斥條件
      • 請求和保持條件
      • 不可剝奪條件
      • 環路等待條件
  • 處理死鎖的基本方法

    • 預防死鎖

      • 預防死鎖的方法

        • 破壞 互斥條件

          • 是裝置本身固有的屬性
          • 不可修改
        • 破壞“不可剝奪”

          • 已有該資源的程序要求釋放資源
          • 只可用於狀態可以儲存和恢復的資源
        • 破壞 請求和保持條件

          • 靜態資源分配法
          • 一次分配所用的全部資源
          • 資源利用率低,程序延遲
        • 破壞“環路等待”

          • 有序資源分配

            • 程序申請一個資源的時候,必須釋放其佔有序號大於該資源的其他資源
          • 資源利用率提高(還是存在浪費)

          • 限制了使用者程式設計

          • 限制了裝置的增加

    • 避免死鎖

      • 系統安全狀態

        • 只要系統始終都處於安全狀態便可避免死鎖的發生
      • 利用銀行家演算法避免死鎖

          1. 通過對資源分配進行分析
          1. 如果有任何一個程序的資源需求滿足現有資源儲備量,則可分配,並釋放佔用的資源 重複1
        • 如果所有程序可全部被釋放,則處於安全狀態
    • 檢測死鎖和解除

      • 死鎖的檢測

        • 資源分配圖

          • 用圓圈代表程序
          • 方框表示一類資源
          • 方框中一個點代表一類資源的一個例項
          • 從程序到資源表示程序請求一個該類資源
          • 從資源指向程序表示有一個資源分配給該程序
        • 檢測

          • 不可完全簡化即死鎖
          • 完全簡化即形成孤立結點
          • 可以獲取到想要的資源則移除請求邊和分配邊
      • 死鎖的解除

        • 資源剝奪法
        • 撤銷程序法