我知道在Linux中mm_struct
描述了一個進程的內存佈局。我也明白start_brk
和brk
分別標記一個進程的堆部分的開始和結束。堆在哪裏?
現在,這是我的問題:我有一個用於編寫源代碼的進程,它使用malloc
分配5.25 GB的堆內存。然而,當我檢查使用一個內核模塊我發現的價值的過程中的mm_sruct
等於135168.這是跟我想象的不同:我的預期brk - start_brk
將高於5.25 GB等於輕微。
那麼,究竟是怎麼回事?
謝謝。
我知道在Linux中mm_struct
描述了一個進程的內存佈局。我也明白start_brk
和brk
分別標記一個進程的堆部分的開始和結束。堆在哪裏?
現在,這是我的問題:我有一個用於編寫源代碼的進程,它使用malloc
分配5.25 GB的堆內存。然而,當我檢查使用一個內核模塊我發現的價值的過程中的mm_sruct
等於135168.這是跟我想象的不同:我的預期brk - start_brk
將高於5.25 GB等於輕微。
那麼,究竟是怎麼回事?
謝謝。
我注意到在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
被用來代替堆。
感謝hcs和@Rob Jinman。現在問題是'mm_struct'中描述的內存在哪裏? – hebbo 2014-10-30 01:49:57
@ 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