學習資源: 操作系統_清華大學(向勇、陳渝)
進程管理
- 進程(PROCESS)描述
- 進程狀態(State)
- 線程(THREAD)
- 進程間通信(INTER-PROCESS COMMUNICATION)
- 進程互斥與同步
- 死鎖(DEADLOCK)
一、進程描述
1.1 進程定義
why processes ? (一個程序可能同時跑很多份)
進程: 一個具有一定獨立功能的程序在一個數據集合上的一次動態執行過程。
1.2 進程的組成
一個進程應該包括:
- 程序的代碼
- 程序處理的數據
- 程序計數器中的值,指示下一條將運行的指令
- 一組通用的寄存器的當前值,堆、棧
- 一組系統資源(文件系統、網絡系統等)
總之,進程包含了正在運行的一個程序的所有狀態信息。
程序與進程的聯繫
- 程序是產生進程的基礎
- 程序的每次運行構成不同的進程
- 進程是程序功能的體現
- 通過多次執行,一個程序可應對多個進程;通過調用關係,一個進程可包括多個程序。
進程與程序的區別
- 進程是動態的,程序是靜態的: 程序是有序代碼的集合;進程是程序的執行,進程有核心態/用戶態
- 進程是暫時的,程序是永久的: 進程是一個狀態變化的過程,程序可長久保存。
- 進程與程序的組成不同: 進程的組成包括程序、數據和進程控制塊(即進程狀態信息)
CPU從一個進程(做蛋糕)切換到另一進程(醫療救護)。
1.3 進程的特點
- 動態性: 可動態地創建、結束進程
- 併發性: 進程可以被獨立調度並佔用處理機運行
- 獨立性: 不同進程的工作互不影響。(頁表是保證獨立性的機制)
- 制約性: 因訪問共享數據/資源或進程間同步而產生制約
如果你要設計一個OS,怎麼樣來實現其中的進程管理機制?
程序 = 算法 + 數據結構
描述進程的數據結構: 進程控制塊 (Process Control Block, PCB)
操作系統爲每個進程都維護了一個PCB, 用來保存與該進程有關的各種狀態信息。
1.4 進程控制結構
進程控制塊: 操作系統管理控制進程運行所用的信息集合。
操作系統用PCB來描述進程的基本情況以及運行變化的情況,PCB是進程存在的唯一標誌。
使用進程控制塊,可以完成:
- 進程的創建: 爲該進程生成一個PCB
- 進程的回收: 回收它的PCB
- 進程的組織管理: 通過對PCB的組織管理來實現
PCB含有以下三大類信息
- 進程標識信息。如本進程的標識,本進程的生產者標識(父進程標識);用戶標識
- 處理機狀態信息保存區, 包含進程的運行現場信息
- 用戶可見寄存器, 用戶程序可以使用的數據、地址等寄存器
- 控制和狀態寄存器,如程序計數器(PC),程序狀態字(PSW)
- 棧指針,過程調用/系統調用/中斷處理和返回時需要用到它
- 進程控制信息
- 調度和狀態信息, 用於操作系統調度進程並佔用處理機使用
- 進程間通信信息,爲支持進程間的與通信相關的各種標識、信號、信件等,這些信息存在接收方的進程控制塊中。
- 存儲管理信息,包含有指向本進程映像存儲空間的數據結構
- 進程所用資源,說明由進程打開、使用的系統資源,如打開的文件等
- 有關數據結構連接信息,進程可以連接到一個進程隊列中,或者連接到相關的其他進程的PCB。
PCB的組織方式
鏈表: 同一狀態的進程其PCB成一鏈表,各個狀態對應多個不同的鏈表。各狀態的進程形成不同的鏈表:就緒鏈表,阻塞鏈表。(動態插入、刪除)
索引表
1.5 進程的生命期管理
-
進程創建
引起進程創建的3個主要事件:
- 系統初始化
- 用戶請求創建一個新進程
- 正在運行的進程執行了創建進程的系統調用
-
進程運行
內核選擇一個就緒的進程,讓它佔用處理機並執行。(調度算法)
-
進程等待
在以下情況下,進程等待(阻塞):
- 請求並等待系統服務,無法馬上完成
- 啓動某種操作,無法馬上完成
- 需要的數據沒有到達
進程只能自己阻塞自己,因爲只有進程自身才能知道何時需要等待某種事件的發生。
-
進程喚醒
喚醒進程的原因:
- 被阻塞進程需要的資源可被滿足
- 被阻塞進程等待的事件到達
- 將該進程的PCB插入到就緒隊列
進程只能被的進程或操作系統喚醒
-
進程結束
在以下四種情形下,進程結束:
- 正常退出(自願的)
- 錯誤退出(自願的)
- 致命錯誤(強制性的)
- 被其他進程所殺(強制性的)
1.6 進程狀態變化模型
進程在生命結束前處於且僅處於三種基本狀態之一:
- 運行狀態(Runing): 當一個進程正在處理機上運行時
- 就緒狀態(Ready): 一個進程獲得了除處理機之外的一切所需資源,一旦得到處理機即可運行。
- 等待狀態(又稱阻塞狀態Blocked): 一個進程正在等待某一事件而暫停運行時。如等待某資源,等待輸入/輸出完成。
三狀態變化圖
五狀態變化圖
1.7 進程掛起模型
進程在掛起狀態時,意味着進程沒有佔用內存空間,處在掛起狀態的進程映像在磁盤上。
掛起狀態
- 阻塞掛起狀態(Blocked-suspend): 進程在外存並等待某事件的發生;
- 就緒掛起狀態(Ready-suspend): 進程在外存,但只要進入內存,即可運行。
與掛起(把一個進程從內存轉到外存)相關的狀態轉換,可能有以下幾種情況:
- 阻塞到阻塞掛起: 沒有進程處於就緒狀態或就緒進程要求更多內存資源,會進行這種轉換,以提交新進程或運行就緒進程。
- 就緒到就緒掛起: 當有高優先級阻塞(系統認爲會很快就緒的)進程和低優先級就緒進程時,系統會選擇掛起低優先級就緒進程。
- 運行到就緒掛起: 對搶先式分時系統,當有高優先級阻塞掛起進程因出現而進入就緒掛起時,系統可能會把運行進程轉到就緒掛起狀態。
在外存時的狀態轉換
- 阻塞掛起到就緒掛起: 當有阻塞掛起進程因相關事件出現時,系統會把阻塞掛起進程轉換爲就緒掛起進程。
把一個進程從外存轉到內存,可能有以下幾種情況:
- 就緒掛起到就緒: 沒有就緒進程或掛起就緒進程優先級高於就緒進程時,會進行這種轉換
- 阻塞掛起到阻塞: 當一個進程釋放內存時,系統會把一個高優先級阻塞掛起(系統認爲會很快出現所等待的事件)進程轉換爲阻塞進程。
OS怎麼通過PCB和定義的進程狀態來管理PCB,幫助完成進程的調度過程呢?
狀態隊列
- 由操作系統來維護一組隊列,用來表示系統當中所有進程的當前狀態
- 不同的狀態分別用不同的隊列來表示(就緒隊列、各種類型的阻塞隊列)
- 每個進程的PCB都根據它的狀態加入到響應的隊列當中,當一個進程的狀態發生變化時,它的PCB從一個狀態隊列中脫離出來,加入到另外一個隊列。
上述主要介紹了進程描述和進程狀態。