在進程間切換
在前面瞭解過,運行在操作系統上的多個進程可以併發執行,而進程的併發就需要進程間進行切換。
操作系統完成進程的切換,問題來了:當一個進程正在運行,操作系統怎麼獲得CPU的控制權
操作系統重獲CPU控制權的方法
1.協作方式:等待系統調用
通過yield系統調用:這個系統調用只是將CPU的控制權交給操作系統。
或者當程序發生異常時,會陷入操作系統,操作系統再次控制CPU。
弊端:如果程序中沒有通過系統調用將控制權交給操作系統,也不會出現問題,操作系統也就沒了作用。
2.非寫作方式:操作系統進行控制
爲了解決協作方式必須顯式的進行系統調用,在硬件(時鐘設備)的幫助下,使用非協作的方式,將CPU的控制權交給操作系統。
時鐘中斷:始終設備可以隔固定的時間產生一次中斷。產生中斷時,當前正在運行的程序暫停執行,改爲執行預先配置的中斷處理程序。中斷處理程序,將CPU控制權交給操作系統
使用中斷需要的技術支持:保存和恢復上下文
當進程進行切換時,爲了保證下次切換回來時,CPU的內部寄存器(上下文)與切換之前一樣,就需要進行保存和恢復上下文。
保存和恢復上下文:假設當前進程爲A,操作系統要切換到進程B,就需要將A的各個寄存器的值保存起來;將B的上下文進行恢復。
首先直接執行協議(時鐘中斷)
操作系統@啓動時(內核模式) | 硬件 | 程序(用戶模式) |
---|---|---|
初始化陷阱表 | ||
記住一以下地址: 系統調用處理程序 始終處理程序 |
||
啓動中斷時鐘 | ||
啓動時鐘 每隔x毫秒中斷CPU |
||
操作系統@運行時(內核模式) | 硬件 | 程序(用戶模式) |
進程A執行中 | ||
時鐘中斷 保存上下文(將寄存器的值保存到內核棧) 轉向內核模式 程序計數器跳到中斷處理程序 |
||
執行中斷處理程序 調用switch()例程(上下文切換) 中斷返回 切換到進程B |
||
恢復B的上下文 轉向用戶模式 程序計數器跳入進程B |
||
進程B執行中 |