0

我知道在Linux中mm_struct描述了一個進程的內存佈局。我也明白start_brkbrk分別標記一個進程的堆部分的開始和結束。堆在哪裏?

現在,這是我的問題:我有一個用於編寫源代碼的進程,它使用malloc分配5.25 GB的堆內存。然而,當我檢查使用一個內核模塊我發現的價值的過程中的mm_sruct等於135168.這是跟我想象的不同:我的預期brk - start_brk將高於5.25 GB等於輕微。

那麼,究竟是怎麼回事?

謝謝。

+0

@ hcs擊敗了我。我建議您閱讀http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/其中它說:「在Linux中,如果通過的malloc申請一個大的內存塊() C庫將創建這樣的匿名映射,而不是使用堆內存,'Large'意味着大於MMAP_THRESHOLD字節,默認情況下爲128 kB,可通過mallopt()進行調整。整篇文章值得一讀。 – RJinman 2014-10-30 00:53:41

回答

2

我注意到在manpage for malloc(3)以下:

通常,malloc()函數從堆中分配內存,並調整爲所需的堆的大小,使用SBRK(2)。當分配大於MMAP_THRESHOLD字節的內存塊時,glibc malloc()實現使用mmap(2)將內存分配爲專用匿名映射。 MMAP_THRESHOLD默認爲128 kB,但可以使用mallopt(3)進行調整。使用mmap(2)執行的分配不受RLIMIT_DATA資源限制的影響(請參閱getrlimit(2))。

所以它聽起來像mmap被用來代替堆。

+0

感謝hcs和@Rob Jinman。現在問題是'mm_struct'中描述的內存在哪裏? – hebbo 2014-10-30 01:49:57