2012-07-11 75 views
3

Linux中進程/線程的大小是多少?當創建一個進程/線程時,還有task_struct以及其中的其他數據結構,還有其他什麼嗎?Linux中進程/線程的大小

是在進程/線程初始化(固定大小)分配的進程/線程的棧?還是在必要時分配(如虛擬內存)?

如何知道標準進程/線程在內存中創建時的大小?

回答

3

當在Linux上首次分配大塊內存(>頁面大小= 4096字節)時,它會在頁表中使用特殊的「空白」內存頁面,這些內存頁面不會被任何內容支持,所以當一個線程啓動時它將分配〜1 MB的線程堆棧的這些零頁。隨着堆棧的增長,頁面將被轉換爲真實的內存支持頁面。由於這種「空白」頁面的支持,通常可以使用非常大的堆棧。

線程和進程都使用名爲clone(2)的相同底層系統調用來創建。它有很多選擇,並做很多東西。有關詳細說明,請參閱man clone

http://linux.die.net/man/2/clone

的存儲器大塊被分配與匿名MMAP(2)呼叫。

您可能也有興趣做的「Linux的過量使用位」

網絡搜索(如果你想改進你的問題,我可以更具體。)

+0

謝謝。所以,每個線程都保留1MB的堆棧大小。然而,你說線程的內存只在真正需要的時候被分配,這意味着物理內存不會損失另一個物理內存1MB,直到線程向內存寫入內容爲止。如果是這種情況,請考慮我的內核是50 MB(例如),我的內存是70 MB,我仍然可以分配超過20個線程嗎?或者內核實際在物理內存中保留1MB? – Amumu 2012-07-11 14:01:15

+0

另外,當我輸入'uname -a'時,我的堆棧大小限制爲8192 kb。這是每個進程/線程的上限嗎? – Amumu 2012-07-11 14:02:07

+0

Linux上的每個進程是不是也獲得了自己的一堆可以增長到幾MB的頁表? – 2012-07-11 15:54:15

1

什麼安德魯說這是真的,但這並不意味着你的線程/進程在創建時不會「使用內存」。爲堆棧保留的空間在您的進程中始終消耗虛擬地址空間,這意味着對於大型線程堆棧,您將快速耗盡32位機器上的地址(僅在glibc上使用默認線程堆棧大小的約300個線程將會排空虛擬地址空間)。另外,堆棧貢獻了提交費用,這決定了過度使用禁用時可分配的總內存量。

Linux的默認預提交128K主線程的堆棧,並允許更多,如果承諾費尚未用盡,被自動獲得。線程堆棧完全由用戶空間分配(大多數Linux系統上的glibc/NPTL),並且不能超出其初始大小。根據版本和系統設置,glibc/NPTL通常默認爲每個線程分配2 MB到10 MB之間的某個地方。

+0

謝謝。 'uname -a'顯示的堆棧大小以千字節爲單位?最後,線程的大小是'thread_info struct'''內核棧(8KB)''''線程堆棧(用戶堆棧,2MB〜10MB)'的大小'? – Amumu 2012-07-11 15:13:24

+0

這是關於32位虛擬地址空間用完的好處。我住在64位的土地,這不是一個問題。 – 2012-07-11 18:02:53