簡介
讓進程來占用處理器,實質上是把某個進程存放在私有堆疊中暫存器的數據(前一次本進程被中止時的中間數據)再恢復到處理器的暫存器中去,並把待運行進程的斷點送入處理器的程式指針PC,於是待運行進程就開始被處理器運行了,也就是這個進程已經占有處理器的使用權了。
這就像多個同學要分時使用同一張課桌一樣,說是要收回正在使用課桌同學的課桌使用權,實質上就是讓他把屬於他的東西拿走;而賦予某個同學課桌使用權,只不過就是讓他把他的東西放到課桌上罷了。
在切換時,一個進程存儲在處理器各暫存器中的中間數據叫做進程的上下文,所以進程的 切換實質上就是被中止運行進程與待運行進程上下文的切換。在進程未占用處理器時,進程 的上下文是存儲在進程的私有堆疊中的。
顯然,進程的切換可以用中斷技術來實現,即當調度器獲得了待運行進程的控制塊之後,應立即用軟中斷指令來中止當前進程的運行,並保存當前進程的PC值和PSW值。其後,使 用壓棧指令把處理器其他暫存器的值壓入進程私有堆疊。接下來,就從待運行進程的進程控 制塊中取出私有堆疊指針的值並存入處理器的暫存器SP,至此SP就指向了待運行進程的私 有堆疊,於是下面就自待運行進程的私有堆疊中彈出上下文進人處理器。最後,利用中斷返回指令來實現自待運行進程的私有堆疊中彈出PSW值和自待運行進程的私有堆疊中彈出PC值的功能。
這是一個完整的軟中斷處理過程,只不過在保護現場和恢復現場工作中,保護的是被中止 運行進程的現場,恢復的是待運行進程的現場,這一切都依賴於堆疊指針的切換。
進程切換時,被中止進程保護斷點和待運行進程保護斷點的示意圖如圖所示。
進程切換步驟
進程上下文切換由以下4個步驟組成:
1)決定是否作上下文切換以及是否允許作上下文切換。包括對進程調度原因的檢查分析,以及當前執行進程的資格和CPU執行方式的檢查等。在作業系統中,上下文切換程式並不是每時每刻都在檢查和分析是否可作上下文切換,它們設定有適當的時機。
(2)保存當前執行進程的上下文。這裡所說的當前執行進程,實際上是指調用上下文切換程式之前的執行進程。如果上下文切換不是被那個當前執行進程所調用,且不屬於該進程,則所保存的上下文應是先前執行進程的上下文,或稱為“老”進程上下文。顯然,上下文切換程式不能破壞“老”進程的上下文結構。
(3)使用進程調度算法,選擇一處於就緒狀態的進程。
(4)恢復或裝配所選進程的上下文,將CPU控制權交到所選進程手中。
進程切換注意事項
保存處理器PC暫存器的值到被中止進程的私有堆疊;
保存處理器PSW暫存器的值到被中止進程的私有堆疊;
保存處理器SP暫存器的值到被中止進程的進程控制塊;
保存處理器其他暫存器的值到被中止進程的私有堆疊;
自待運行進程的進程控制塊取SP值並存入處理器的暫存器SP;
自待運行進程的私有堆疊恢復處理器各暫存器的值;
自待運行進程的私有堆疊中彈出PSW值並送入處理器的PSW;
自待運行進程的私有堆疊中彈出PC值並送入處理器的PC。