1. 程式人生 > 其它 >CPU基礎知識-執行緒切換

CPU基礎知識-執行緒切換

參考資料:
基本功:執行緒上下文切換 https://blog.csdn.net/alex_xfboy/article/details/90722654
程序/執行緒上下文切換會用掉你多少CPU? https://zhuanlan.zhihu.com/p/79772089

1. 名詞解釋:

時間片
多工系統往往需要同時執行多道作業。作業數往往大於機器的CPU數,然而一顆CPU同時只能執行一項任務。利用了時間片輪轉的方式,讓使用者感覺任務正在同時進行
時間片是CPU分配給各個任務(執行緒)的時間。

執行緒上下文
指某一時間點 CPU 暫存器程式計數器的內容,CPU通過時間片分配演算法來迴圈執行任務(執行緒),因為時間片非常短,所以CPU通過不停地切換執行緒執行。

2. 執行緒上下文切換

2.1 執行緒上下文切換

CPU切換前把當前任務的狀態儲存下來,以便下次切換回這個任務時可以再次載入這個任務的狀態,然後載入下一任務的狀態並執行。任務的狀態儲存及再載入, 這段過程就叫做上下文切換。

每個執行緒都有一個程式計數器(記錄要執行的下一條指令),一組暫存器(儲存當前執行緒的工作變數),堆疊(記錄執行歷史,其中每一幀儲存了一個已經呼叫但未返回的過程)。
暫存器 是 CPU 內部的數量較少但是速度很快的記憶體(與之對應的是 CPU 外部相對較慢的 RAM 主記憶體)。暫存器通過對常用值(通常是運算的中間值)的快速訪問來提高計算機程式執行的速度。
程式計數器是一個專用的暫存器,用於表明指令序列中 CPU 正在執行的位置,存的值為正在執行的指令的位置或者下一個將要被執行的指令的位置。

2.2 執行緒上下文切換步驟

  1. 掛起當前執行緒,將這個任務在 CPU 中的狀態(上下文)儲存於記憶體中的某處
  2. 恢復一個執行緒,在記憶體中檢索下一個任務的上下文並將其在 CPU 的暫存器中恢復
  3. 跳轉到程式計數器所指向的位置(即跳轉到任務被中斷時的程式碼行),以恢復該程序在程式中

2.3 執行緒上下文切換的開銷

開銷分成兩種,一種是直接開銷、一種是間接開銷。
直接消耗:指的是CPU暫存器需要儲存和載入, 系統排程器的程式碼需要執行, TLB例項需要重新載入, CPU 的pipeline需要刷掉
間接消耗:指的是多核的cache之間得共享資料, 間接消耗對於程式的影響要看執行緒工作區操作資料的大小

直接開銷就是在切換時,cpu必須做的事情,包括:

  1. 切換頁表全域性目錄
  2. 切換核心態堆疊
  3. 切換硬體上下文(程序恢復前,必須裝入暫存器的資料統稱為硬體上下文)
    ip(instruction pointer):指向當前執行指令的下一條指令
    bp(base pointer): 用於存放執行中的函式對應的棧幀的棧底地址
    sp(stack poinger): 用於存放執行中的函式對應的棧幀的棧頂地址
    cr3:頁目錄基址暫存器,儲存頁目錄表的實體地址
    ......
  4. 重新整理TLB (Translation Lookaside Buffer 轉譯後備緩衝器,也被翻譯為頁表快取、轉址旁路快取,為CPU的一種快取,由儲存器管理單元用於改進虛擬地址到實體地址的轉譯速度。)
  5. 系統排程器的程式碼執行

間接開銷主要指的是雖然切換到一個新程序後,由於各種快取並不熱,速度執行會慢一些。如果程序始終都在一個CPU上排程還好一些,如果跨CPU的話,之前熱起來的TLB、L1、L2、L3因為執行的程序已經變了,所以以區域性性原理cache起來的程式碼、資料也都沒有用了,導致新程序穿透到記憶體的IO會變多。 其實我們上面的實驗並沒有很好地測量到這種情況,所以實際的上下文切換開銷可能比3.5us要大。

2.4 檢視上下文切換次數

Linux系統下可以使用vmstat命令來檢視上下文切換的次數, 其中cs列就是指上下文切換的數目(一般情況下, 空閒系統的上下文切換每秒大概在1500以下)