溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

CPU上下文切換是什么意思

發(fā)布時間:2021-07-12 16:35:46 來源:億速云 閱讀:364 作者:chen 欄目:云計算

本篇內(nèi)容主要講解“CPU上下文切換是什么意思”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“CPU上下文切換是什么意思”吧!

CPU 上下文 可以理解成 CPU寄存器狀態(tài)以及程序計數(shù)器PC , 這些都是記錄CPU當前任務的狀態(tài)。CPU 上下文切換 會把當前的cpu的上下文保存下來,然后加載新任務的對應上下文,而這些保存下來的上下文,會存儲在系統(tǒng)內(nèi)核中,并在任務重新調(diào)度執(zhí)行時再次加載進來。這樣就能保證任務原來的狀態(tài)不受影響,讓任務看起來還是連續(xù)運行。

任務一般包括:

1.進程

2.線程

3.中斷上下文

CPU 上下文的切換會因特權模式切換、進程上下文切換、線程上下文切換以及中斷上下文切換 產(chǎn)生。

特權模式切換

Linux 按照特權等級,把進程的運行空間分為內(nèi)核空間和用戶空間,分別對應著下圖中, CPU 特權等級的 Ring 0 和 Ring 3。內(nèi)核空間(Ring 0)具有最高權限,可以直接訪問所有資源;用戶空間(Ring 3)只能訪問受限資源,不能直接訪問內(nèi)存等硬件設備,必須通過系統(tǒng)調(diào)用陷入到內(nèi)核中,才能訪問這些特權資源。

進程可以在用戶空間運行,也可以在內(nèi)核空間運行。 當調(diào)用open()、read()、write()、close()系統(tǒng)函數(shù),CPU會保存原來用戶態(tài)的指令位置,然后更新CPU寄存器內(nèi)核態(tài)指令的新位置。最后執(zhí)行內(nèi)核態(tài)函數(shù)。當系統(tǒng)調(diào)用結束后,CPU恢復原來的用戶態(tài),切換回用戶空間繼續(xù)執(zhí)行進程。

可以看到 用戶態(tài)->內(nèi)核態(tài), 內(nèi)核態(tài)->用戶態(tài) 這兩個過程總共是產(chǎn)生了兩次CPU上下文切換。不過,需要注意的是,系統(tǒng)調(diào)用過程中,并不會涉及到虛擬內(nèi)存等進程用戶態(tài)的資源

進程上下文切換

進程上下文不僅包括了虛擬內(nèi)存、棧、全局變量等用戶空間的資源,還包括了內(nèi)核堆棧、寄存器等內(nèi)核空間的狀態(tài),與系統(tǒng)調(diào)用相比進程間的切換還需要把內(nèi)容保存下來。

進程上下文切換數(shù)量多,容易導致CPU花費更多的時間在寄存器、虛擬內(nèi)存、內(nèi)核棧等資源的保存和恢復上,減少了進程運行時間,致使平均負載升高。Linux 通過 TLB(Translation Lookaside Buffer)來管理虛擬內(nèi)存到物理內(nèi)存的映射關系。當虛擬內(nèi)存更新后,TLB 也需要刷新,內(nèi)存的訪問也會隨之變慢。特別是在多處理器系統(tǒng)上,緩存是被多個處理器共享的,刷新緩存不僅會影響當前處理器的進程,還會影響共享緩存的其他處理器的進程。

進程上下文切換發(fā)生在進程調(diào)度的過程。

主要在以下場景觸發(fā):

CPU時間是被劃分成各個時間片,當前進程的時間片被耗盡之后會被系統(tǒng)掛起,切換到其他正在等待CPU的進程來運行。
進程在系統(tǒng)資源不足(比如內(nèi)存不足)時,要等到資源滿足后才可以運行,這個時候進程也會被掛起,并由系統(tǒng)調(diào)度其他進程運行。

當進程通過睡眠函數(shù) sleep 或者 sched_yield 這樣的方法將自己主動掛起時,自然也會重新調(diào)度。

當有優(yōu)先級更高的進程運行時,為了保證高優(yōu)先級進程的運行,當前進程會被掛起,由高優(yōu)先級進程來運行。

發(fā)生硬件中斷時,CPU 上的進程會被中斷掛起,轉而執(zhí)行內(nèi)核中的中斷服務程序。

線程上下文切換

線程與進程最大的區(qū)別在于,線程是調(diào)度的基本單位,而進程則是資源擁有的基本單位。linux內(nèi)核中的任務調(diào)度,實際上的調(diào)度對象是線程;而進程只是給線程提供了虛擬內(nèi)存、全局變量等資源。進程中只有一個線程,進程等于線程。因為同一進程下線程是共享虛擬內(nèi)存,相關間的切換只需保存其私有數(shù)據(jù)、寄存器等,因此進程內(nèi)的線程切換比進程間的切換消耗更少資源。

中斷上下文切換

為了快速響應硬件的事件,中斷處理會打斷進程的正常調(diào)度和執(zhí)行,轉而調(diào)用中斷處理程序,響應設備事件。而在打斷其他進程時,就需要將進程當前的狀態(tài)保存下來,這樣在中斷結束后,進程仍然可以從原來的狀態(tài)恢復運行。跟進程上下文不同,中斷上下文切換并不涉及到進程的用戶態(tài)。所以,即便中斷過程打斷了一個正處在用戶態(tài)的進程,也不需要保存和恢復這個進程的虛擬內(nèi)存、全局變量等用戶態(tài)資源。中斷上下文,其實只包括內(nèi)核態(tài)中斷服務程序執(zhí)行所必需的狀態(tài),包括 CPU 寄存器、內(nèi)核堆棧、硬件中斷參數(shù)等。對同一個 CPU 來說,中斷處理比進程擁有更高的優(yōu)先級,所以中斷上下文切換并不會與進程上下文切換同時發(fā)生。同樣道理,由于中斷會打斷正常進程的調(diào)度和執(zhí)行,所以大部分中斷處理程序都短小精悍,以便盡可能快的執(zhí)行結束。另外,跟進程上下文切換一樣,中斷上下文切換也需要消耗 CPU,切換次數(shù)過多也會耗費大量的 CPU,甚至嚴重降低系統(tǒng)的整體性能。所以,當你發(fā)現(xiàn)中斷次數(shù)過多時,就需要注意去排查它是否會給你的系統(tǒng)帶來嚴重的性能問題。

CPU上下文切分析

vmstat 是一個常用的系統(tǒng)性能分析工具,主要用來分析系統(tǒng)的內(nèi)存使用情況,也常用來分析 CPU 上下文切換和中斷的次數(shù)。

root@ECSab169d:~# vmstat 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0  90720 3960176   1036 3014980    0    0    35    85    0    1  1  0 98  0  0
 0  0  90720 3959928   1036 3015004    0    0     0    24  240  358  0  0 99  0  0
 0  1  90720 3959356   1036 3015068    0    0     0    34  260  390  1  0 99  0  0
 0  0  90720 3959204   1036 3015088    0    0     0    23  234  340  0  0 99  0  0
 0  0  90720 3960708   1036 3015088    0    0     0   609  297  429  0  0 99  0  0
 0  0  90720 3960772   1036 3015112    0    0     0   140  295  410  0  0 99  0  0
 0  0  90720 3960688   1036 3015164    0    0     0    36  269  406  0  0 99  0  0

r 是就緒隊列的長度,也就是正在運行和等待 CPU 的進程數(shù)。

b 則是處于不可中斷睡眠狀態(tài)的進程數(shù)

swpd 交換分區(qū)大小,一般在內(nèi)存不足的情況會使用swap進行擴展。

free 空閑的物理內(nèi)存的大小,我的機器內(nèi)存總共8G,剩余3415M。

buff Linux/Unix系統(tǒng)是用來存儲,目錄里面有什么內(nèi)容,權限等的緩存,我本機大概占用300多M

cache cache直接用來記憶我們打開的文件,給文件做緩沖,我本機大概占用300多M(這里是Linux/Unix的聰明之處,把空閑的物理內(nèi)存的一部分拿來做文件和目錄的緩存,是為了提高 程序執(zhí)行的性能,當程序使用內(nèi)存時,buffer/cached會很快地被使用。)

si 每秒從磁盤讀入虛擬內(nèi)存的大小,如果這個值大于0,表示物理內(nèi)存不夠用或者內(nèi)存泄露了,要查找耗內(nèi)存進程解決掉。我的機器內(nèi)存充裕,一切正常。

so 每秒虛擬內(nèi)存寫入磁盤的大小,如果這個值大于0,同上。

bi 塊設備每秒接收的塊數(shù)量,這里的塊設備是指系統(tǒng)上所有的磁盤和其他塊設備,默認塊大小是1024byte,我本機上沒什么IO操作,所以一直是0,但是我曾在處理拷貝大量數(shù)據(jù)(2-3T)的機器上看過可以達到140000/s,磁盤寫入速度差不多140M每秒

bo 塊設備每秒發(fā)送的塊數(shù)量,例如我們讀取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO過于頻繁,需要調(diào)整。

in 每秒CPU的中斷次數(shù),包括時間中斷

cs 每秒上下文切換次數(shù)

可以看到,這個例子中的上下文切換次數(shù) cs 是 33 次,而系統(tǒng)中斷次數(shù) in 則是 25 次,而就緒隊列長度 r 和不可中斷狀態(tài)進程數(shù) b 都是 0。

vmstat 只給出了系統(tǒng)總體的上下文切換情況,要想查看每個進程的詳細情況,就需要使用我們前面提到過的 pidstat 了。給它加上 -w 選項,你就可以查看每個進程上下文切換的情況了。

root@xxxxx:~# pidstat -w 5
Linux 4.15.0-66-generic (xxxxx)     01/25/2021      _x86_64_        (4 CPU)

05:30:32 PM   UID       PID   cswch/s nvcswch/s  Command
05:30:37 PM     0         8     18.16      0.00  rcu_sched
05:30:37 PM     0        11      0.20      0.00  watchdog/0
05:30:37 PM     0       183      4.59      0.00  kworker/3:1H
05:30:37 PM     0       388      2.40      0.00  kworker/0:1H
05:30:37 PM     0       546      0.20      0.00  irqbalance
05:30:37 PM     0       621      9.98      0.00  qemu-ga
05:30:37 PM   109       663      0.40      0.00  uml_switch
05:30:37 PM     0      1275      0.40      0.00  master
05:30:37 PM   110      1277      0.20      0.00  qmgr
05:30:37 PM     0      5896      7.39      0.00  kworker/0:0
05:30:37 PM     0     13579      8.18      0.00  sshd
05:30:37 PM     0     13766      0.20      0.00  vmstat
05:30:37 PM     0     26398      5.19      0.00  kworker/u8:1
05:30:37 PM     0     28341      6.19      0.00  kworker/u8:2
05:30:37 PM     0     28898      5.99      1.40  bash

這個結果中有兩列內(nèi)容是我們的重點關注對象。一個是 cswch ,表示每秒自愿上下文切換(voluntary context switches)的次數(shù),另一個則是 nvcswch ,表示每秒非自愿上下文切換(non voluntary context switches)的次數(shù)。

謂自愿上下文切換: 是指進程無法獲取所需資源,導致的上下文切換。比如說, I/O、內(nèi)存等系統(tǒng)資源不足時,就會發(fā)生自愿上下文切換。

非自愿上下文切換: 則是指進程由于時間片已到等原因,被系統(tǒng)強制調(diào)度,進而發(fā)生的上下文切換。比如說,大量進程都在爭搶 CPU 時,就容易發(fā)生非自愿上下文切換。

總結

自愿上下文切換變多了,說明進程都在等待資源,有可能發(fā)生了 I/O 等其他問題;

非自愿上下文切換變多了,說明進程都在被強制調(diào)度,也就是都在爭搶 CPU,說明 CPU 的確成了瓶頸;

中斷次數(shù)變多了,說明 CPU 被中斷處理程序占用,還需要通過查看 /proc/interrupts 文件來分析具體的中斷類型

到此,相信大家對“CPU上下文切換是什么意思”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

cpu
AI