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