共計 2613 個字符,預計需要花費 7 分鐘才能閱讀完成。
本文丸趣 TV 小編為大家詳細介紹“linux 上下文指的是什么”,內容詳細,步驟清晰,細節處理妥當,希望這篇“linux 上下文指的是什么”文章能幫助大家解決疑惑,下面跟著丸趣 TV 小編的思路慢慢深入,一起來學習新知識吧。
在 linux 中,上下文又叫 CPU 上下文,是 CPU 運行任何任務前,必須依賴的環境,包括 CPU 寄存器和程序計數器;而上下文切換就是先把前一個任務的 CPU 上下文(也就是 CPU 寄存器和程序計數器)保存起來,然后加載新任務的上下文到這些寄存器和程序計數器,最后再跳轉到程序計數器所指的新位置,運行新任務。
1. 什么是上下文?
Linux 是一個多任務的操作系統,它支持遠大于 CPU 數量的任務同時運行,當然,這些任務實際上并不是真正的在同時運行,而是系統在很短的時間內,將 CPU 輪流分配給他們,給用戶造成很多任務同時運行的錯覺。
在每個任務運行前,CPU 都需要知道任務從哪里加載,又從哪里開始運行。也就是說,需要系統事先給他設置好 CPU 寄存器和程序計數器(Program Counter,PC)
CPU 寄存器:是 CPU 內置的容量小、但速度極快的內存
程序計數器:是用來存儲 CPU 正在執行的指令位置、或者即將執行的下一條指令位置
綜上所述,我們就有答案了
什么是上下文:
我們通常說的上下文又叫 CPU 上下文,是 CPU 運行任何任務前,必須依賴的環境,包括 CPU 寄存器和程序計數器
上下文切換:就是先把前一個任務的 CPU 上下文(也就是 CPU 寄存器和程序計數器)保存起來,然后加載新任務的上下文到這些寄存器和程序計數器,最后再跳轉到程序計數器所指的新位置,運行新任務。
2. 上下文切換詳細介紹
根據 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 的版本有:Deepin、UbuntuKylin、Manjaro、LinuxMint、Ubuntu 等版本。其中 Deepin 是國內發展最好的 Linux 發行版之一;UbuntuKylin 是基于 Ubuntu 的衍生發行版;Manjaro 是基于 Arch 的 Linux 發行版;LinuxMint 默認的 Cinnamon 桌面類似 Windows XP 簡單易用;Ubuntu 則是以桌面應用為主的 Linux 操作系統。
讀到這里,這篇“linux 上下文指的是什么”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注丸趣 TV 行業資訊頻道。