1. 程式人生 > >四 上下文切換

四 上下文切換

一  前言

 對“平均負載”一課的學習後,你可能會有疑問,程序在競爭cpu的時候並沒有正在的執行,為何會導致系統的負載升高,其實賊魁禍首就是“上下文切換”。

我們經常說linux是一個多工的系統,它支援很多工同時在執行。這裡的“同時”僅僅是一個相對時間,其實他並非真正的在執行,只是系統在很短的時間內,將cpu

輪流分配給他們,造成了錯覺。

二  何為“上下文”

任務執行前,cpu都需要知道任務從哪裡載入,從哪裡開始,這對應cpu的兩個概念“暫存器”和“程式計數器”。

cpu暫存器:cpu內建的容量小、但速度極快的記憶體

cpu計數器:cpu正在執行的指令的位置、或者即將執行的嚇一條指令的位置。

而這裡的從哪裡載入從哪裡開始就是“上下文”了。

三  何為“上下文切換”

先把前一個任務的上下文(cpu暫存器和程式計數器)儲存下來,然後載入新的任務的上下文到這些暫存器和程式計數器,最後再跳轉到程式計數器的新位置,執行新任務。

儲存的上下文會儲存在系統核心中,在任務重新被排程時再載入進來,因此不會影響任務的狀態,看起來還是連續的。

四 都說“任務”,何為“任務”,有哪些場景

任務:程序,執行緒、中斷等等。

上下文切換的場景:程序上下文切換、執行緒上下文切換、中斷上下文切換

A  程序上下文切換

兩個概念:

核心空間:最高許可權,可訪問所有資源

使用者空間:不能訪問記憶體等硬體裝置,必須通過系統呼叫陷入到核心中,才能訪問這些資源。

程序狀態:核心態程序、使用者態程序。

一次系統呼叫涉及:儲存使用者態,切換到核心態,然後儲存核心態,切換到使用者態,所以:一次系統呼叫,其實發生了兩次cpu上下文切換。

 

五  什麼時候會切換、程序什麼時候會被排程到cpu上執行

1  程序執行完成

2  cpu時間被劃分為一段段時間片,這些時間片被輪流分配給各個程序,但某個程序的時間片被耗盡了,就會被掛起,切換到其他等待cpu的程序上。

3  正在執行的程序資源不足了(記憶體等等)

4  程式有設定sleep()這樣的函式時,也會主動掛起

5  中斷,硬體中斷,程序會被掛起,轉而執行核心中的中斷服務程式。