Где "куча"? - PullRequest
       14

Где "куча"?

4 голосов
/ 14 июня 2011

Я просто хочу знать, где находится (если присутствует!) Куча моего процесса bash (pid = 16457) в результате 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

Ответы [ 3 ]

6 голосов
/ 14 июня 2011

"Куча", к которой обращается большинство людей, это строка:

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

т.е. это область памяти, созданная и расширяемая с помощью системного вызова brk, сразу после сегментов .data и .bss основной программы.

Можно также рассмотреть следующее как часть «кучи»:

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

Кажется, это анонимное отображение, созданное mmap для обслуживания большого malloc запроса. Большинство реализаций malloc используют mmap для больших запросов, чтобы они могли munmap передать его на free и вернуть весь блок памяти ОС. Это также делает calloc намного быстрее, так как вы гарантированно получите обнуленные страницы таким образом.

1 голос
/ 14 июня 2011

Куча четко обозначена как [heap] в текущих версиях Linux. Ваш список не показывает это. Вы уверены, что случайно не вырезали его при копировании на свой вопрос?

На моей раковине:

~% grep '\[heap' /proc/$$/maps
00bca000-00d2e000 rw-p 00000000 00:00 0                                  [heap]
0 голосов
/ 14 июня 2011

Как правило, куча помечается [heap] при вызове malloc; однако, вы заметите, что если вы продолжите увеличивать кучу с несколькими строками кода malloc (), этот диапазон не будет расти; однако будут созданы новые записи в пустых строках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...