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以下)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM