linux內核概述

用戶態和內核態

在理解linux內核之前,首先要知道什麼是用戶態,什麼是內核態,什麼是用戶進程,什麼是內核進程

  • 用戶進程:我們編寫的程序都屬於用戶進程
  • 內核進程:以內核態運行在內核地址空間,不與用戶直接交互,不需要終端設備,在系統啓動後一直處於活躍狀態直到關機
  • 用戶態:用戶進程的大部分時間都處在用戶態下,只有需要內核所提供的服務時纔會切換到內核態
  • 內核態:用戶進程調用系統調用、處理CPU異常、設備向CPU發出中斷請求、執行內核線程(進程),這四種情況都需要在內核態執行

用戶態和進程態來回切換是一筆很大的開銷

什麼是進程描述符

保存內存指針、CPU寄存器信息、保存程序將要執行的下一條指令,所以可以保證進程從它停止的地方恢復執行

什麼是可重入內核

可重入內核,意味着若干個進程可以同時在內核態下執行。當內核代表某一進程發出一個讀磁盤請求時,就讓磁盤控制器處理這個請求,然後恢復執行其他進程,當設備滿足了讀請求時,就會有一箇中斷通知內核,從而恢復執行之前的進程。所以可重入內核能夠掛起因中斷而停止執行的進程。

什麼是內核控制路徑

內核控制路徑表示內核處理系統調用、異常、或中斷所執行的指令序列。在最簡單的情況下,CPU從第一條指令執行到最後一條指令順序地執行內核控制路徑,然而當下面任何一個事件發生時,CPU交錯執行內核控制路徑:

  • 運行在用戶態的進程調用一個系統調用,而相應的內核控制路徑無法立即處理這個請求,此時內核控制路徑調用調度程序選擇一個新的進程運行,發生進程切換,第一個內核控制路徑還沒完成,而CPU又開始執行其他的內核控制路徑。
  • 運行第一個內核控制路徑時,CPU檢測到異常,該控制路徑被掛起,CPU開啓第二個新的控制路徑處理異常,異常處理完畢後繼續運行第一個內核控制路徑。
  • CPU正在運行一個啓用了中斷的內核控制路徑時,一個硬件中斷髮生,第一個內核控制路徑還沒執行完,CPU開始執行另一個內核控制路徑來處理這個硬件中斷。當這個硬件中斷處理程序終止時,第一個內核控制路徑恢復繼續運行。
  • 在支持搶佔調度的內核中,當前進程被另一個更高優先級的進程開始執行,第一個內核控制路徑還沒有執行完,又開始執行另一個優先級更高的內核控制路徑

什麼是進程地址空間

每個進程運行在它的私有地址空間,在用戶態運行的進程涉及到私有棧、數據區、代碼區。當在內核態運行時,進程訪問內核的數據區和代碼區,但使用的是另外的私有棧。

如果同一個程序由幾個用戶同時使用,則這個程序只被裝入內存一次,其指令由所有需要他的用戶共享,但是數據不被共享,每個用戶端擁有獨立的數據,這種共享地址空間的操作由內核自動完成以節省內存。

進程之間可以共享部分地址空間,被稱作共享內存,可以實現進程間通信。

如果同一文件由幾個進程同時打開,那麼每個進程地址空間都包含有它的內存映射。

臨界區和進程同步

一段代碼,進入這段代碼的進程必須全部執行完成,其他進程才能進入,這段代碼被稱爲臨界區。

進程同步用來處理多個進程同時訪問臨界區的情況。

常見的兩種處理進程同步的方式:

  • 信號量機制:每個數據結構都對應一個信號量對象,其中包含整數變量、等待進程的鏈表、兩個原子方法down和up。每個信號量的初始值都是1,當內核控制路徑希望訪問這個數據結構時,它在相應的信號量上執行down方法,將計數器-1,如果計數器爲0,則允許執行,如果計數器的值小於0,則把正在運行的進程加入到這個信號量鏈表,然後阻塞該進程(即調用進程調度程序)。當正在訪問數據結構的進程處理結束後,執行up方法,對計數器+1,然後允許鏈表上的另一個進程繼續執行
  • 自旋鎖:如果修改數據結構的操作所需時間非常短,爲了檢查信號量,內核必須把進程插入到信號量鏈表中,然後掛起它,因爲這兩種操作比較費時,完成這些操作時其他的內核控制路徑可能已經釋放了信號量。在這些情況下,多處理機系統使用自旋鎖,當進程發現鎖被另一個進程鎖着時,它就不停地旋轉,直到鎖打開,然後去處理相應的數據結構。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章