liunx是多工作業系統,但當任務數量大於cpu數量時,系統會在很短的時間內將cpu輪流分配給任務,並不是所有的任務都在同時執行。
每個任務在執行前,系統都需要事先設定好cpu暫存器和程式計數器。
cpu暫存器是cpu內建的容量小速度極快的記憶體,程式計數器是用來儲存cpu正在執行的指令位置、或者即將執行的下一條指令位置。他們稱為cpu的上下文。
cpu上下文切換指的是cpu將當前任務的cpu暫存器和程式計數器儲存起來,然後載入新任務cpu暫存器和程式計數器,再跳到新任務的程式計數器指的位置,執行新任務。
儲存起來的cpu上下文會儲存在系統核心中,等待任務重新排程。
儲存cpu上下文和恢復cpu上下文是需要系統核心在cpu上執行才能完成的。
cpu上下文切換大體可以分為三種,程序上下文切換、執行緒上下文切換、中斷上下文切換。
程序上下文切換
程序的上下文切換是指從乙個程序切換到另乙個程序執行。
liunx將程序的執行空間分為核心空間和使用者空間。
核心空間具有最高等級,可以直接訪問所有系統資源。
使用者空間只能訪問有限資源,不能直接訪問記憶體等硬體裝置,必須通過系統呼叫深入核心才能訪問這些資源。
程序是由核心來管理和排程的,程序的切換只能發生在核心態。程序的上下文不僅包括了虛擬記憶體、棧、全域性變數等使用者空間的資源,還包括了核心堆疊、暫存器等核心空間的狀態。
程序可以在這核心空間和使用者空間執行,分別稱為程序的使用者態和程序的核心態。
從使用者態到核心態的轉變需要通過系統呼叫來完成,需要進行cpu上下文切換,儲存使用者態的cpu上下文,載入核心態的cpu上下文,結束後相反,其中發生了兩次cpu上下文切換。這一切都在同乙個程序中進行,會消耗系統資源,但並不是程序的cpu上下文切換。
程序的上下文切換比系統呼叫多一步,在儲存當前程序的核心狀態和cpu暫存器之前,需要先把該程序的虛擬記憶體和棧等儲存下來,而載入了下乙個程序的核心狀態和cpu暫存器之後,還需要重新整理下乙個程序的虛擬記憶體和棧等。
程序上下文切換次數較多,很容易導致cpu將大量時間耗費在暫存器、核心棧以及虛擬記憶體等資源的儲存和恢復上,大大縮短了真正執行程序的時間。導致平均負載公升高。
執行緒的上下文切換
執行緒和程序的區別,執行緒是排程的基本單位,程序時資源擁有的基本單位,怎麼理解呢?所謂核心中的任務排程,實際上排程的物件是執行緒,而程序時給執行緒提供虛擬記憶體、全域性變數等資源的。
你也可以這樣理解:
當程序只有乙個執行緒時,可以認為程序就等於執行緒;
當程序擁有多個執行緒時,這些執行緒共享相同的虛擬記憶體和全域性變數等資源,這些資源在上下文切換時並不需要修改。
當執行緒也有自己的私有資料時,比如自己的棧和暫存器,上下文切換時也需要儲存。
根據上面描述的,執行緒的上下文切換就存在兩種情況:
前後切換的兩個執行緒是屬於同乙個程序,兩個執行緒的資源基本是共享的,切換上下文時共享的資源不需要動,只有當執行緒有私有資料時,切換這些不共享的資料即可;
前後切換的兩個程序不屬於同乙個程序,跟切換程序的上下文時一樣的。
切換同一程序的執行緒比切換程序消耗更少的系統資源,這就是多執行緒對比多程序的優勢。
中斷上下文切換
中斷處理擁有比程序更高的優先順序
為了快速響應硬體的事件,中斷處理會打斷程序的正常排程和執行,轉而執行中斷處理程式,響應裝置事件。在打斷程序時,需要將當前程序的狀態儲存下來,中斷結束後,再恢復到原有的狀態。
中斷上下文切換不涉及到程序的使用者態。所以即便中斷過程打斷的是乙個正在處於使用者態的程序,也不需要儲存和恢復這個程序的虛擬記憶體和全域性變數等使用者態資源。中斷上下文只包括核心態中斷服務程式執行所必須的狀態,包括cpu暫存器、記憶體堆疊、硬體中斷引數等。
一般中斷程式都是短小的。力求盡快執行完成,但當發生過多的中斷次數時,也可能帶來嚴重的系統效能問題。
by kocor
CPU上下文切換
linux任務執行前,cpu都要知道從任務從 載入 又從 開始執行,也就是說,需要系統事先幫它設定好cpu暫存器和程式計數器 cpu上下文 cpu暫存器和程式計數器 cpu暫存器 cpu內建容量小 速度極快的記憶體 程式計數器 儲存cpu正在執行的指令位置 或者即將執行的下一條指令位置 把前乙個任務...
CPU 上下文切換
乙個酒店,裡面滿滿的客人在吃飯,好比是,酒店裡面的所有人速速離開酒店,讓下一波客人吃。好比是 酒店裡的客人不需要離開酒店,但是服務員就是不給他們上菜,因為服務員去給 vip 客戶服務去了,好在 vip 客戶比較好說話,很快就伺候好了,服務員再來給酒店裡的客人服務 不好意思,這道菜的工序比較複雜,讓您...
筆記 cpu上下文,上下文切換
cpu 上下文 cpu 暫存器,是 cpu 內建的容量小 但速度極快的記憶體。而程式計數器,則是用來儲存 cpu 正在執行的指令位置 或者即將執行的下一條指令位置。它們都是 cpu 在執行任何任務前,必須的依賴環境。cpu 上下文切換 就是先把前乙個任務的 cpu 上下文 也就是 cpu 暫存器和程...