【问题标题】:Does any operating system implement buffering for malloc()?是否有任何操作系统为 malloc() 实现缓冲?
【发布时间】:2010-09-04 15:46:18
【问题描述】:

for/while/do 中的大量 c/malloc() 会消耗大量时间,所以我很好奇是否有任何操作系统为快速 malloc 缓冲内存。

我一直在思考是否可以通过为 malloc 编写“贪婪”包装器来加速 malloc。例如。当我要求 1MB 的内存时,初始分配器将分配 10MB,然后在第 2、3、4 等...调用 malloc 函数将简单地从首先以“正常”方式分配的块返回内存。当然,如果没有足够的可用内存,您将需要分配一个新的贪婪内存块。

不知何故,我认为以前一定有人做过这个或类似的事情。所以我的问题很简单:这是否会显着加快内存分配过程。 (是的,我可以在提问之前尝试过,但如果没有必要,我只是懒得写这样的东西)

【问题讨论】:

  • 澄清一下,malloc 是 C 运行时库的一部分,而不是操作系统。 malloc 以及操作系统内存服务通常会进行缓存和缓冲以加快分配速度。

标签: c memory malloc allocation calloc


【解决方案1】:

malloc() 的所有版本都会在某种程度上对您描述的类型进行缓冲——它们将获取比当前请求更大的块并使用大块来满足多个请求,但最多只能达到一定的请求大小。这意味着一次 16 字节的多个请求将只需要每 50-100 次调用一次从 o/s 获得更多内存,或者类似这些一般线路。

不太清楚的是边界大小是多少。他们很可能一次分配一些相对较小的 4 KiB 倍数。更大的请求 - MiB 大小的请求 - 每次无法从空闲列表中的内容中满足请求时,都会返回系统以获取更多内存。不过,该阈值通常远小于 1 MiB。

malloc() 的某些版本允许您或多或少地调整其分配特征。它一直是一个肥沃的研究领域——许多不同的系统。有关一组讨论,请参阅 Knuth 'The Art of Computer Programming' Vol 1(基本算法)。

【讨论】:

    【解决方案2】:

    前段时间在浏览 Google Chrome 代码时,我发现了http://www.canonware.com/jemalloc/。 它是一种免费、通用且可扩展的 malloc 实现。

    显然,它已在许多项目中使用,因为它在许多实际场景(许多小分配而不是少数大分配)中通常优于标准 malloc 的实现。

    绝对值得一看!

    【讨论】:

      【解决方案3】:

      该技术称为Slab Allocator,大多数操作系统都支持它,但我找不到用户空间 malloc 可用的信息,仅用于内核分配。

      您可以找到 Jeff Bonwick here 的论文,该论文描述了 Solaris 上的原始技术。

      【讨论】:

      【解决方案4】:

      Google 有一个 malloc() 的贪婪实现,它大致完成了您的想法。它有一些缺点,但在许多用例中都非常快。

      【讨论】:

        【解决方案5】:

        你说的可能已经完成了,我真的不知道。但是,我不知道在系统级别缓冲 malloc() 的延迟会大大降低延迟。您仍然需要花时间进入 priv。系统调用的模式,潜在的锁定内核级结构(这意味着更多的系统调用和等待锁定),以及这种性质的事情。

        如果您可以在用户空间为您的程序编写自己的内存管理器,并且仅在您的池需要更多内存时调用 malloc(),您可能会看到延迟减少。

        【讨论】:

        • malloc 实现 处于用户模式,因为它们处于 C 运行时。甚至 Windows HeapAlloc 实现也处于用户模式。
        • @Paul,这在很大程度上取决于操作系统。我不会这么快概括。您是否混淆了我关于 malloc 必须调用 priv.-level 函数的断言与说 malloc 本身在内核空间中运行?例如,许多 malloc 实现依赖于 POSIX 系统上的 mmap。 mmap 需要内核级支持才能运行。
        • @Paul,很公平,措辞不好。
        猜你喜欢
        • 2022-01-13
        • 2010-11-27
        • 2012-08-27
        • 1970-01-01
        • 1970-01-01
        • 2018-10-06
        • 2010-09-27
        • 2012-03-09
        • 2012-01-09
        相关资源
        最近更新 更多