我正在查看 brk(2) 的手册页,它说它会增加程序中断,因此会向堆分配更多内存。然而,根据我的理解,堆内存并不总是以它似乎描述的 PROG_TEXT -> PROG_HEAP (prog break) -> PROG_STACK 方式完全虚拟连续。程序堆实际上是连续的吗?如果不是,brk(2) 如何以与手册页描述一致的方式工作?
堆内存可能是连续的,也可能不是连续的。
malloc()
不限于sbrk()
(sbrk()
就是所谓的brk()
...)标准模式是小堆来自brk()
,大堆来自mmap()
;作为 malloc()
的用户,您不需要关心这一点。sbrk()
从而使堆碎片化。在 64 位处理器上,在
brk()
必须放弃并且 malloc()
求助于 mmap()
之前,很有可能会耗尽 RAM;然而这种情况可能会发生。
你的代码真的不应该关心。如果你处于一种你所关心的退化状态(我曾经在 32 位上,我需要几乎所有的地址空间用于单个工作区),那么你的整个程序都受到限制,需要关闭进程的 ASLR。