回答
這是相當複雜的問題,因爲答案(S)依賴於許多不同的事情:
- 有問題的CPU
- 它甚至可以在同一個家族,例如額外的顯著變化爲SSE / MMX操作添加寄存器。
- 操作系統,因爲它控制在上下文切換時觸發的處理程序,並決定是否使用CPU的硬件(如果有)來協助上下文切換。
- 例如,Windows不使用英特爾硬件,因爲它不存儲浮點寄存器,所以它可以爲您執行大部分上下文切換存儲。
- 通過了解它自己的要求,並能告知該
- 操作系統的程序中啓用任何優化,或許是爲了表明它沒有使用FP寄存器,以便不打擾他們
- 在擁有大量的寄存器文件的架構像大多數RISC設計有相當大的好處知道你只需要這些寄存器的一個較小的子
至少需要保存使用中的通用寄存器和程序計數器寄存器(假設採用大多數當前CISC/RISC型通用CPU的通用設計)。
注意,試圖做關於上下文切換隻是努力的最小量是topic of some academic interest
的Linux顯然有在公共領域在此提供更多的信息,雖然我的引用可能有點過時了。
這是一個task_struct,它包含大量與任務狀態有關的字段以及任務的過程。
其中一個是thread_struct這個任務*/
的
/* CPU-特定狀態 - 結構thread_struct線;
保存有關緩存TLS描述符,調試寄存器,故障信息,浮點數,虛擬86模式或IO權限的信息。
每個體系結構都定義了它自己的thread_struct,它標識交換機上保存的寄存器和其他值。
由於允許多個飛行指令(通過超標量或管道相關的架構設計)的重命名寄存器的存在,這會進一步複雜化。上下文swicth的恢復階段可能依賴於CPU的管道在最初空的狀態下被恢復,因此在管道中尚未退出的指令沒有效果,因此可以忽略。這使得CPU的設計更加困難。
進程和線程的區別在於進程切換(總是意味着所有主流操作系統中的線程切換)需要更新內存轉換信息,IO相關信息和權限相關結構。
這些將主要是指向更豐富的數據結構的指針,因此與線程上下文切換相關的成本不會很高。
非常簡潔的解釋。我想再問一件事。在上下文切換髮生後,我仍然無法弄清楚CPU中的PC寄存器如何在物理上得到更新? – zgulser 2018-02-11 13:07:35
這取決於你使用的操作系統
我想到的關於同一進程中兩個線程之間切換的唯一區別是您不會丟失L1和MMU緩存的內容。
林不知道,但如果我沒記錯的話,工作記憶集也會被切換。
當上下文切換在同一進程的線程之間時,保存當前線程的所有非易失性通用寄存器,並恢復新線程的非易失性通用寄存器;只有當前線程執行被中斷中斷時,才需要保存非易失性寄存器。還應該保存並恢復線程使用的任何協處理器的寄存器(例如浮點處理器) 如果在兩個進程的線程之間進行切換,除了正常的上下文切換,內存和IO管理還應該做相關的改變;例如,進程所需的內存保護是通過使用頁表和頁目錄表來實現的,每個進程都有一個唯一的頁目錄表地址,當進程發生變化時必須對其進行更改。
- 1. 爲什麼上下文切換很慢?
- 2. 什麼是上下文切換?
- 3. 什麼是上下文切換時間?
- 4. 在Android上下文切換時保存ARM NEON寄存器
- 5. 快速上下文切換時保存當前狀態 - iOS4
- 6. 線程上下文切換vs進程上下文切換
- 7. 在Linux中監視上下文切換
- 8. 在Windows中強制上下文切換
- 9. 在ReverseProxy上下文中切換SSLVerifyClient
- 10. 在上下文中自動插入/按上下文切換
- 11. 在切換文化之間保存DateTime.Now
- 12. 上下文切換到內核的順序是什麼
- 13. 上下文切換:什麼時候決定?
- 14. 爲什麼同步需要上下文切換到OS?
- 15. 上下文切換死鎖
- 16. 切換畫布上下文
- 17. Python:GIL上下文切換
- 18. 上下文切換太貴
- 19. PHP上下文切換
- 20. lpc 1769上下文切換
- 21. GPU上下文切換
- 22. 保存在子上下文中自動保存到父上下文
- 23. CoreData嵌套上下文:什麼是保存上下文的正確方法?
- 24. BlockingQueue中的上下文切換開銷
- 25. C中的切換上下文
- 26. javascript中的雙上下文切換
- 27. 切換OpenGL上下文或切換上下文渲染目標,而最好?
- 28. 從進程上下文切換切換線程上下文有多好?
- 29. 上下文切換問題:管理上下文切換涉及哪部分OS?
- 30. FreeRtos如何在上下文切換時存儲函數地址
TSS呢? (virt內存描述符) – osgx 2010-05-27 04:33:58