以下是在solaris上运行后的结果,它显示有两个堆,但在我的理解中,对于一个进程,只有一个堆是一个大的连续内存,可以由brk管理以扩展或收缩尺寸。对于anon内存,进程可以有许多anon内存,可以由mmap / munmap管理。我的理解是否正确?或者我错误地读了pmap的结果?
sol9 #pmap -sx pgrep testprog
... 00022000 3960 3960 3960 - 8K rwx-- [heap]
00400000 131072 131072 131072 - 4M rwx-- [heap]
... FF390000 8 8 - - 8K r-x-- libc_psr.so.1
FF3B0000 8 8 8 - 8K rwx-- [anon]
...
总Kb 135968 135944 135112 -
答案 0 :(得分:4)
你是正确的并且误读了pmap输出。如果你已经完成了pmap -x
,结果可能会更少混淆,只显示一次堆,但是由于你添加了-s
标志,它会将堆分解为具有不同页面映射的段。
从0x0022000开始的地址未正确对齐以映射到4Mb页面,因此它们使用3960kb的8k页面。 0x0022000 +(3960 * 1024)= 0x00400000
在0x00400000处,地址已正确对齐4Mb页面,因此堆切换到使用较少页表条目的较大页面。
如果你想确保你的堆开始正确对齐以使用4Mb页面而不是以8k开始直到它到达对齐边界,那么你将链接你的程序与-M /usr/lib/ld/map.bssalign
做这一点。
可以在Page Size and Memory Layout blog post作者Solaris Application Programming的Darryl Gove中找到更深入的解释。