首頁  >  文章  >  運維  >  linux中的上下文是什麼

linux中的上下文是什麼

青灯夜游
青灯夜游原創
2022-11-10 20:09:221892瀏覽

在linux中,上下文又叫CPU上下文,是CPU運行任何任務前,必須依賴的環境,包括CPU暫存器和程式計數器;而上下文切換就是先把前一個任務的CPU上下文(也就是CPU暫存器和程式計數器)被保存起來,然後載入新任務的上下文到這些暫存器和程式計數器,最後再跳到程式計數器所指的新位置,執行新任務。

linux中的上下文是什麼

本教學操作環境:linux7.3系統、Dell G3電腦。

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、資料庫、網頁伺服器、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中的上下文是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn