究竟什么是上下文切換?
我們經常聽到上下文切換這個詞語,但是究竟什么是上下文切換呢?
本文引用地址:http://2s4d.com/article/202412/465815.htm概念
Linux是一個多任務的操作系統,可以同時多個任務并發(fā)執(zhí)行,任務數超過CPU核心數。當然同一時刻在執(zhí)行的任務數,最多也就只能是CPU核心數,只不過CPU時間片在多個任務之間來回切換罷了。上下文切換就是為了保存任務切換時刻的基本信息,當CPU重新執(zhí)行任務的時候可以加載上下文信息,從當時退出的位置、狀態(tài)重新開始執(zhí)行任務。這里所說的上下文信息,既包括虛擬內存、棧、全局變量等用戶態(tài)的資源,也包括內核堆棧、寄存器等內核態(tài)的資源。
上下文包含什么信息
一個進程的信息包含很多,可以理解為幾個方面:CPU-狀態(tài)信息、I/O狀態(tài)信息、父子進程信息等:
· 進程狀態(tài):如就緒、運行、阻塞等,表示進程當前的執(zhí)行狀態(tài)。
· 程序計數器(PC):記錄進程下一條指令的地址。
· 寄存器內容:包括通用寄存器、特殊寄存器等,保存進程切換時的 CPU 狀態(tài)。
· 內存管理信息:如頁面表、段表、內存限制等,用于管理進程的內存分配。
· 調度信息:如進程優(yōu)先級、調度隊列中的位置等,用于進程調度。
· I/O 狀態(tài)信息:記錄進程當前所使用的 I/O 設備、文件描述符等。
· 進程標識符(PID):唯一標識進程的 ID。
· 父進程和子進程信息:包括父進程 PID、子進程鏈表等。
· 時間信息:如進程的啟動時間、CPU 時間片消耗等。
這些信息在內核中是通過結構體存儲的,即PCB(Process Control Block)進程控制塊,下圖只是示意,不包含所有內容,在進程讓出CPU的時候,這些上下文信息會保存到內核中,當下次執(zhí)行的時候再從內核中加載回來。
在Linux源碼中是通過結構體task_struct來存儲的:
上下文切換的類型
· 進程上下文切換:最經常聽到上下文切換,多個進程并發(fā),很好理解。
· 線程上下文切換:包含了同一個進程內的和不同進程內的,不同進程內的消耗等同于進程上下文切換。
· 中斷上下文切換:因為外設控制器執(zhí)行速度通常慢于CPU,比如打印一個數據這個時候需要內核調用顯示設備,很慢怎么辦呢?這個是時候就會觸發(fā)中斷,讓CPU先干別的進程,等打印完成了再回來。
分析工具
vmstat:查看整個系統的上下文切換情況
· cs(context switch)是每秒上下文切換的次數。
· in(interrupt)則是每秒中斷的次數。
· r(Running or Runnable)是就緒隊列的長度,也就是正在運行和等待 CPU 的進程數。
· b(Blocked)則是處于不可中斷睡眠狀態(tài)的進程數。
vmstat 1
// ====================================
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 0 1944104 1026704 24011784 0 0 12 14 10 6 1 1 98 0 0
1 0 0 1944072 1026704 24012760 0 0 0 0 2917 5351 1 1 98 0 0
0 0 0 1945356 1026720 24011852 0 0 0 376 3559 6155 1 1 98 0 0
· cswch 表示每秒自愿上下文切換(voluntary context switches)的次數。
· nvcswch 表示每秒非自愿上下文切換(non voluntary context switches)的次數。
pidstat -w 5
// =======================================
Average: UID PID cswch/s nvcswch/s Command
Average: 0 12 0.60 0.00 ksoftirqd/0
Average: 0 13 62.48 0.00 rcu_sched
Average: 0 14 0.40 0.00 migration/0
Average: 0 19 0.40 0.00 migration/1
Average: 0 25 0.40 0.00 migration/2
Average: 0 26 0.20 0.00 ksoftirqd/2
評論