0%

Linux性能調優實戰筆記III(CPU上下文切換-上)

本文旨在剖析CPU上下文切換的五個W。

0x00 概念(what and why?)


  • Linux在支持遠超CPU數的任務時,背後在頻繁為任務輪流切換CPU
  • 每次切換均需Linux為CPU(保存/預設CPU寄存器和程序計數器
    • CPU寄存器:CPU内置高速小内存。
    • 程序計數器:CPU内置指令暫存器。
  • 誘發場景:進程の上下文切換、綫程の上下文切換以及中斷の上下文切換。

0x01 類型(who, when and where?)


進程の上下文切換

  • 進程通過執行函數去執行程序,是資源擁有的基本單位,不再贅述。(who)

  • 誘發進程“被”切換/釋放CPU上下文:(when)

    • 預定時間片耗盡。
    • 系統資源不足。
    • 調用sleep將己主動起。
    • 優先更高優先級進程。
    • 硬件中斷,釋放CPU,轉向内核執行中斷。
  • 時而内核態,時而用戶態。(where)

  • 進程内切換(特權模式切換):(where)

    • 執行多個系統調用,一次系統調用,兩次CPU上下文切換(保存/預設)。
  • 進程間切換(進程上下文切換):(where)

    • 進程切換前/後,需保存/預設【刷新】(内核狀態【堆棧、寄存器】、虛擬内存、棧、全局變量)。

    • 虛擬内存刷新→TLB刷新其映射物理内存位置→内存變慢→其他共享緩存處理器。

    • 如下所示:

      https://img.madebug.net/m4d3bug/images-of-website/master/blog/switchcontentbetweenprogress.png

綫程の上下文切換

  • 綫程是調度的基本單位,不再贅述。(who)
  • 誘發綫程“被”切換/釋放CPU上下文:(when, where)
    • 前後綫程分屬不同進程切換≈進程間上下文切換
    • 前後綫程均屬同一進程切換=一次CPU上下文切换
  • 多綫程消耗<<多進程消耗

中斷の上下文切換

  • 同一CPU内,中斷處理比進程優先級更高。
  • 中斷,先保存前面進程,后中斷目的進程。(一次保存,一次CPU上下文切換)

0x02 小結


  • 基本都是概念性東西。
  • 切換過多往往是性能下降的元凶之一,也是負載升高的元凶。