如果
- CPU 具有模式(特權級別)(添加是因為并非所有處理器都具有此處的特權級別)
- CPU是多核的(CISC / x86-64指令集)
- 調度是回圈調度
- thread 是內核管理的執行緒
- 如有必要,作業系統是 windows
我想知道每個時間片的執行緒背景關系切換和 CPU 模式切換點的簡化核心執行流程。
我的理解如下。如果我錯了,請糾正我。
如果執行緒是不涉及中斷的內核管理的用戶模式執行緒,或者任何需要內核模式的執行緒,
- 發生執行緒背景關系切換。
- 核心執行執行緒切換到內核模式,因為除非執行緒是用戶管理的執行緒,否則背景關系切換只能在內核模式下發生。
- 核心執行執行緒切換到用戶模式。
- 內核執行位于用戶空間的指令序列。
- 時間片到期。
- 重復 1。
我能找到的最接近的相關圖表如下。

即使是一點點線索也將不勝感激。
uj5u.com熱心網友回復:
你自己說的:
背景關系切換只能在內核模式下發生
因此 CPU 必須進入內核模式才能進行背景關系切換。在大多數作業系統中,這可以通過以下兩種方式之一發生:
- 用戶模式代碼進行系統呼叫,或
- 發生中斷。
如果執行緒通過系統呼叫進入內核模式,那么如果系統呼叫導致執行緒不再可運行(例如,sleep()呼叫),則可能存在背景關系切換,或者如果系統呼叫導致更高的執行緒,則可能存在背景關系切換-priority 執行緒變得可運行。(例如,系統呼叫釋放更高優先級執行緒正在等待的互斥鎖。)
如果執行緒由于中斷而進入內核模式,則可能存在背景關系切換,因為中斷處理程式使某些更高優先級的執行緒可運行(例如,如果另一個執行緒正在等待來自磁盤的資料),或者可能存在背景關系switch 因為是定時器中斷,當前執行緒的時間片已經過期。
背景關系切換的機制在不同的硬體平臺上可能會有所不同。以下是它在一些假設的 CPU 上可能發生的情況:
- 當前執行緒 (threadA) 進入調度程式代碼,該代碼選擇某個其他執行緒 (threadB) 作為下一個在當前 CPU 上運行的執行緒。
- 它呼叫了一些
switchContext(threadB)函式。 - 該
switchContext函式將堆疊指標暫存器和其他活動暫存器中的值復制到當前執行緒 (threadA) 的已保存背景關系區域。* - 然后它將“當前執行緒”指標設定為指向 threadB 的已保存背景關系區域,并通過反向復制所有相同的內容來恢復 threadB 的背景關系。**
- 最后,
switchContext函式回傳... IN threadB,... 在 threadB 最后一次呼叫它的地方。
最終,threadB 從中斷或系統呼叫回傳到在用戶模式下運行的應用程式代碼。
* 作者switchContext可能必須小心,可能必須做一些棘手的事情,以保存整個背景關系而不破壞它。例如,最好不要使用任何需要保存的暫存器,然后才能將其實際保存在某個地方。
** 最棘手的部分是在恢復堆疊指標暫存器時。一旦發生這種情況,“the”堆疊就會突然變成 threadB 的堆疊,而不是 threadA 的堆疊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/481898.html
