【问题标题】:heap management堆管理
【发布时间】:2012-07-15 02:47:52
【问题描述】:

我知道有一个元数据存储了在free()realloc() 期间我们只提供指针时使用的辅助信息。

我对堆没有什么疑问。

  • 堆栈是按进程分配的。毫无疑问,但不确定堆。堆信息是否是全局维护的,否则每个进程都会有一些机制来保存有关为该特定进程分配的内存的信息。

  • 如何维护堆信息?我猜散列机制。我也用谷歌搜索并尝试过。他们中的大多数人将其解释为特定于实现的......就像那样。

【问题讨论】:

  • 因为您使用“进程/线程”来表示同一件事:进程与线程不同。 While each thread has its own stack, threads share memory, including the heap。进程不会。
  • k @ArjunShankar。离开线程。请考虑过程。我的目标是了解堆是如何完成的。
  • 好的。我建议你考虑编辑你的问题。由于使用“线程/进程”引起的混乱,已经写了一个答案。

标签: linux operating-system heap-memory


【解决方案1】:

是的,堆也是每个进程的。

有一些堆实现使用每线程堆来减少锁争用,但这是(用户空间)堆管理器的实现细节。

【讨论】:

    【解决方案2】:

    堆和栈一样,是每个进程的,并且是(几乎)纯用户空间的东西。

    堆管理器使用sbrk 系统调用通知操作系统它打算增加所需的内存量。除了将一系列页面从“未知”更改为“现有、零、从未访问过”(这实际上意味着它们仍然不存在,但操作系统假装它们存在)之外,这几乎没有什么作用。当一个页面第一次被访问时,它会出错,并且操作系统会从零池中拉出一个零页。
    (它可能稍微复杂一些,因为如果从顶部释放了大量内存,堆管理器也可能会缩小数据段,但基本上就是这么简单)。

    这就是操作系统对堆的全部了解。其他所有事情,例如拆分块、将释放的块放入列表或类似结构以及重用块都发生在堆管理器内部,它直接或间接(例如作为 glibc 的一部分)是程序的一部分。

    堆管理器的具体工作取决于实现,至少存在六种众所周知的不同 malloc 实现,它们以不同的方式工作。参见例如this onethis onethis one

    堆栈以相同或相似的方式工作。某个内存范围最初是“保留”的,但实际上并未保留任何内容(即,不创建页面)。提交了一些页面(即创建),最后一页被写保护或不存在,这以一种特殊的方式被记住。当堆栈增长到最后一页被触及时,就会发生错误。然后从零池中拉出一个新页面,前提是堆栈仍在其允许的大小范围内。

    当进程终止时,对这些页面的所有引用都将被删除,并且(假设它们没有与仍然持有引用的另一个进程共享)移交给低优先级后台任务,该任务将它们清零并将它们添加到“零池”。

    【讨论】:

      【解决方案3】:

      阅读这个,它有点旧('07),但有 Damon 概述的相关细节

      http://www.blackhat.com/presentations/bh-usa-07/Ferguson/Whitepaper/bh-usa-07-ferguson-WP.pdf

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-18
        • 2011-01-10
        • 1970-01-01
        • 1970-01-01
        • 2017-10-02
        • 2012-11-17
        相关资源
        最近更新 更多