据我所知,在Linux中,mm_struct
描述了进程的内存布局。我也理解start_brk
和brk
分别标记进程堆部分的开始和结束。
现在,这是我的问题:我有一个进程,我编写了源代码,使用malloc
分配5.25 GB的堆内存。但是,当我使用内核模块检查进程的mm_sruct
时,我发现其值等于135168.这与我的预期不同:我期望brk - start_brk
略高于5.25 GB。
那么,这里发生了什么?
感谢。
答案 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
而不是堆。