堆在哪里?

时间:2014-10-30 00:03:59

标签: memory-management linux-kernel linux-device-driver virtual-memory

据我所知,在Linux中,mm_struct描述了进程的内存布局。我也理解start_brkbrk分别标记进程堆部分的开始和结束。

现在,这是我的问题:我有一个进程,我编写了源代码,使用malloc分配5.25 GB的堆内存。但是,当我使用内核模块检查进程的mm_sruct时,我发现其值等于135168.这与我的预期不同:我期望brk - start_brk略高于5.25 GB。

那么,这里发生了什么?

感谢。

1 个答案:

答案 0 :(得分: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而不是堆。