核心是一個行程嗎?

核心是一個行程嗎?
  1. 在Linux中,我們總是說第一個進程是init(pid==1)。但為什麼不是核心(啟動)來設定係統並創建進程 init。核心是一個行程嗎?
  2. 我們知道所有使用者空間執行緒都以 init 程序為根。那麼調度程序和其他核心內容(例如記憶體管理)又如何呢?

基本上,讓我困惑的是核心的結構。如果是進程,是單一進程,還是由多個進程組成?

答案1

簡短的答案:

  1. 不,這不是一個過程
  2. 使用者執行緒不以 init 為根。

Init只是第一個進程;它不管理任何進程或線程。它確實使用核心系統呼叫 fork() 和 exec 創建了一些。

我認為您對流程是什麼有一個模糊的概念。它不僅僅意味著執行一些程式碼。是的,核心在 init 之前執行(引導程式甚至在 init 之前執行)。但「過程」有一個具體的定義:

  • 運行在使用者空間
  • 使用進程 ID 運行
  • 很多互動都需要經過內核
  • 所有資源都需要來自內核
  • 需要內核調度

因此,一旦核心初始化,它就會運行 init,然後它會產生其配置指定的任何其他進程。

就 #2 而言,所有核心內容都在核心中。將核心視為一大塊程式碼。同樣,這不是一個進程,而是一個大的程式碼區塊。核心的一部分處理記憶體管理,一部分處理其自身的調度部分(如驅動程式等),一部分處理調度進程。

答案2

核心的行為根本不像一個行程。它不會被調度,它要么代表進程運行(所謂的進程上下文或用戶上下文),要么作為中斷或異常的結果運行(所謂的中斷上下文)。

也就是說,Linux 核心產生核心執行緒來執行某些任務,或避免在中斷上下文中執行某些內容太長時間(這就是 ksoftirqd 執行緒的作用,避免過度延遲,從而導致音訊遺失等) 。

您可以在命令的輸出中看到內核線程ps。他們很容易識別:他們的名字位於括號之間。其中一些每個 CPU 運行一個實例,CPU 透過斜線後的數字進行標識,因此 [ksoftirqd/0] 是 CPU 0 上的 ksoftirqd 實例。

答案3

微核心中有一些概念,其中核心的各個部分確實是進程,而主要哨兵大多只管理 IPC。

Linux——無論好壞——都不是一個微核心系統。

答案4

ninjalj 寫道:“內核的行為根本不像進程。它不會被調度。”

好吧,有一個空閒進程(基本上是 pid 0,儘管它沒有在任何地方顯示),它是被調度的並且幾乎始終處於可運行狀態。

相關內容