成人AV在线无码|婷婷五月激情色,|伊人加勒比二三四区|国产一区激情都市|亚洲AV无码电影|日av韩av无码|天堂在线亚洲Av|无码一区二区影院|成人无码毛片AV|超碰在线看中文字幕

linux查詢進(jìn)程有幾種方式 linuxtop查看的是進(jìn)程還是線程?

linuxtop查看的是進(jìn)程還是線程?top命令的每一行顯示一個進(jìn)程,后綴-H(ThrLinux是如何記錄進(jìn)程資源的?你能從C語言源代碼層面分析下嗎?謝謝邀請我。其實簡單來說,一個進(jìn)程無非就是正在運(yùn)行

linuxtop查看的是進(jìn)程還是線程?

top命令的每一行顯示一個進(jìn)程,后綴-H(Thr

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

謝謝邀請我。

其實簡單來說,一個進(jìn)程無非就是正在運(yùn)行的程序及其相關(guān)資源的總和。讀者應(yīng)該注意單詞 "相關(guān)資源 "給你。Linux如何在內(nèi)核中記錄進(jìn)程的資源?

Linux內(nèi)核如何記錄一個進(jìn)程的資源?首先我們要明白,Linux內(nèi)核大部分都是用C語言編寫的,所以要搞清楚內(nèi)核是如何記錄進(jìn)程資源的,我們只需要看看相關(guān)的C語言代碼就可以了。事實上,Linux內(nèi)核使用task_struct結(jié)構(gòu)來描述進(jìn)程的資源。它的C語言代碼如下。請看:

Task_struct結(jié)構(gòu)很長,占了我手里L(fēng)inux內(nèi)核C語言源代碼的280行。當(dāng)然還有很多有條件的編譯部分。在32位的機(jī)器上,task_struct大約占用1.7kB的內(nèi)存空間,但考慮到它可以管理一個完整的進(jìn)程,1.7 KB并不算大。

鑒于task_struct的結(jié)構(gòu)比較長,這里不可能把它的成員介紹清楚。如果讀者和我一樣好奇,粗略瀏覽一下task_struct結(jié)構(gòu),應(yīng)該能找到一些熟悉的成員,比如:

通過C語言中的注釋和成員的變量名可以看到,task_struct結(jié)構(gòu)中包含了文件系統(tǒng)、線程結(jié)構(gòu)、進(jìn)程打開的文件等信息,與上一篇文章的內(nèi)容相對應(yīng)。其他成員會在我后面的文章中涉及,所以我贏了 這里暫時不細(xì)說。

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

那么在task_struct結(jié)構(gòu)創(chuàng)建之后,內(nèi)核是如何訪問它的呢?根據(jù)我手里的內(nèi)核C語言源代碼,Linux中還有一個結(jié)構(gòu)thread_info,它的一個成員任務(wù)指針正好適合索引task_struct結(jié)構(gòu)。在X86_64平臺上,thread_info的相關(guān)C語言代碼如下。請看:Linux通常把thread_info結(jié)構(gòu)放在內(nèi)核棧的底部或頂部,內(nèi)核棧的大小通常是已知的,所以每個進(jìn)程都可以很容易地從自己的棧中找到thread_info結(jié)構(gòu),然后找到task_struct結(jié)構(gòu)。

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

可以看出,current_thread_info()函數(shù)實際上是通過進(jìn)程棧來計算的,所以它的實現(xiàn)與平臺架構(gòu)有關(guān)。上面的C語言代碼其實只是arm平臺的實現(xiàn)方法,讀者可以自己查看其他平臺的實現(xiàn)方法。

此時,要獲取當(dāng)前進(jìn)程的資源,可以使用current_thread_info()-gttask索引。

歡迎在評論區(qū)一起討論提問。這些文章都是手工原創(chuàng)的。每天都有最簡單的C語言、linux等嵌入式開發(fā)介紹。如果你喜歡我的文章,請關(guān)注一波。你可以看到最新的更新和以前的文章。