Linux常見上下文切換 理論篇

2021-09-26 10:50:29 字數 2608 閱讀 9438

一、cpu上下文:

cpu上下文切換:由於任務(程序、執行緒或者中斷)在cpu上執行時巨集**上去所有程序都在執行,實際上任務不可能獨佔cpu,是需要遵守cpu的排程演算法,這個過程中任務是要不停的換進換出,而上下文指的就是這個某個任務執行所依賴的環境,這些資訊是要被換進cpu或者換出cpu的。

往往上下文的切換是比較耗時的,理想狀態是更多時間花在任務的執行上,而不是上下文切換。
以下是cpu上下文切換的幾個場景:二、系統呼叫帶來的上下文切換:

系統呼叫是在同乙個程序中完成的,區別與程序之間的切換

一次系統呼叫需要進行兩次的cpu上下文切換,實際上花費的時間是很可觀的

三、程序切換帶來的cpu上下文切換:

linux為每乙個cpu維護乙個就緒佇列,將活躍程序(正在執行和正在等待cpu)按照優先順序和等待cpu時間進行排序,選擇最需要cpu的程序,即優先順序較高和等待時間較長的程序使用cpu。

程序切換的幾種常見的場景:

每個程序在cpu上執行時間被劃分為好多塊時間片,當某一次執行時對應的時間片用完了,這個程序就要被換下來,由排程程式根據程序的優先順序和已經等待的時間決策,接下來哪個程序使用cpu;

程序執行時,發現系統的資源不夠了,這個時候也會被掛起,被換下來,依然由排程程式根據程序的優先順序和已經等待的時間決策,接下來哪個程序使用cpu;

當程序呼叫sleep等睡眠函式的時候,將自己主動的掛起,會被換下來,由排程程式根據程序的優先順序和已經等待的時間決策,接下來哪個程序使用cpu;

此時有個優先順序更高的程序需要緊急執行,此時當前cpu上的程序會被換下來;

發生硬體中斷,當前cpu上的程序會被掛起,去執行對應的中斷處理程式。

程序切換時做了什麼:

tlb:(translation lookaside buffer)

tlb是linux管理虛擬記憶體到物理記憶體的對映關係的。當虛擬記憶體更新以後,tlb也需要重新整理,記憶體的訪問也會隨之變慢。

快取重新整理:

在多處理器系統上,快取是被多個處理器共享的,重新整理快取不僅會影響當預處理器的程序,還會影響影響共享快取上的其他處理器的程序。

使得快取失效,命中率降低,快取的內容也是要更新的,快取失效可以說是很致命的

現在程式設計有一種手段就是禁止當前程序被換出cpu,這種手段說好也好,說不好也不好。

四、執行緒的上下文切換:

執行緒的歷史:

在linux上早期是沒有執行緒這麼一說的,後來可能是向其他作業系統看齊,出現了輕量級程序–也就是我們所看到的thread。所以,執行緒被看作是程序內的一條執行路徑,不過當前程序內的所有執行緒是共享程序的資料、堆等資源的,執行緒有的只不過是本身所需的棧記憶體和一些暫存器罷了。

從這裡也體現了我們經常說的一句話:「程序是資源分配的基本單位,執行緒是cpu排程的基本單位」。

所謂的核心排程:實際上是執行緒的排程,單程序就是乙個執行緒,此時劃等號

程序只不過是給執行緒提供虛擬記憶體、共享資料等資源而已

執行緒切換的幾個場景:同乙個程序內的執行緒切換,由於兩個執行緒共享的是同乙個程序的資源,所以大多數的資源是不需要切換的,需要切換的只是執行緒獨有的棧資料和一些暫存器;

不同程序的兩個執行緒,此時等同於前面說到的程序的切換。

當我們使用多執行緒程式設計時,同乙個程序內的執行緒切換,耗時明顯比多程序切換少得多

這也是為什麼說多執行緒程式設計比多程序程式設計效率高的原因。

但是,多執行緒的健壯性堪憂,如何抉擇,還是得考慮實時的場景。

五、中斷上下文的切換:還有一種情況,就是為了快速響應硬體的事件,中斷處理會打斷程序的正常執行和排程,從而轉到中斷處理程式,來處理裝置的事件。被打斷的程序在換下來之前需要講當前的狀態儲存下來,這樣在中斷結束以後恢復原來的狀態。

中斷上下文內容:

核心態中斷服務程式執行所需的狀態,包括cpu暫存器、核心堆疊、硬體中斷引數等
由於中斷會打斷正常程序的排程和執行,所以大部分的中斷處理程式都短小精悍,以便盡可能的執行完畢。

不過,跟程序上下文切換一樣,中斷上下文的切換也需要消耗cpu,切換次數過多也會耗費大量的cpu。甚至嚴重降低系統的整體效能,所以,中斷次數過多的時,需要考慮中斷是否給我們的系統帶來嚴重的效能問題。

六、總結:

cpu上下文切換,時保證linux系統正常工作的核心功能之一,一般情況下不需要我們特別的關注;

但是過多的上下文切換,回把cpu事件消耗在暫存器、核心棧以及虛擬記憶體等資料的儲存和恢復上,從而縮短進**正的執行時間,導致系統的效能大幅度的下降。

參考:極客–linux效能優化.

上下文切換

1 系統呼叫 一次系統呼叫其實是發生了兩次cpu上下文的切換 首先將使用者態的cpu暫存器中的指令儲存在系統核心中。為了執行核心態 需要將暫存器更新為核心態指令的位置,然後跳轉到核心空間去執行任務。當核心態的指令執行完成的時候,cpu暫存器將恢復儲存在系統核心中的上一次執行的使用者態,然後切換到使用...

上下文切換

上下文切換 有時也稱做程序切換或任務切換 是指 cpu 從乙個程序或執行緒切換到另乙個程序或執行緒。上下文切換與模式切換 上下文切換只能發生在核心態中。核心態是 cpu 的一種有特權的模式,在這種模式下只有核心執行並且可以訪問所有記憶體和其他系統資源。其他的程式,如應用程式,在最開始都是執行在使用者...

上下文切換

vmstat cs 每秒上下文切換次數 的疑惑 in 每秒cpu中斷次數 shell vmstat 1 procs memory swap io system cpu r b swpd free buff cache si so bi bo in cs us sy id wa 1 0 0 45939...