進程的活動是通過在CPU上執行一系列程序和對數據進行相應操作的完成來體現的,因此程序和數據是組成進程的實體,爲了反映進程的動態特徵,需要一個數據結構來描述進程本身的特性狀態,調度信息以及對資源的佔有等等。這個數據結構我們稱之爲進程控制塊(PCB)
PCB的內容
PCB主要包含下面幾部分的內容:
- 進程的描述信息,比如進程的名稱,標識符,
- 處理機的狀態信息,當程序中斷是保留此時的信息,以便CPU返回時能從斷點執行
- 進程調度信息,比如阻塞原因,狀態,優先級等等
- 進程控制和資源佔用,同步通信機制,鏈接指針(指向隊列中下一個進程的PCB地址)
PCB的作用:
- PCB是進程實體的一部分,是操作系統中最重要的數據結構
- 由於它的存在,使得多道程序環境下,不能獨立運行的程序成爲一個能獨立運行的基本單位,使得程序可以併發執行
- 系統通過PCB來感知進程的存在。(換句話說,PCB是進程存在的唯一標識)
- PCB應該常駐內存
進程的組成可以用下圖來表示:
而進程之間可以通過PCB中的鏈接指針找到下一個進程,他們彼此之間組成一個鏈隊列:
進程控制
進程控制主要表現在對一個進程進行創建,撤銷以及進程狀態之間進行轉換控制。這些操作都是通過前面的原語操作執行的
進程的創建與撤銷
進程允許創建和控制另一個進程,前者稱爲父進程,後者稱爲子進程,子進程又可以創建孫進程,如此下去進而形成一個進程的家族樹,這樣子進程就可以從父進程那裏繼承所有的資源,當子進程撤銷時,便將從父進程處獲得的所有資源歸還,此外,撤銷父進程,則必須撤銷所有的子進程。(撤銷的過程實際上就是對這棵家族樹進行後序遍歷的過程)
在應用中創建一個子進程的過程如下:
- 申請空白的PCB
- 初始化進程描述信息
- 爲進程分配資源以及地址空間
- 將其插入就緒隊列中
當進程完成後,系統會回收佔用的資源,撤銷進程,而引發進程撤銷的情況有:進程正常結束或者異常結束,外界的干預(比如我們在任務管理器中強制停止某個進程的運行)。
- 查找需要撤銷的進程的PCB
- 如果進程處於運行狀態,終止進程並進行調度
- 終止子孫進程
- 歸還資源
- 將它從所在的隊列中移除
進程的阻塞和喚醒
. 前面我們說過,進程的阻塞是進程的一種主動的行爲,但是沒有解釋爲什麼,現在我們解釋一下,進程執行過程中常常會因爲等待I/O或者某個事件的出現而進入阻塞狀態。當處於阻塞狀態的進程所等待的操作完成或者事件出現時,進程就會從阻塞狀態喚醒而進入就緒狀態。因此進程的阻塞是進程自身的一種主動行爲,是進程自己通過阻塞原語自己阻塞。
阻塞原語如下:
- 停止進程執行
- 進程插入阻塞隊列
- 重新調度
喚醒原語如下:
- 將進程從阻塞隊列卸下
- 插入就緒隊列
- 修改進程在PCB中的狀態
注意,進程的阻塞和喚醒原語是一對功能相反的原語,若某個進程調用了阻塞原語,則必有一個與之對應的喚醒原語。