別走!帶你了解進程的描述與控制!
進程的引入
由于早期未配置os的系統(tǒng)和單道批處理系統(tǒng)中程序是順序執(zhí)行的,然而這種方式浪費資源、系統(tǒng)資源利用率較低,從而出現了多道批處理系統(tǒng)。內存中可以同時裝入多個程序,使其共享資源、并發(fā)執(zhí)行。為了能使程序并發(fā)執(zhí)行,并且可以對并發(fā)執(zhí)行的程序加以描述和控制,于是引入了“進程”
什么是進程?
進程是程序的一次執(zhí)行;
是一個程序及其數據在處理機上順序執(zhí)行時所發(fā)生的活動;
是具有獨立功能的程序在一個數據集合上運行的過程,是系統(tǒng)進行資源進行分配和調度的一個獨立單位。
進程(又稱為進程實體)由三部分組成:PCB(進程控制塊)、程序段和相關數據段
進程控制塊PCB
PCB作為進程實體的一部分,記錄操作系統(tǒng)所需的用于描述進程的當前情況以及管理進程運行的全部信息,是操作系統(tǒng)中最重要的記錄型數據結構。我們認為,創(chuàng)建進程就是創(chuàng)建一個PCB,銷毀進程也就是銷毀進程的PCB。它的作用是使一個能在多道程序環(huán)境下不能獨立運行的程序稱為一個能獨立運行的基本單位,一個能與其他進程并發(fā)執(zhí)行的進程。
PCB中主要包含以下四方面的信息:
1.進程標識符:用于唯一的標識某一個進程
2.處理機狀態(tài)(又稱處理機上下文):主要由處理機的各種寄存器中的內容組成,當進程被切換時,處理機狀態(tài)信息被保存起來以便重新執(zhí)行時可以繼續(xù)執(zhí)行
寄存器主要包括:
通用寄存器:用于暫存信息(大多數處理機有8~32個)
指令計數器:存放將要訪問的下一條指令的地址
程序狀態(tài)字PSW:是運算器的一部分,分兩類:一種是體現當前指令結果如是否有進位、是否為零,另一種是存放控制信息如允許中斷、跟蹤標志等
用戶棧指針:每個用戶進程都有一個或若干個與之相關的系統(tǒng)棧,用于存放過程和系統(tǒng)調用參數及調用地址,棧指針則是指向該棧的棧頂
3.進程調度信息:存儲當前進程的進程狀態(tài)、進程優(yōu)先級、進程調度所需的其他信息(與調度算法有關的信息如進程等待CPU的時間、已執(zhí)行的時間等)和事件(從執(zhí)行狀態(tài)到阻塞狀態(tài)的原因)
4.進程控制信息:用于進程控制的信息,包括:程序和數據的地址、進程同步和通信機制、資源清單和鏈接指針(該進程所在隊列中的下一個PCB的首地址)
PCB的組織方式:
在一個系統(tǒng)中常有數百乃至上千個PCB,為了對他們加以有效的管理,應使用適當方式將其組織起來,目前常用的有以下三種方式:
1.線性:所有的PCB都組織在一張線性表中,該表的首地址放在內存的一個專用區(qū)域,每次使用都遍歷整張表,適合進程數目較少的操作系統(tǒng)
2.鏈接:將具有相同狀態(tài)進程的PCB分別通過PCB中的鏈接字鏈接成一個隊列,這樣可以形成就緒隊列、阻塞隊列和空白隊列等
3.索引:即系統(tǒng)根據進程狀態(tài)不同,建立幾張索引表
進程控制
進程控制是進程管理中最基本的功能,主要包括創(chuàng)建新進程、終止已完成的進程、將因發(fā)生異常情況而無法繼續(xù)運行的進程置于阻塞狀態(tài)、負責進程運行中的轉換等功能。進程控制一般是由OS內核中的原語來實現的
1.操作系統(tǒng)內核:
OS分為若干層次,通常將一些與硬件緊密相關的模塊(如中斷處理程序等)、各種常用設備的驅動程序以及運行頻率較高的模塊(如時鐘管理、進程調度和許多模塊所公用的一些基本操作),這些都常駐于內存,被稱為OS內核。
其目的在于:
1)便于對這些軟件進行保護,防止遭受其他應用程序的破壞
2)提高OS的運行效率
相應的,系統(tǒng)為保護OS本身或關鍵數據(如PCB等)免遭破壞,也將處理機的執(zhí)行方式分為兩種狀態(tài):系統(tǒng)態(tài)和內核態(tài)
1)系統(tǒng)態(tài):又稱為管態(tài)或內核態(tài)。它具有較高的特權,能執(zhí)行一切命令,訪問所有的寄存器和存儲區(qū);
2)用戶態(tài):又稱為目態(tài)。具有較低的執(zhí)行權,只能執(zhí)行一部分命令或訪問一部分寄存器和存儲區(qū)。一般情況下,應用程序都是用戶態(tài),防止破壞OS
不同的OS內核之間都有不同程度的差異,但都具有以下兩大功能:
1)支撐功能:提供給OS其他眾多模塊所需要的一些基本操作以支撐其工作,三中最基本的支撐功能是:中斷處理、時鐘管理和原語操作
2)資源管理功能:包括進程管理、存儲器管理、設備管理
2.進程的創(chuàng)建:
1)進程的層次結構(UNIX中是樹狀層次,Windows下所有進程沒有層次結構):
OS中允許一個進程創(chuàng)建另一個進程,我們將創(chuàng)建進程的進程叫做父進程,把被創(chuàng)建的進程叫做子進程,子進程還可以創(chuàng)建孫進程,于是就出現了一個進程組。
子進程在被創(chuàng)建后可以繼承父進程所有的資源,例如父進程打開的文件、父繼承所分配到的緩沖區(qū)等。當子進程被撤銷時就將所有從父進程那獲得的資源還回給父進程,然而當父進程被撤銷時,所有子進程也同樣被撤銷,將資源歸還給OS。為表示進程之間的家族關系,PCB中的進程標識符中設置有家族表項。
2)進程圖:
為形象的描述一個進程組而引入進程圖,一個樹結構的圖,根節(jié)點是這個進程家族的祖先
3)引起創(chuàng)建進程的事件:用戶登錄、作業(yè)調度、提供服務、應用請求
4)進程創(chuàng)建:當系統(tǒng)中出現了創(chuàng)建新進程的請求后,OS便調用進程創(chuàng)建原語Creat按以下步驟創(chuàng)建一個新的進程:
①申請空白PCB
②為新進程分配其所需的資源:包括各種物理和邏輯資源,如內存、文件、I/O設備和CPU時間等
③初始化進程控制塊(PCB):初始化標識信息、處理機狀態(tài)信息和處理機控制信息(進程狀態(tài)和優(yōu)先級等)
④如果進程就緒隊列可以接納新的該進程,就將進程加入隊列
3.進程的終止:
1)引起進程終止的條件:
- 正常結束:任何系統(tǒng)中都有一個表示進程已經運行完成的指示,運行到該指令時,就產生一個中斷通知OS該進程已運行完畢
- 異常結束:指進程運行中出現了無法解決的錯誤導致程序無法繼續(xù)執(zhí)行。產生的原因有:
越界錯、保護錯(權限問題或訪問方式非法)、非法指令、特權指令錯、運行超時、等待超時、算術運算錯、I/O故障
- 外界干預:操作員或操作系統(tǒng)干預、父進程請求、父進程終止
2)進程終止的過程:
- 根據終止進程的進程標識符在PCB集合中檢索出要終止的進程,并查看改進程的狀態(tài)
- 若被終止的進程正在執(zhí)行則立即終止該進程,并置調度標志為真,用于指示該進程被終止后應重新進行調度
- 若該進程有子進程或孫進程則全部終止,以免變成不可控制的進程
- 將被終止進程的資源全部歸還給父進程或操作系統(tǒng)
- 將被終止的進程(PCB)從所在隊列中移除
4.進程的阻塞(block)和喚醒(wakeup)
阻塞原語block和喚醒原語wakeup使用時是成對的
1)引起進程阻塞和喚醒的事件
- 向系統(tǒng)請求共享資源失敗
- 等待某種操作的完成
- 新數據尚未到達
- 等待新任務的到達
2)進程阻塞過程
進程在發(fā)生以上情況時變調用阻塞原語(block)將自己阻塞,可見阻塞是一個主動過程。首先將進程狀態(tài)從執(zhí)行改為阻塞狀態(tài)并加入到阻塞隊列;如果系統(tǒng)中設置了原因不同的阻塞隊列,則將該隊列插入相應隊列;最后轉調度程序進行調度,此時分配新的PCB,并按照新的PCB中的處理機狀態(tài)設置CPU環(huán)境
3)進程喚醒過程
當阻塞進程所期待的事件發(fā)生時,則由有關進程(比如提供數據的進程)調用喚醒原語wakeup將該時間喚醒。wakeup的執(zhí)行過程是:將該進程由阻塞隊列移出,將其狀態(tài)改為就緒,再將其加入就緒隊列
5.進程的掛起(suspend)與激活(active)
1)進程的掛起
- 檢查被掛起的進程的狀態(tài)
- 若是活動就緒狀態(tài),便將其改成靜止就緒;若是活動阻塞狀態(tài),便將其改成靜止阻塞
- 為方便用戶或父進程考察該進程的運行情況,而把該進程的PCB復制到某指定的內存區(qū)域
- 若被掛起的進程正在執(zhí)行,則轉向調度程序重新調度
2)進程的激活
- 將進程從外存調入內存,檢查該進程的現行狀態(tài)
- 若是靜止就緒,便將其改為活動就緒;若是靜止阻塞,便將其改為靜止就緒
- 假如采用的是搶占調度策略,則每當有靜止就緒進程被激活而加入就緒隊列時,便檢查是否需要重新調度,即由調度程序將被激活的進程和當前進程兩者優(yōu)先級進行比較
- 若被激活進程優(yōu)先級低,則不必重新調度;若當前進程優(yōu)先級低,則把處理機分配給被激活的進程
