回覆列表
  • 1 # IT劉小虎

    其實簡單來說,程序無非就是處於執行期的程式及其相關資源的總和。這裡讀者應該注意“相關資源”一詞,Linux 在核心中是如何記錄程序的資源的呢?

    Linux核心如何記錄程序的資源?

    首先應該明白,Linux 核心大都是採用C語言編寫的,因此要弄清楚核心如何記錄程序資源,只需要檢視相關的C語言程式碼就可以了。事實上,Linux 核心是使用 task_struct 結構體描述程序的資源的,它的C語言部分程式碼如下,請看:

    task_struct 結構體很長,在我手中的 Linux 核心C語言原始碼中,它佔用了280行。當然了,這其中包含很多條件編譯部分,在 32 位機器上,task_struct 大約要佔用 1.7 KB 的記憶體空間,不過考慮到它可以管理完整的程序,1.7kB 其實並不算大了。

    鑑於 task_struct 結構體過長,這裡不可能將其成員一一介紹清楚。如果讀者和我一樣好奇,粗略的瀏覽 task_struct 結構體,應該能夠發現一些比較令人熟悉的成員,例如:

    透過C語言註釋以及成員的變數名,能夠看到 task_struct 結構體包含了檔案系統,執行緒結構體,以及程序開啟的檔案等資訊,這就與上一節文章的內容對應上了。其他成員在我之後的文章中會涉及到,這裡暫不贅述。

    在建立程序時,Linux 透過 slab 分配器分配 task_struct 結構,這樣可以避免動態分配和釋放帶來的開銷,提高記憶體的使用效率。

    那麼建立 task_struct 結構後,核心如何訪問它呢?

    根據我手上的核心C語言原始碼,Linux 中還有一個結構體 thread_info,它的其中一個成員 task 指標正好適合用於索引 task_struct 結構體,在X86_64平臺上,thread_info 的相關C語言程式碼如下,請看:Linux 通常會在核心棧底或者棧頂保留 thread_info 結構,而核心棧通常大小都是可知的,因此每個程序都能方便的從自己的棧中找到 thread_info 結構,進而找到 task_struct 結構。

    查詢當前程序的 thread_info 結構,可以呼叫 current_thread_info() 函式,它的C語言程式碼如下,請看:

    可見,current_thread_info() 函式其實就是透過程序棧計算的,因此它的實現與平臺架構有關,上述C語言程式碼其實只是 arm 平臺的實現方法,其他平臺的實現方法,讀者可自行查閱。

    此時,要獲取當前程序的資源,可以透過 current_thread_info()->task 索引。

  • 中秋節和大豐收的關聯?
  • 熱處理鋁合金淬火工藝7075最高達多少硬度?