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