我一直在思考是否可以通过为malloc编写一个“贪婪”的包装来加速malloc。例如。当我要求1MB内存时,初始分配器将分配10MB,而在第二,第三,第四等...调用malloc函数将简单地从首先分配“正常”方式的块返回内存。当然,如果没有足够的可用内存,你需要分配一个新的贪婪的内存块。
不知何故,我认为某人之前必须做过这样或类似事情。所以我的问题很简单:这是否能够显着加快内存分配过程。 (是的,我可以在提出问题之前尝试过,但如果没有必要,我只是懒得写这样的东西)
答案 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(),则可能会看到延迟减少。