進程 PCB 進程掛起
7-1 進程定義
OS系統從只能跑一個程序到能跑多個。進程可以描述程序的執行過程。
進程:一個具有一定獨立功能的程序在一個數據集合上的一次動態執行過程。
只有當一個程序被OS加載到內存中,cpu對其執行時,這個過程是動態的,稱為進程。
7-2 進程的組成
包含了正在運行的一個程序的所有狀態信息
? 程序的代碼
? 程序處理的數據
? 要知道現在執行哪條指令,程序計數器中的值指示將運行的指令。
? CPU寄存器會動態變化,一組通用寄存器的當前值,堆,棧等;
? 各種系統資源,內存,外存,網絡
進程與程序的聯系
程序是進程的基礎,代碼控制操作,可以多次執行程序,每次構成不同的進程;進程是程序功能的體現;多次執行——某一個程序對應多個進程;調用關系——某一個進程包括多個程序
多對多的映射關系
進程與程序的區別
程序靜態,有序代碼的集合;進程動態,執行中可以是核心態/用戶態,寫的代碼都是用戶態,但有些操作比如讀寫文件只能由OS完成,
OS代表進程在內核中執行,此時為核心態;
進程是暫時的,是狀態變化的過程,程序永久;
組成不同,進程包括程序,數據(可能變化),進程控制塊(進程狀態信息)
7-3進程的特點
動態性;
並發性(在一段時間內有多個程序在執行,不同於並行,是一個時間點有多個在跑,需多個CPU即多核,進程可以被獨立調度並占用處理機運行):
獨立性,正確性不受影響(通過OS給不同的進程分配不同頁表);
制約性,因訪問共享數據/資源或進程間同步產生制約,要同步互斥;
描述進程的數據結構:進程控制塊,PROCESS control block PCB
OS給每個進程都維護了一個PCB,保存與之有關的所有狀態信息。
7-4 進程控制結構
PCB進程控制塊:進程存在的唯一標識,操作系統管理控制進程運行所用的信息集合,描述進程的基本情況和運行變化的過程。
用PCB的生成,回收,組織管理來完成進程的創建、終止和管理。
PCB含有三大類信息:
(1) 進程標識,哪個程序在執行,執行了幾次(本進程的標識),產生者標識(父進程標識),用戶標識
(2) 處理機狀態信息保存區,主要就是寄存器,保存進程的運行現場信息:
用戶可見寄存器,程序使用的數據,地址控制和狀態寄存器,程序計數器pc,程序狀態字PSW棧指針,過程調用/系統調用/中斷處理和返回時需要用到
(3) 進程控制信息
調度和狀態信息,用於操作系統調度進程並占用處理機使用。運行狀態?等待?進程當前的執行現狀
進程間通信信息,各種標識、信號、信件等
進程本身的存儲管理信息,即指向本進程映像存儲空間的數據結構,內存信息,占了多少?要不要回收?
進程所用資源,打開使用的系統資源,如文件
有關數據結構連接信息,父進程,子進程,構成一個鏈,進程可以連接到一個進程隊列,或鏈接到其他進程的PCB
PCB的組織方式:
鏈表(便於插刪,用於通用的OS):同一狀態的進程PCB為一鏈表,多個狀態對應更多個不同的鏈表,就緒鏈表,阻塞鏈表
索引表(數組,不利於插刪,使用於固定數目的進程,相對創建更快捷):同一狀態的歸入一個index表(每一個index指向PCB),就緒/阻塞索引表
7-5 進程狀態
進程生命期管理:創建—>運行—>等待—>喚醒—>結束
引起進程創建的3個主要時間:系統初始化時,創建INIT進程,INIT再負責創建其他進程;用戶請求創建一個NEW PROCESS,正在運行的進程執行了創建進程的系統調用。
運行:內核選擇一個就緒的進程,讓它占用處理機(cpu)並執行
調度算法—-如何選擇?
等待(阻塞)的三種情況:請求並等待系統服務,無法馬上完成;啟動某種操作(和其他進程協調工作),無法馬上完成;需要的數據沒有到達
進程自己觸發阻塞,因為只有自己才知道何時需要等待某事件
喚醒的情況:需要的資源可被滿足,等待的事件到達,都意味著可將該進程的PCB插入到就緒隊列
因為自身沒有占用cpu執行,所以只能被OS或其他進程喚醒
結束的情形:自願(正常退出,錯誤退出),強制性的(致命錯誤,被其他進程所殺)
7-6 進程狀態變化模型
結束前的三種狀態:運行態(running),就緒態(ready 獲得除CPU即處理機之外的一切資源,一旦得到CPU就可以運行),等待狀態(阻塞態,blocked)
進程狀態變化模型
創建態(new) 已創建還沒就緒
結束態(exit) 正在從OS中消失,PCB還存在
running to ready:分時-?時間片到了,就切到另一個程序,這個轉變為ready,由OS結合時鐘完成。
new->ready:很快,只是生成pcb
進程掛起模型
7-7 進程掛起
不同於進程阻塞。掛起時沒有占用該內存空間,而是映像在磁盤上。類似虛存中,有的程序段被放到了硬盤上。
Suspend:把一個進程從內存轉到外存。
可以合理、充分地利用系統資源。
兩種掛起狀態:
? 阻塞掛起,進程在外存等事件blocked suspend
? 就緒掛起,進程在外存,但進了內存就能執行ready suspend
狀態轉換:
在內存中被掛起:
blocked to blocked suspend: 沒有進程ready或ready進程要求更多內存時掛起,以提交新進程或運行就緒進程
ready to ready suspend: 多個就緒進程掛優先級低的,有高優先級阻塞(OS認為會很快就緒)進程和低優先ready進程時,掛低優先的就緒進程
running to ready blocked: 搶先式分時系統,空間不夠或高優先級阻塞掛起進程進入就緒掛起時,正在運行的進程被就緒掛起
外存中:
blocked suspend to ready suspend: 相關事件出現時,轉變為ready suspend但還在硬盤上。
解掛/激活 activate:外存到內存,需要運行該進程時
ready suspend to ready: 沒有就緒進程或掛起就緒優先進程優先級高於當前就緒進程時
blocked suspend to blocked:當一個進程釋放了足夠內存時,OS把高優先級阻塞掛起(認為很快出現等待的事件)轉換為阻塞進程
OS怎麽通過PCB和定義的進程狀態來管理?
以進程為基本結構的OS,底層為CPU調度程序(執行哪個?中斷處理等),上面是各種進程。
OS要維護一組狀態隊列(重要的數據結構),表示系統中所有進程的當前狀態。
就緒隊列,各種類型的阻塞隊列,掛起隊列
PCB根據狀態排入相應隊列,狀態變化加入和脫離隊列
7-8進程的上下文切換 context switch
進程共享CPU,停止當前進程,並調度其他進程的切換叫做上下文切換。
必須切換前存儲上下文,切換後恢復讓進程不知道被暫停過,必須快速(上下文切換頻繁),因為有時間開銷所以也要盡量避免
要存儲哪些context?
寄存器(pc,sp,…),CPU狀態等
進程執行中要關註寄存器,PC(進程執行到了什麽地方),棧指針(調用關系,相應的局部變量位置)等。
這些信息要被保存到PCB中,進程掛起時要把PCB的這些值重置,恢復到寄存器中去,使接下來進程可以繼續在CPU上執行。
上下文切換的開銷越小越好,且所有信息都與硬件緊密相連,所以OS中實現是用匯編代碼。
需要知道哪些進程能切換?
PC為活躍進程準備了進程控制塊PCB,OS將不同PCB放在不同的狀態隊列鏈表裏便於選擇
? 就緒隊列
? 等待I/O隊列—-分為每個設備的隊列
? 僵屍隊列
僵屍狀態:
就是調用了EXIT但還沒有wait返回的時候。將死,還沒死。無法正常工作,只是等待被父進程回收。
執行EXEC()時,進程可以處於不同的狀態。首先是runnig, 然後加載、運行,加載時間長要等running->blocked。
進程 PCB 進程掛起