進程切換
進程切換
進行進程切換就是從正在運行的進程中收回處理器,然後再使待運行進程來佔用處理器。這裡所說的從某個進程收回處理器,實質上就是把進程存放在處理器的寄存器中的中間數據找個地方存起來,從而把處理器的寄存器騰出來讓其他進程使用。那麼被中止運行進程的中間數據存在何處好呢?當然這個地方應該是進程的私有堆棧。
目錄
讓進程來佔用處理器,實質上是把某個進程存放在私有堆棧中寄存器的數據(前一次本進程被中止時的中間數據)再恢復到處理器的寄存器中去,並把待運行進程的斷點送入處理器的程序指針PC,於是待運行進程就開始被處理器運行了,也就是這個進程已經佔有處理器的使用權了。
這就像多個同學要分時使用同一張課桌一樣,說是要收回正在使用課桌同學的課桌使用權,實質上就是讓他把屬於他的東西拿走;而賦予某個同學課桌使用權,只不過就是讓他把他的東西放到課桌上罷了。
在切換時,一個進程存儲在處理器各寄存器中的中間數據叫做進程的上下文,所以進程的 切換實質上就是被中止運行進程與待運行進程上下文的切換。在進程未佔用處理器時,進程 的上下文是存儲在進程的私有堆棧中的。
從上面的敘述可知,調度器進程切換的代碼應有如下功能:
●保存處理器PC寄存器的值到被中止進程的私有堆棧;
●保存處理器PSW寄存器的值到被中止進程的私有堆棧;
●保存處理器SP寄存器的值到被中止進程的進程式控制制塊;
●保存處理器其他寄存器的值到被中止進程的私有堆棧;
●自待運行進程的進程式控制制塊取SP值並存入處理器的寄存器SP;
●自待運行進程的私有堆棧恢復處理器各寄存器的值;
●自待運行進程的私有堆棧中彈出PSW值並送入處理器的PSW;
●自待運行進程的私有堆棧中彈出PC值並送入處理器的PC。
顯然,進程的切換可以用中斷技術來實現,即當調度器獲得了待運行進程的控制塊之後,應立即用軟中斷指令來中止當前進程的運行,並保存當前進程的PC值和PSW值。其後,使 用壓棧指令把處理器其他寄存器的值壓入進程私有堆棧。接下來,就從待運行進程的進程式控制 制塊中取出私有堆棧指針的值並存入處理器的寄存器SP,至此SP就指向了待運行進程的私 有堆棧,於是下面就自待運行進程的私有堆棧中彈出上下文進人處理器。最後,利用中斷返回指令來實現自待運行進程的私有堆棧中彈出PSW值和自待運行進程的私有堆棧中彈出PC值的功能。
這是一個完整的軟中斷處理過程,只不過在保護現場和恢復現場工作中,保護的是被中止 運行進程的現場,恢復的是待運行進程的現場,這一切都依賴於堆棧指針的切換。
進程切換時,被中止進程保護斷點和待運行進程保護斷點的示意圖如圖所示。