mmap在堆中分配内存?

时间:2013-02-19 09:28:28

标签: mmap

我正在阅读维基百科中的mmap并尝试使用此示例http://en.wikipedia.org/wiki/Mmap#Example_of_usage。我用gcc编译了这个程序并运行了valgrind overit。

这是valgrind输出:

# valgrind a.out 
==7018== Memcheck, a memory error detector
==7018== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==7018== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==7018== Command: a.out
==7018== 
PID 7018:   anonymous string 1, zero-backed string 1
PID 7019:   anonymous string 1, zero-backed string 1
PID 7018:   anonymous string 2, zero-backed string 2
==7018== 
==7018== HEAP SUMMARY:
==7018==     in use at exit: 0 bytes in 0 blocks
==7018==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==7018== 
==7018== All heap blocks were freed -- no leaks are possible
==7018== 
==7018== For counts of detected and suppressed errors, rerun with: -v
==7018== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
PID 7019:   anonymous string 2, zero-backed string 2
==7019== 
==7019== HEAP SUMMARY:
==7019==     in use at exit: 0 bytes in 0 blocks
==7019==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==7019== 
==7019== All heap blocks were freed -- no leaks are possible
==7019== 
==7019== For counts of detected and suppressed errors, rerun with: -v
==7019== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

我的问题是

mmap是否在堆上分配内存?如果不是munmap做什么?

2 个答案:

答案 0 :(得分:17)

在类Unix系统上,程序的地址空间由一个或多个虚拟内存区域组成,每个区域由操作系统映射到物理内存,文件或任何内容所有

一般来说,堆是由C运行时创建的一个特定内存区域,由malloc管理(后者又使用brksbrk系统调用来增长收缩)。

mmap是一种创建新内存区域的方法,与malloc无关(因此独立于堆)。 munmap只是它的反转,它会释放这些区域。

答案 1 :(得分:5)

mmapped内存既不是堆也不是堆栈。它被映射到调用进程的虚拟地址空间,但它没有在堆上分配。