以下是结果在Solaris上运行后,它显示有两个堆,但在我的理解,一个过程,只有一个堆这是一个大的连续内存,并且可以通过BRK进行管理,以扩大或缩小规模.对于anon内存,进程可以有许多anon内存,可以由mmap/munmap管理.我的理解是否正确?或者我错误地读了pmap的结果?
sol9 #pmap -sx pgrep testprog
... 00022000 3960 3960 3960 - 8K rwx-- [堆]
00400000 131072 131072 131072 - 4M rwx-- [堆]
...... FF390000 8 8 - - 8K rx-- libc_psr.so.1
FF3B0000 8 8 8 - 8K rwx-- [匿名]
...
总Kb 135968 135944 135112 -
您是正确的,但误解了 pmap 输出。如果您这样做了pmap -x,结果可能不会那么混乱,只显示一次堆,但由于您添加了该-s标志,它会将堆分解为具有不同页面映射的段。
从 0x0022000 开始的地址未正确对齐以映射到 4Mb 页,因此它们使用 8k 页中的 3960kb。0x0022000+(3960*1024) = 0x00400000
在 0x00400000 处,地址已正确对齐 4Mb 页,因此堆切换为使用具有较少页表条目的较大页。
如果您想确保堆以正确的对齐方式开始,以便在整个过程中使用 4Mb 页面,而不是从 8k 开始,直到达到对齐边界,那么您可以链接您的程序来-M /usr/lib/ld/map.bssalign执行此操作。
可以在Solaris 应用程序编程作者Darryl Gove的页面大小和内存布局博客文章中找到更深入的解释。