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

成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

問(wèn)答專欄Q & A COLUMN

Linux是如何記錄進(jìn)程資源的?你能從C語(yǔ)言源代碼層面分析下嗎?

MoAirMoAir 回答0 收藏1
收藏問(wèn)題

1條回答

imtianx

imtianx

回答于2022-06-28 11:06

謝邀。

其實(shí)簡(jiǎn)單來(lái)說(shuō),進(jìn)程無(wú)非就是處于運(yùn)行期的程序及其相關(guān)資源的總和。這里讀者應(yīng)該注意“相關(guān)資源”一詞,Linux 在內(nèi)核中是如何記錄進(jìn)程的資源的呢?

Linux內(nèi)核如何記錄進(jìn)程的資源?

首先應(yīng)該明白,Linux 內(nèi)核大都是采用C語(yǔ)言編寫(xiě)的,因此要弄清楚內(nèi)核如何記錄進(jìn)程資源,只需要查看相關(guān)的C語(yǔ)言代碼就可以了。事實(shí)上,Linux 內(nèi)核是使用 task_struct 結(jié)構(gòu)體描述進(jìn)程的資源的,它的C語(yǔ)言部分代碼如下,請(qǐng)看:

task_struct 結(jié)構(gòu)體很長(zhǎng),在我手中的 Linux 內(nèi)核C語(yǔ)言源代碼中,它占用了280行。當(dāng)然了,這其中包含很多條件編譯部分,在 32 位機(jī)器上,task_struct 大約要占用 1.7 KB 的內(nèi)存空間,不過(guò)考慮到它可以管理完整的進(jìn)程,1.7kB 其實(shí)并不算大了。

鑒于 task_struct 結(jié)構(gòu)體過(guò)長(zhǎng),這里不可能將其成員一一介紹清楚。如果讀者和我一樣好奇,粗略的瀏覽 task_struct 結(jié)構(gòu)體,應(yīng)該能夠發(fā)現(xiàn)一些比較令人熟悉的成員,例如:

通過(guò)C語(yǔ)言注釋以及成員的變量名,能夠看到 task_struct 結(jié)構(gòu)體包含了文件系統(tǒng),線程結(jié)構(gòu)體,以及進(jìn)程打開(kāi)的文件等信息,這就與上一節(jié)文章的內(nèi)容對(duì)應(yīng)上了。其他成員在我之后的文章中會(huì)涉及到,這里暫不贅述。

在創(chuàng)建進(jìn)程時(shí),Linux 通過(guò) slab 分配器分配 task_struct 結(jié)構(gòu),這樣可以避免動(dòng)態(tài)分配和釋放帶來(lái)的開(kāi)銷,提高內(nèi)存的使用效率。

那么創(chuàng)建 task_struct 結(jié)構(gòu)后,內(nèi)核如何訪問(wèn)它呢?

根據(jù)我手上的內(nèi)核C語(yǔ)言源代碼,Linux 中還有一個(gè)結(jié)構(gòu)體 thread_info,它的其中一個(gè)成員 task 指針正好適合用于索引 task_struct 結(jié)構(gòu)體,在X86_64平臺(tái)上,thread_info 的相關(guān)C語(yǔ)言代碼如下,請(qǐng)看:Linux 通常會(huì)在內(nèi)核棧底或者棧頂保留 thread_info 結(jié)構(gòu),而內(nèi)核棧通常大小都是可知的,因此每個(gè)進(jìn)程都能方便的從自己的棧中找到 thread_info 結(jié)構(gòu),進(jìn)而找到 task_struct 結(jié)構(gòu)。

查找當(dāng)前進(jìn)程的 thread_info 結(jié)構(gòu),可以調(diào)用 current_thread_info() 函數(shù),它的C語(yǔ)言代碼如下,請(qǐng)看:

可見(jiàn),current_thread_info() 函數(shù)其實(shí)就是通過(guò)進(jìn)程棧計(jì)算的,因此它的實(shí)現(xiàn)與平臺(tái)架構(gòu)有關(guān),上述C語(yǔ)言代碼其實(shí)只是 arm 平臺(tái)的實(shí)現(xiàn)方法,其他平臺(tái)的實(shí)現(xiàn)方法,讀者可自行查閱。

此時(shí),要獲取當(dāng)前進(jìn)程的資源,可以通過(guò) current_thread_info()->task 索引。

歡迎在評(píng)論區(qū)一起討論,質(zhì)疑。文章都是手打原創(chuàng),每天最淺顯的介紹C語(yǔ)言、linux等嵌入式開(kāi)發(fā),喜歡我的文章就關(guān)注一波吧,可以看到最新更新和之前的文章哦。

評(píng)論0 贊同0
  •  加載中...

相關(guān)問(wèn)題

最新活動(dòng)

您已邀請(qǐng)0人回答 查看邀請(qǐng)

我的邀請(qǐng)列表

  • 擅長(zhǎng)該話題
  • 回答過(guò)該話題
  • 我關(guān)注的人
向幫助了您的網(wǎng)友說(shuō)句感謝的話吧!
付費(fèi)偷看金額在0.1-10元之間
<