總結每天之上下文切換

2021-10-10 06:34:53 字數 2770 閱讀 7131

16、什麼是上下文切換

答:比如人工作的時候,準備好裝備好工作需要的工具才能開始正常工作,否則都是工作的準備階段。而我們的cpu是分片執行的(因為cpu執行速度太快,不想浪費,所以都是分片執行任務),我們一般的作業系統都是多工系統,需要執行其它任務,那麼就需要把當前任務的工作環境也就是執行環境儲存到記憶體裡,然後把下乙個任務的工作環境/執行環境(其實就是暫存器、程式計數器那些東西就緒)放入cpu中,然後開始執行。

這兩個任務執行環境切換稱為上下文切換。

17、上下文切換的過程

答:1)掛起乙個程序,將這個程序在 cpu 中的狀態(上下文)儲存於pcb中。

2)在記憶體中檢索下乙個程序的上下文並將其在 cpu 的暫存器中恢復。

3)跳轉到程式計數器所指向的位置(即跳轉到程序被中斷時的**行),以恢復該程序在程式中。

18、什麼是pcb

答:上下文切換中,上下文的資訊被儲存在程序控制塊中(pcb,process control block中)。 pcb 還經常被稱作「切換楨」(switchframe)。 資訊會一直儲存到 cpu 的記憶體中,直到他們被再次使用。

19、引起執行緒上下文切換的原因

答:1)時間片用完,需要程序掛起

2)硬中斷

3)**邏輯掛起執行緒

4)當前任務有io阻塞

5)多程序搶占鎖資源

20、linux如何檢視上下文中斷

答:通過linux安裝工具sysstat。

可以使用vmstat檢視上下文中斷。

比如,下面就是乙個 vmstat 的使用示例:

# 每隔 5 秒輸出 1 組資料

$ 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

0 0 0 7005360 91564 818900 0 0 0 0 25 33 0 0 100 0 0

我們一起來看這個結果,你可以先試著自己解讀每列的含義。在這裡,我重點強調下,需要特別關注的四列內容:

cs(context switch)是每秒上下文切換的次數。

in(interrupt)則是每秒中斷的次數。

可以看到,這個例子中的上下文切換次數 cs 是 33 次,而系統中斷次數 in 則是 25 次,而就緒佇列長度 r 和不可中斷狀態程序數 b 都是 0。

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

比如說:

# 每隔 5 秒輸出 1 組資料

$ pidstat -w 5

linux 4.15.0 (ubuntu) 09/23/18 _x86_64_ (2 cpu)

08:18:26 uid pid cswch/s nvcswch/s command

08:18:31 0 1 0.20 0.00 systemd

08:18:31 0 8 5.40 0.00 rcu_sched

...

這個結果中有兩列內容是我們的重點關注物件。乙個是 cswch ,表示每秒自願上下文切換(voluntary context switches)的次數,另乙個則是 nvcswch ,表示每秒非自願上下文切換(non voluntary context switches)的次數。

這兩個概念你一定要牢牢記住,因為它們意味著不同的效能問題:

所謂自願上下文切換,是指程序無法獲取所需資源,導致的上下文切換。比如說, i/o、記憶體等系統資源不足時,就會發生自願上下文切換。

而非自願上下文切換,則是指程序由於時間片已到等原因,被系統強制排程,進而發生的上下文切換。比如說,大量程序都在爭搶 cpu 時,就容易發生非自願上下文切換。

pid加上 -t 引數後,才會輸出執行緒的指標。

所以,我們可以在第三個終端裡, ctrl+c 停止剛才的 pidstat 命令,再加上 -t 引數,重試一下看看:

# 每隔 1 秒輸出一組資料(需要 ctrl+c 才結束)

# -wt 引數表示輸出執行緒的上下文切換指標

$ pidstat -wt 1

08:14:05 uid tgid tid cswch/s nvcswch/s command

...08:14:05 0 10551 - 6.00 0.00 sysbench

08:14:05 0 - 10551 6.00 0.00 |__sysbench

08:14:05 0 - 10552 18911.00 103740.00 |__sysbench

08:14:05 0 - 10553 18915.00 100955.00 |__sysbench

08:14:05 0 - 10554 18827.00 103954.00 |__sysbench

...

上下文切換

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...