2009-06-29 29 views

回答

11

這是相當複雜的問題,因爲答案(S)依賴於許多不同的事情:

  1. 有問題的CPU
    • 它甚至可以在同一個家族,例如額外的顯著變化爲SSE ​​/ MMX操作添加寄存器。
  2. 操作系統,因爲它控制在上下文切換時觸發的處理程序,並決定是否使用CPU的硬件(如果有)來協助上下文切換。
    • 例如,Windows不使用英特爾硬件,因爲它不存儲浮點寄存器,所以它可以爲您執行大部分上下文切換存儲。
  3. 通過了解它自己的要求,並能告知該
    • 操作系統的程序中啓用任何優化,或許是爲了表明它沒有使用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相關信息和權限相關結構。

這些將主要是指向更豐富的數據結構的指針,因此與線程上下文切換相關的成本不會很高。

+0

非常簡潔的解釋。我想再問一件事。在上下文切換髮生後,我仍然無法弄清楚CPU中的PC寄存器如何在物理上得到更新? – zgulser 2018-02-11 13:07:35

1

這取決於你使用的操作系統

  • 兩者之間,但是可以肯定的您必須保存所有寄存器的內容(包括指令計數器)並加載您要切換到的線程的寄存器。

    我想到的關於同一進程中兩個線程之間切換的唯一區別是您不會丟失L1和MMU緩存的內容。

  • 0

    林不知道,但如果我沒記錯的話,工作記憶集也會被切換。

    1

    當上下文切換在同一進程的線程之間時,保存當前線程的所有非易失性通用寄存器,並恢復新線程的非易失性通用寄存器;只有當前線程執行被中斷中斷時,才需要保存非易失性寄存器。還應該保存並恢復線程使用的任何協處理器的寄存器(例如浮點處理器) 如果在兩個進程的線程之間進行切換,除了正常的上下文切換,內存和IO管理還應該做相關的改變;例如,進程所需的內存保護是通過使用頁表和頁目錄表來實現的,每個進程都有一個唯一的頁目錄表地址,當進程發生變化時必須對其進行更改。