0
如何在多任務環境中的其他任務未修改我寫入處理器寄存器的值之前不再需要它?如何在多任務環境中使用寄存器
mov eax , 42
;
; some calculations
;
; which use the value
;
; stored in the eax
;
如果其他程序在完成使用前會修改寄存器值,我的程序可能會崩潰。我如何處理它?
如何在多任務環境中的其他任務未修改我寫入處理器寄存器的值之前不再需要它?如何在多任務環境中使用寄存器
mov eax , 42
;
; some calculations
;
; which use the value
;
; stored in the eax
;
如果其他程序在完成使用前會修改寄存器值,我的程序可能會崩潰。我如何處理它?
操作系統照顧你這個。
當你多任務時,OS會保存你的上下文(標誌和寄存器)。當你的上下文恢復時,保存的數據也會被恢復,所以即使你在另一個處理器中改變了eax的值,你的代碼也會工作。從您的代碼角度來看,您正在使用與以前相同的代碼。你不能從另一個處理器訪問一個處理器的寄存器,所以你在這兩種情況下都是安全的。
導致問題的原因是數據的來源,例如,如果您將數據從內存移到eax,而沒有鎖定,則不保證數據沒有變化。在這種情況下,您可以鎖定,移動,計算和解鎖。
謝謝你的回答。我是否正確地認識到,「上下文切換」是CPU完成某個進程Foo的某個指令並開始執行進程Bar某條指令之前的時刻? – Kolyunya
如今,您可以使用不同類型的上下文切換,例如處理中斷,系統調用等。您所說的從單個處理器的角度來看是正確的。在多處理器環境中,Foo和Bar可以同時運行。您也可以使用上下文切換來運行操作系統本身。 – nmenezes