2011-06-14 134 views
4

我只是想知道在哪里(如果存在的话!)在cat /proc/16457/maps“堆”在哪里?

0078a000-007a0000 r-xp 00000000 08:02 1319336 /lib/ld-2.3.4.so 
007a0000-007a1000 r--p 00015000 08:02 1319336 /lib/ld-2.3.4.so 
007a1000-007a2000 rw-p 00016000 08:02 1319336 /lib/ld-2.3.4.so 
007a9000-008cf000 r-xp 00000000 08:02 1384495 /lib/tls/libc-2.3.4.so 
008cf000-008d1000 r--p 00125000 08:02 1384495 /lib/tls/libc-2.3.4.so 
008d1000-008d3000 rw-p 00127000 08:02 1384495 /lib/tls/libc-2.3.4.so 
008d3000-008d5000 rw-p 008d3000 00:00 0 
008fc000-008fe000 r-xp 00000000 08:02 1319337 /lib/libdl-2.3.4.so 
008fe000-008ff000 r--p 00001000 08:02 1319337 /lib/libdl-2.3.4.so 
008ff000-00900000 rw-p 00002000 08:02 1319337 /lib/libdl-2.3.4.so 
00b27000-00b2a000 r-xp 00000000 08:02 278109  /lib/libtermcap.so.2.0.8 
00b2a000-00b2b000 rw-p 00002000 08:02 278109  /lib/libtermcap.so.2.0.8 
08047000-080d8000 r-xp 00000000 08:02 902412  /bin/bash 
080d8000-080de000 rw-p 00090000 08:02 902412  /bin/bash 
080de000-080e3000 rw-p 080de000 00:00 0 
09ceb000-09d25000 rw-p 09ceb000 00:00 0 
b7d99000-b7d9b000 rw-p b7d99000 00:00 0 
b7d9b000-b7da1000 r--s 00000000 08:02 130808  /usr/lib/gconv/gconv-modules.cache 
b7da1000-b7dd6000 r--s 00000000 08:02 869910  /var/db/nscd/passwd 
b7dd6000-b7fd6000 r--p 00000000 08:02 101088  /usr/lib/locale/locale-archive 
b7fd6000-b7fd8000 rw-p b7fd6000 00:00 0 
bff07000-c0000000 rw-p bff07000 00:00 0 
ffffe000-fffff000 r-xp 00000000 00:00 0 

回答

6

结果我的bash进程(PID = 16457)的堆“”堆大多数人指的就是这一行:

080de000-080e3000 rw-p 080de000 00:00 0 

即它的内存中创建和可膨胀的区域由brk系统调用,紧跟在主程序的.data.bss段。

人们还可以考虑以下的“堆”的一部分:

09ceb000-09d25000 rw-p 09ceb000 00:00 0 

这似乎是mmap创建以服务大malloc要求匿名的映射。大多数malloc实现对大请求使用mmap,因此它们可以在free上使用munmap并将整个内存块返回给操作系统。它也使得calloc快得多,因为你保证以这种方式获得每个归零页面。

1

在当前的Linux版本中,该堆显然标记为[heap]。您的列表不显示它。你确定你在复制到你的问题时并没有意外删除它吗?

在我的壳:

~% grep '\[heap' /proc/$$/maps 
00bca000-00d2e000 rw-p 00000000 00:00 0         [heap] 
0

堆通常出现于标有[堆]当malloc调用被调用;然而,你会注意到,如果你继续用多行malloc()代码来增长堆,那么这个范围不会增长;但是,将创建新的空白行条目。

+0

这取决于分配器,dlmalloc派生的人倾向于对更大的请求使用'mmap()',对于更小的请求使用'brk()',正如@R所提到的那样.. – ninjalj 2011-06-14 18:51:23

+0

很高兴知道,谢谢! – janjust 2011-06-16 13:41:05