作業系統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
- 如果所有程序可全部被釋放,則處於安全狀態
-
-
-
檢測死鎖和解除
-
死鎖的檢測
-
資源分配圖
- 用圓圈代表程序
- 方框表示一類資源
- 方框中一個點代表一類資源的一個例項
- 從程序到資源表示程序請求一個該類資源
- 從資源指向程序表示有一個資源分配給該程序
-
檢測
- 不可完全簡化即死鎖
- 完全簡化即形成孤立結點
- 可以獲取到想要的資源則移除請求邊和分配邊
-
-
死鎖的解除
- 資源剝奪法
- 撤銷程序法
-
-