<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 設計應用 > 究竟什么是上下文切換?

究竟什么是上下文切換?

作者: 時(shí)間:2024-12-26 來(lái)源: 收藏

我們經(jīng)常聽(tīng)到上下文切換這個(gè)詞語(yǔ),但是究竟什么是上下文切換呢?

本文引用地址:http://dyxdggzs.com/article/202412/465815.htm

640-3.jpeg

概念

Linux是一個(gè)多任務(wù)的操作系統,可以同時(shí)多個(gè)任務(wù)并發(fā)執行,任務(wù)數超過(guò)CPU核心數。當然同一時(shí)刻在執行的任務(wù)數,最多也就只能是CPU核心數,只不過(guò)CPU時(shí)間片在多個(gè)任務(wù)之間來(lái)回切換罷了。上下文切換就是為了保存任務(wù)切換時(shí)刻的基本信息,當CPU重新執行任務(wù)的時(shí)候可以加載上下文信息,從當時(shí)退出的位置、狀態(tài)重新開(kāi)始執行任務(wù)。這里所說(shuō)的上下文信息,既包括虛擬內存、棧、全局變量等用戶(hù)態(tài)的資源,也包括內核堆棧、寄存器等內核態(tài)的資源。

上下文包含什么信息

一個(gè)進(jìn)程的信息包含很多,可以理解為幾個(gè)方面:CPU-狀態(tài)信息、I/O狀態(tài)信息、父子進(jìn)程信息等:

· 進(jìn)程狀態(tài):如就緒、運行、阻塞等,表示進(jìn)程當前的執行狀態(tài)。

· 程序計數器(PC):記錄進(jìn)程下一條指令的地址。

· 寄存器內容:包括通用寄存器、特殊寄存器等,保存進(jìn)程切換時(shí)的 CPU 狀態(tài)。

· 內存管理信息:如頁(yè)面表、段表、內存限制等,用于管理進(jìn)程的內存分配。

· 調度信息:如進(jìn)程優(yōu)先級、調度隊列中的位置等,用于進(jìn)程調度。

· I/O 狀態(tài)信息:記錄進(jìn)程當前所使用的 I/O 設備、文件描述符等。

· 進(jìn)程標識符(PID):唯一標識進(jìn)程的 ID。

· 父進(jìn)程和子進(jìn)程信息:包括父進(jìn)程 PID、子進(jìn)程鏈表等。

· 時(shí)間信息:如進(jìn)程的啟動(dòng)時(shí)間、CPU 時(shí)間片消耗等。

640-4.jpeg

這些信息在內核中是通過(guò)結構體存儲的,即PCB(Process Control Block)進(jìn)程控制塊,下圖只是示意,不包含所有內容,在進(jìn)程讓出CPU的時(shí)候,這些上下文信息會(huì )保存到內核中,當下次執行的時(shí)候再從內核中加載回來(lái)。

640-5.jpeg

在Linux源碼中是通過(guò)結構體task_struct來(lái)存儲的:

640-6.jpeg

上下文切換的類(lèi)型

· 進(jìn)程上下文切換:最經(jīng)常聽(tīng)到上下文切換,多個(gè)進(jìn)程并發(fā),很好理解。

· 線(xiàn)程上下文切換:包含了同一個(gè)進(jìn)程內的和不同進(jìn)程內的,不同進(jìn)程內的消耗等同于進(jìn)程上下文切換。

· 中斷上下文切換:因為外設控制器執行速度通常慢于CPU,比如打印一個(gè)數據這個(gè)時(shí)候需要內核調用顯示設備,很慢怎么辦呢?這個(gè)是時(shí)候就會(huì )觸發(fā)中斷,讓CPU先干別的進(jìn)程,等打印完成了再回來(lái)。

分析工具

vmstat:查看整個(gè)系統的上下文切換情況

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

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

· r(Running or Runnable)是就緒隊列的長(cháng)度,也就是正在運行和等待 CPU 的進(jìn)程數。

· b(Blocked)則是處于不可中斷睡眠狀態(tài)的進(jìn)程數。

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

pidstat:查看具體某個(gè)進(jìn)程的上下文切換情況

· 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


關(guān)鍵詞:

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>