作業系統中的上下文切換



在搶佔式多道程式設計系統中,正在執行的程序通常必須在完成之前停止執行,以允許其他程序執行。CPU 中執行程序的切換會導致一種稱為上下文切換的現象。這裡值得注意的是,程序的上下文指的是程序的屬性以及分配給它的資源。上下文包括程序堆疊、記憶體地址空間、虛擬記憶體地址空間、暫存器中的值以及堆疊指標 (SP)。

什麼是上下文切換?

上下文切換是儲存程序上下文或狀態的過程,以便在需要時可以重新載入它,並且可以從與之前相同的點恢復執行。這是多工作業系統的功能,允許單個CPU被多個程序共享。

上下文切換觸發器

上下文切換有三個主要的觸發器。如下所示:

1. 多工處理

在多工環境中,程序從 CPU 中切換出來,以便可以執行另一個程序。舊程序的狀態被儲存,新程序的狀態被載入。在搶佔式系統中,程序可能會被排程程式切換出去。

2. 中斷處理

當發生中斷時,硬體會切換一部分上下文。這是自動發生的。只更改部分上下文以最大程度地減少處理中斷所需的時間。

3. 使用者和核心模式切換

當作業系統需要在使用者模式和核心模式之間進行轉換時,可能會發生上下文切換。

上下文切換步驟

上下文切換涉及的步驟如下:

  • 儲存當前正在 CPU 上執行的程序的上下文。更新程序控制塊和其他重要欄位。
  • 將上述程序的程序控制塊移動到相關的佇列,例如就緒佇列、I/O 佇列等。
  • 選擇一個新的程序執行。
  • 更新所選程序的程序控制塊。這包括將程序狀態更新為執行狀態。
  • 根據需要更新記憶體管理資料結構。
  • 恢復之前在處理器上載入時執行的程序的上下文。這是透過載入程序控制塊和暫存器的先前值來完成的。

上下文切換示例

讓我們考慮一個從程序 P0 切換到程序 P1 的上下文切換場景。發生的步驟如下圖所示:

Example of Content Switching

從圖中可以看出,這裡發生了兩次上下文切換。第一次上下文切換導致從程序 P0 切換到 P1。我們可以看到程序 P0 最初正在執行。發生系統呼叫或中斷,請求 P0 從其執行狀態搶佔,以便程序 P1 可以執行。為此,發生上下文切換。為了保留 P0 執行的部分結果,P0 的狀態儲存在其程序控制塊 PCB0 中。程序 P1 的狀態從其 PCB1 重新載入到 CPU。因此,P0 進入空閒狀態,而 P1 開始執行。在第二次上下文切換中,發生相反的過程,其中程序 P1 的狀態儲存在 PCB1 中,並且 P0 的儲存狀態從 PCB0 載入。

成本和效能評估

上下文切換的過程在計算上是密集型的。上下文切換會消耗大量的 CPU 週期,因為它需要儲存和重新載入參與切換過程的兩個程序的整個上下文。因此,在設計作業系統和選擇排程演算法時,主要目標之一仍然是最佳化上下文切換的數量。

程序之間的切換需要相當長的時間。涉及許多工,例如將部分值儲存到暫存器和記憶體對映以及從它們載入;更新表、堆疊和檔案中的值;以及儲存共享資源中的值。此外,還有其他其他操作取決於底層計算機體系結構和作業系統選擇。在兩個單獨程序之間切換所需的時間稱為程序切換延遲。

上下文切換對程序管理系統的整體效能有深遠的影響。如果每次上下文切換都以最少的資源利用和最少的時間完成,則 CPU 可以主要用於執行程序,從而提高整體效能。另一方面,詳細的上下文切換可能是萬無一失的,但可能會消耗大量的時間和資源,從而降低整體效能。為使用者程序提供單個地址空間的作業系統比為每個程序提供專用地址空間的作業系統具有更快的上下文切換。

如果程序排程程式最佳化上下文切換的數量,使得用於程序執行的 CPU 週期數大大高於用於上下文切換的 CPU 週期數,則可以提高效能。

廣告