CPU上下文以及各類上下文切換

2022-10-11 13:54:09 字數 2219 閱讀 6362

首先,需要講清楚什麼是上下文。

每個任務執行前,cpu都需要知道任務從**載入、又從**開始執行,這就涉及到cpu暫存器和程式計數器(pc):

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

程式計數器會儲存cpu正在執行的指令位置,或者即將執行的指令位置。

這兩個是 cpu 執行任何任務前都必須依賴的環境,因此叫做cpu上下文。

總結:pc和暫存器即是cpu上下文

上下文切換

那麼,什麼是上下文切換呢?下面是乙個上下文切換時需要履行的步驟:

將前乙個cpu的上下文(也就是cpu暫存器和程式計數器裡邊的內容)儲存起來;

然後載入新任務的上下文到暫存器和程式計數器;

最後跳轉到程式計數器所指的新位置,執行新任務。

被儲存起來的上下文會儲存到系統核心中,等待任務重新排程執行時再次載入進來。

cpu的上下文切換分三種:程序上下文切換、執行緒上下文切換、中斷上下文切換

系統呼叫

linux 按照特權等級,把程序的執行空間分為核心空間和使用者空間:

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

使用者空間:只能訪問受限資源,不能直接訪問記憶體等硬體裝置,必須借助系統呼叫。

程序可以在使用者空間執行(叫作:程序使用者態),也可以在核心空間執行(叫作:程序核心態)。從使用者態到核心態需要系統呼叫完成。

需要注意的是,系統呼叫過程中,不涉及虛擬記憶體等程序使用者態的資源,也不會切換程序。與通常所說的程序上下文切換不同:

程序上下文切換是指,從乙個程序切換到另乙個程序;

系統呼叫過程中一直是同乙個程序在執行。

補充:系統呼叫和函式呼叫的區別

系統呼叫通過暫存器傳參,函式呼叫是棧傳參

系統呼叫要進入核心態(意味著要切換程序上下文),執行在核心位址

程序上下文切換

程序是由核心管理和排程的,程序的切換只能發生在核心態。 因此,程序的上下文不但包括虛擬記憶體、棧、全域性變數等使用者空間資源,還包括核心堆疊、暫存器等核心空間狀態。所以,程序的上下文切換比系統呼叫多乙個步驟:儲存當前程序的核心狀態和 cpu 暫存器之前,先把該程序的虛擬記憶體、棧等儲存起來;載入下乙個程序的核心態後,還需要重新整理程序的虛擬記憶體和使用者棧。儲存上下文和恢復上下文需要核心在 cpu 上執行才能完成。

linux 通過 tlb (translation lookaside buffer) 管理虛擬記憶體到物理記憶體的對映關係。當虛擬記憶體更新後,tlb 也需要重新整理,記憶體的訪問速度會因此變慢。尤其在多處理器系統上,快取被多個處理器共享,重新整理快取不僅影響當預處理器的程序,還會影響共享快取的其他處理器程序。

linux 會為每個 cpu 都維護乙個就緒佇列,將活躍程序(正在執行和正在等待 cpu 的程序)按照優先順序和等待 cpu 時間來排序,然後選擇最需要 cpu 的程序,也就是優先順序最高和等待 cpu 時間最長的程序來執行。

程序切換時需要切換上下文,程序切換的場景有:

程序時間片耗盡;

系統資源不足(如記憶體不足);

程序通過睡眠函式 sleep 把自己掛起來;

當有優先順序更高的程序執行時,為了去執行高優先順序程序,當前程序會被掛起;

發生硬中斷,cpu 上的程序會被掛起,然後去執行核心中的中斷服務程序。

執行緒上下文切換

執行緒是排程的基本單位,而程序則是資源擁有的基本單位。

核心中的任務排程實際是在排程執行緒,程序只是給執行緒提供虛擬記憶體、全域性變數等資源。執行緒上下文切換時,共享相同的虛擬記憶體和全域性變數等資源不需要修改。而執行緒自己的私有資料,如棧和暫存器等,上下文切換時需要儲存。

執行緒切換分兩種情況:

前後兩個執行緒屬於不同程序;

前後兩個執行緒屬於同乙個程序(速度更快,消耗更少資源)。

中斷上下文切換

為了快速響應硬體的事件,中斷處理會打斷程序的正常排程和執行,然後呼叫中斷處理程式,響應裝置事件。在打斷其他程序時,需要先將程序當前的狀態儲存下來,等中斷結束後,程序仍然可以恢復回來。

跟程序上下文不同,中斷上下文切換不涉及程序的使用者態。所以,即便中斷過程打斷了乙個正處在使用者態的程序,也不需要儲存和恢復這個程序的虛擬記憶體、全域性變數等使用者態資源。中斷上下文,只包括核心態中斷服務程式執行所必需的狀態,也就是 cpu 暫存器、核心堆疊、硬體中斷引數等。

對同乙個 cpu 來說,中斷處理比程序擁有更高的優先順序,所以中斷上下文切換不會與程序上下文切換同時發生。並且,由於中斷會打斷正常程序的排程和執行,所以大部分中斷處理程式都短小精悍,以便可以盡快完成。

**luffy's blog

筆記 cpu上下文,上下文切換

cpu 上下文 cpu 暫存器,是 cpu 內建的容量小 但速度極快的記憶體。而程式計數器,則是用來儲存 cpu 正在執行的指令位置 或者即將執行的下一條指令位置。它們都是 cpu 在執行任何任務前,必須的依賴環境。cpu 上下文切換 就是先把前乙個任務的 cpu 上下文 也就是 cpu 暫存器和程...

CPU上下文切換

linux任務執行前,cpu都要知道從任務從 載入 又從 開始執行,也就是說,需要系統事先幫它設定好cpu暫存器和程式計數器 cpu上下文 cpu暫存器和程式計數器 cpu暫存器 cpu內建容量小 速度極快的記憶體 程式計數器 儲存cpu正在執行的指令位置 或者即將執行的下一條指令位置 把前乙個任務...

CPU 上下文切換

乙個酒店,裡面滿滿的客人在吃飯,好比是,酒店裡面的所有人速速離開酒店,讓下一波客人吃。好比是 酒店裡的客人不需要離開酒店,但是服務員就是不給他們上菜,因為服務員去給 vip 客戶服務去了,好在 vip 客戶比較好說話,很快就伺候好了,服務員再來給酒店裡的客人服務 不好意思,這道菜的工序比較複雜,讓您...