2011-06-14 137 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