8

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

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

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

4

5 回答 5

3

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

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

绝对值得一看!

于 2010-09-04T16:04:23.973 回答
3

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

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

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

于 2010-09-04T16:11:13.983 回答
2

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

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

于 2010-09-04T16:10:05.490 回答
1

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

于 2010-09-04T16:16:25.500 回答
-2

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

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

于 2010-09-04T16:08:10.243 回答