有没有操作系统为malloc()实现缓冲?

时间:2010-09-04 15:46:19

标签: c memory malloc allocation calloc

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

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

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

5 个答案:

答案 0 :(得分:3)

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

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

绝对值得一看!

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

Google有一个贪婪的malloc()实现,大致与你的想法相同。它有一些缺点,但在很多用例中速度非常快。

答案 4 :(得分:-2)

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

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