Linux中的堆内存是连续的吗?

问题描述 投票:0回答:1

我正在查看 brk(2) 的手册页,它说它会增加程序中断,因此会向堆分配更多内存。然而,根据我的理解,堆内存并不总是以它似乎描述的 PROG_TEXT -> PROG_HEAP (prog break) -> PROG_STACK 方式完全虚拟连续。程序堆实际上是连续的吗?如果不是,brk(2) 如何以与手册页描述一致的方式工作?

linux unix memory-management heap-memory osdev
1个回答
0
投票

堆内存可能是连续的,也可能不是连续的。

  1. malloc()
    不限于
    sbrk()
    sbrk()
    就是所谓的
    brk()
    ...)标准模式是小堆来自
    brk()
    ,大堆来自
    mmap()
    ;作为
    malloc()
    的用户,您不需要关心这一点。
  2. 应用程序可能会调用
    sbrk()
    从而使堆碎片化。

在 64 位处理器上,在

brk()
必须放弃并且
malloc()
求助于
mmap()
之前,很有可能会耗尽 RAM;然而这种情况可能会发生。

你的代码真的不应该关心。如果你处于一种你所关心的退化状态(我曾经在 32 位上,我需要几乎所有的地址空间用于单个工作区),那么你的整个程序都受到限制,需要关闭进程的 ASLR。

© www.soinside.com 2019 - 2024. All rights reserved.