{eval=Array;=+count(Array);}

国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

問答專欄Q & A COLUMN

Linux是如何記錄進程資源的?你能從C語言源代碼層面分析下嗎?

MoAirMoAir 回答0 收藏1
收藏問題

1條回答

imtianx

imtianx

回答于2022-06-28 11:06

謝邀。

其實簡單來說,進程無非就是處于運行期的程序及其相關資源的總和。這里讀者應該注意“相關資源”一詞,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 索引。

歡迎在評論區一起討論,質疑。文章都是手打原創,每天最淺顯的介紹C語言、linux等嵌入式開發,喜歡我的文章就關注一波吧,可以看到最新更新和之前的文章哦。

評論0 贊同0
  •  加載中...

最新活動

您已邀請0人回答 查看邀請

我的邀請列表

  • 擅長該話題
  • 回答過該話題
  • 我關注的人
向幫助了您的網友說句感謝的話吧!
付費偷看金額在0.1-10元之間
<