在linux中,上下文又叫CPU上下文,是CPU執行任何任務前,必須依賴的環境,包括CPU暫存器和程式計數器;而上下文切換就是先把前一個任務的CPU上下文(也就是CPU暫存器和程式計數器)儲存起來,然後載入新任務的上下文到這些暫存器和程式計數器,最後再跳轉到程式計數器所指的新位置,執行新任務。
程式設計師必備介面測試偵錯工具:
本教學操作環境:linux7.3系統、Dell G3電腦。
Linux是一個多工的作業系統,它支援遠大於CPU數量的任務同時執行,當然,這些任務實際上並不是真正的在同時執行,而是系統在很短的時間內,將CPU輪流分配給他們,給使用者造成很多工同時執行的錯覺。
在每個任務執行前, CPU 都需要知道任務從哪裡載入,又從哪裡開始執行。也就是說,需要系統事先給他設定好 CPU 暫存器和程式計數器(Program Counter,PC)
CPU 暫存器:是 CPU 內建的容量小、但速度極快的記憶體
程式計數器:是用來儲存 CPU 正在執行的指令位置、或者即將執行的下一條指令位置
綜上所述,我們就有答案了
我們通常說的上下文又叫CPU上下文,是CPU執行任何任務前,必須依賴的環境,包括CPU 暫存器和程式計數器
上下文切換:就是先把前一個任務的 CPU 上下文(也就是 CPU 暫存器和程式計數器)儲存起來,然後載入新任務的上下文到這些暫存器和程式計數器,最後再跳轉到程式計數器所指的新位置,執行新任務。
根據CPU切換執行任務的不同,又可以分為程序上下文切換
、執行緒上下文切換
、中斷上下文切換
我們先了解下面2個上下文切換涉及的知識點系統呼叫、程序執行態
程序的執行態:
Linux 按照特權等級,把程序的執行空間分為核心空間
和使用者空間
。在這兩種空間中執行的程序狀態分別稱為核心態
和使用者態
。
核心空間(Ring 0):具有最高許可權,可以直接存取所有資源(讀取檔案,)
分配記憶體、IO操作、建立子程序……都是核心操作。這也表明,當IO操作頻繁時,System引數會很高。
使用者空間(Ring 3):只能存取受限資源,不能直接存取記憶體等硬體裝置,必須通過系統呼叫進入到核心中,才能存取這些特權資源
典型的使用者態空間程式有:Shells、資料庫、web伺服器、PHP程式、Java程式……
在linux系統使用top命令檢視cpu時,能看到user和system兩項,對應的就是使用者態和核心態佔用的cpu資源
如上,我們的web服務是執行在使用者態
下的,對檔案的io沒有許可權,當需要讀取檔案時,就涉及到系統呼叫了
系統呼叫:
從使用者態到核心態的轉變,需要通過系統呼叫來完成。比如檢視檔案時,需要執行多次系統呼叫:open、read、write、close等。系統呼叫的過程如下:
把 CPU 暫存器裡原來使用者態的指令位置儲存起來;
為了執行核心程式碼,CPU 暫存器需要更新為核心態指令的新位置,最後跳轉到核心態執行核心任務;
系統呼叫結束後,CPU 暫存器需要恢復原來儲存的使用者態,然後再切換到使用者空間,繼續執行程序;
所以,一次系統呼叫的過程,其實是發生了兩次 CPU 上下文切換。
程序執行終止,它之前順頌的CPU就會被釋放出來,這時就從就緒佇列中取出下一個等待時間片的程序;
當某個程序的時間片耗盡,它就會被系統掛起,切換到其他等待CPU的程序執行;
某個程序因為需要的系統資源比較大(比如記憶體不足),這時候該程序會被掛起,系統會排程其他程序執行;
當有優先順序更高的程序(系統操作程序)需要時間片,為了保證優先順序更高的程序能夠執行,當前程序會被掛起;
如果當前程序中有sleep函數,他也會被掛起;
對作業系統來說,執行緒是最小的執行單元,程序是最小的資源管理單元。說白了,所謂核心中的任務呼叫,實際上的排程物件是執行緒;而程序只是給執行緒提供了虛擬記憶體、全域性變數等資源。所以,對於現場和程序,我們可以這麼理解:
當程序只有一個執行緒時,可以認為程序就等於執行緒。
當程序擁有多個執行緒時,這些執行緒會共用父程序的資源(即共用相同的虛擬記憶體和全域性變數等資源)。這些資源在上下文切換時是不需要修改的。
另外,執行緒也有自己的私有資料,比如棧和暫存器等,這些在上下文切換時也是需要儲存的。
綜上,執行緒上下文切換有兩種情況:
前後兩個執行緒屬於不同程序,因為資源不共用,所以切換過程就跟程序上下文切換是一樣的;
前後兩個執行緒屬於同一個程序,因為虛擬記憶體是共用的,所以在切換時,虛擬記憶體這些資源就保持不動,只需要切換執行緒的私有資料、暫存器等不共用的資料。
中斷處理會打斷程序的正常排程和執行。在打斷其他程序時,需要將程序當前的狀態儲存下來,中斷結束後,程序仍然可以從原來的狀態恢復執行。
中斷上下文切換並不涉及到程序的使用者態。所以,即便中斷過程打斷了一個正處在使用者態的程序,也不需要儲存和恢復這個程序的虛擬記憶體、全域性變數等使用者態資源。中斷上下文,其實只包括核心態中斷服務程式執行所必須的狀態,包括 CPU 暫存器、核心堆疊、硬體中斷引數等。
小結
根據Tsuna的測試報告,每次上下文切換都需要幾十納秒到數微妙的CPU時間,這個時間還是相當可觀的。
不管是哪種場景導致的上下文切換,你都應該知道:
CPU上下文切換,是保證Linux系統正常工作的核心功能之一,一般情況下不需要我們特別關注。
但過多的上下文切換,會把CPU時間消耗在暫存器、核心棧以及虛擬記憶體等資料的儲存和恢復上,從而縮短程序真正執行的時間,導致系統的整體效能大幅下降。
相關推薦:《Linux視訊教學》
以上就是linux中的上下文是什麼的詳細內容,更多請關注TW511.COM其它相關文章!