前言
在我看來,進程之於處理器猶如細胞之於心臟,進程好比體內的細胞,而操作系統那就如整個生理系統。因此,進程對於操作系統來說至關重要。
Ⅰ. 進程
一組元素組成的實體,進程的兩個基本元素是程序代碼(program code, 可能被執行相同程序的其他進程共享)和代碼相關聯的數據集(set of data)。
進程控制塊:
標識符
狀態
優先級
程序計數器
內存指針
上下文數據
I/O狀態信息
記賬信息
Ⅱ. 進程狀態
兩狀態進程模型
非運行態
運行態
進程的創建和終止
導致進程創建的原因:
新的批處理作業
交互登錄
操作系統因爲提供一項服務而創建
由現有的進程派生
導致進程終止的原因
正常完成
超過時限
無可用內存
越界
保護錯誤
算術錯誤
時間超出
I/O失敗
無效指令
特權指令
數據誤用
操作員或操作系統干涉
父進程終止
父進程請求
五狀態模型
新建態
就緒態
運行態
阻塞態
退出態
被掛起的進程
交換:把內存中某個進程的一部分或全部移到磁盤中
就緒態:進程在內存中並可以執行
阻塞態:進程在內存中並等待一個事件
阻塞/掛起態:進程在外存中並等待一個事件
就緒/掛起態:進程在外存中,但是隻要被載入內存就可以執行
比較重要的轉換:
阻塞-->阻塞/掛起
阻塞/掛起-->就緒/掛起
就緒/掛起-->就緒
就緒-->就緒/掛起
其他幾種轉換:
新建-->就緒/掛起及新建-->就緒
阻塞/掛起-->阻塞
運行-->就緒/掛起
各種狀態-->退出
掛起進程特點:
- 進程不能立即執行
- 進程可能是或不是正在等待一個事件。如果是,阻塞條件不依賴於掛起條件,阻塞事件的發生不會使進程立即被執行
- 爲阻止進程執行,可以通過代理把這個進程置於掛起狀態,代理可以是進程自己,也可以是父進程或操作系統
- 除非代理顯式地命令系統進行狀態轉換,否則進程無法從這個狀態中轉移
導致進程掛起的原因:
交換
其他OS原因
交互式用戶請求
定時
父進程請求
Ⅲ. 進程的描述
操作系統的控制結構:
內存表
I/O表
文件表
主進程表
進程控制結構
進程映像是程序、數據、棧和屬性的集合
包括 用戶數據、用戶程序、系統棧和進程控制塊
進程控制塊:
進程標識信息
處理器狀態信息
進程控制信息
Ⅳ. 進程控制
執行模式:用戶態和內核態(系統態或控制態)
模式切換
- 把程序計數器置成中斷處理程序的開始地址
- 從用戶態切換到內核態,使得中斷處理代碼可以包含有特權的指令
進程創建:
- 給新進程分配一個唯一的進程標識符
- 給進程分配空間
- 初始化進程控制塊
- 設置正確的連接
- 創建或擴充其他數據結構
進程切換
進程執行的中斷機制
中斷:當前指令的外部執行,對異步外部事件的反應,包括時鐘中斷、I/O中斷和內存失效
陷阱:與當前指令的執行相關,處理一個錯誤或異常條件
系統調用:顯示請求,調用操作系統函數
進程狀態的變化(與模式切換不同)
- 保存處理器上下文環境,包括程序計數器和其他寄存器
- 更新當前處於運行態進程的進程控制塊
- 將進程的進程控制塊移到相應的隊列
- 選擇另一個進程執行
- 更新所選擇進程的進程控制塊,包括將進程的狀態變爲運行態
- 更新內存管理的數據結構
- 恢復處理器在被選擇的進程最後一次切換出運行態時的上下文環境
Ⅴ. 操作系統的執行
無進程的內核:在所有進程之外執行操作系統內核
在用戶進程執行
基於進程的操作系統