進程運行總伴隨着模式切換,模式切換指的就是進程從用戶態切換到內核態,而進程切換則指的是從進程A切換到進程B,進程切換的過程當中一定會發生模式切換,因為進程切換是需要操作系統的調度處理的。
下面,我們具體分析一下模式切換和進程切換發生的時機以及其發生的整個過程。
模式切換和進程切換的時機
進程何時發生模式切換或者進程切換呢?
- 系統調用
- 中斷(外設中斷、時鍾中斷)
- 異常(內存訪問出錯、除法溢出)
是否發生進程切換取決於中斷處理程序,如發生時鍾中斷時會使操作系統檢測進程時間片是否用完,如果用完就會發生進程切換,以及內存訪問出錯可能會造成程序崩潰回收或者將虛擬內存對應的內容調入物理內存中,這時也可能發生進程切換。外設中斷可能會引起准備數據就緒,使得掛起進程變成就緒,調度器再決定繼續運行當前進程還是調度
模式切換的過程
- 棧指針的切換
- 保存CPU寄存器信息
- 切換程序計數器
進程切換的過程
- 保存處理器上下文信息
- 更新處於進程狀態及其其他記賬信息和離開原因
- 將當前進程移動到對應隊列
- 調度另外一個進程執行
- 改變進程運行狀態
- 更新內存管理的信息
- 恢復進程運行的寄存器上下文信息
進程的創建過程
- 為新進程分配唯一的進程描述符
- 為新進程分配內存空間
- 創建並初始化進程控制塊
- 鏈接到合適的進程隊列(就緒)
- 創建或擴充其他信息