新聞中心

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

        究竟什么是上下文切換?

        作者: 時間:2024-12-26 來源: 收藏

        我們經常聽到上下文切換這個詞語,但是究竟什么是上下文切換呢?

        本文引用地址:http://www.104case.com/article/202412/465815.htm

        640-3.jpeg

        概念

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

        上下文包含什么信息

        一個進程的信息包含很多,可以理解為幾個方面:CPU-狀態信息、I/O狀態信息、父子進程信息等:

        · 進程狀態:如就緒、運行、阻塞等,表示進程當前的執行狀態。

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

        · 寄存器內容:包括通用寄存器、特殊寄存器等,保存進程切換時的 CPU 狀態。

        · 內存管理信息:如頁面表、段表、內存限制等,用于管理進程的內存分配。

        · 調度信息:如進程優先級、調度隊列中的位置等,用于進程調度。

        · I/O 狀態信息:記錄進程當前所使用的 I/O 設備、文件描述符等。

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

        · 父進程和子進程信息:包括父進程 PID、子進程鏈表等。

        · 時間信息:如進程的啟動時間、CPU 時間片消耗等。

        640-4.jpeg

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

        640-5.jpeg

        在Linux源碼中是通過結構體task_struct來存儲的:

        640-6.jpeg

        上下文切換的類型

        · 進程上下文切換:最經常聽到上下文切換,多個進程并發,很好理解。

        · 線程上下文切換:包含了同一個進程內的和不同進程內的,不同進程內的消耗等同于進程上下文切換。

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

        分析工具

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

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

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

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

        · b(Blocked)則是處于不可中斷睡眠狀態的進程數。

        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:查看具體某個進程的上下文切換情況

        · 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


        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 敦煌市| 定陶县| 崇信县| 绥中县| 盘山县| 麟游县| 克什克腾旗| 广宗县| 高安市| 公安县| 台江县| 镇远县| 鄯善县| 天峻县| 鸡西市| 东乌珠穆沁旗| 杂多县| 曲靖市| 北流市| 芜湖市| 永福县| 孟津县| 滦南县| 望谟县| 新巴尔虎右旗| 长治市| 玛沁县| 仙居县| 武山县| 鱼台县| 彰化县| 青田县| 富顺县| 砚山县| 嘉义县| 徐汇区| 永川市| 黔西| 阜新| 西和县| 红河县|