任何操作系统是否为malloc()实现缓冲区?

8
在for/while/do中进行许多c/malloc()可能会消耗大量时间,因此我很好奇是否有任何操作系统可以缓冲内存以进行快速分配。
我一直在思考,是否可以通过编写“贪婪”的malloc包装器来加速malloc。例如,当我请求1MB的内存时,初始分配器将分配10MB,第2、3、4等调用malloc函数时,malloc函数将仅从最初分配的块返回内存。当然,如果没有足够的可用内存,您需要分配一个新的贪婪内存块。
不知怎么地,我认为有人以前肯定做过这个或类似的事情。所以我的问题很简单:这是否会显着加速内存分配过程。(是的,我可以在提问之前尝试它,但如果没有必要写这样的东西,我就太懒了)

1
只是为了澄清,malloc 是 C 运行时库的一部分,而不是操作系统。malloc 以及操作系统内存服务通常会进行缓存和缓冲以加速分配。 - Adrian McCarthy
5个回答

3

我不久前浏览了Google Chrome代码,发现了http://www.canonware.com/jemalloc/

它是一个自由、通用且可扩展的malloc实现。

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

绝对值得一看!


3
所有版本的malloc()都会在一定程度上执行您描述的缓冲操作-它们将获取比当前请求更大的块,并使用这个大块来满足多个请求,但仅限于某些请求大小。这意味着每次以16字节为单位的多个请求只需要从操作系统获取更多内存50-100次左右,或者类似这些通用行。
不太清楚的是边界大小是多少。它可能是他们一次分配4 KiB的相对较小倍数。较大的请求- MiB 大小的请求-每当无法从空闲列表中满足请求时,都会向系统返回更多内存。但该阈值通常远小于1 MiB。
一些版本的malloc()允许您调整它们的分配特性,程度不同。这是一个丰富的研究领域-有许多不同的系统。请参见 Knuth 的'计算机程序设计艺术'第1卷(基本算法)中的一组讨论。

2
那种技术被称为Slab Allocator,大多数操作系统都支持它,但我找不到信息表明它可以用于用户空间的malloc,只能用于内核分配。
你可以在这里找到Jeff Bonwick的论文,该论文描述了Solaris上的原始技术。

GLib有一个内存池 - http://library.gnome.org/devel/glib/stable/glib-Memory-Slices.html,但更常用的是glibc malloc。 - Steve-o

1

Google有一个贪婪的malloc()实现,大致上做了你想的事情。它有一些缺点,但在许多使用情况下非常快。


-2
你所说的可能已经完成了,我不是很清楚。然而,我不知道在系统层面上缓存你的malloc()会减少多少延迟。你仍然需要花时间进入特权模式进行系统调用,潜在地锁定内核级结构(这意味着更多的系统调用和等待锁),以及类似的事情。
如果你能在用户空间编写自己的内存管理器,并且只在需要为您的池申请更多内存时才调用malloc(),那么你很可能会看到延迟降低。

malloc的实现是在用户模式下的,因为它们是在C运行时中的。即使Windows的HeapAlloc实现也是在用户模式下。 - Ana Betts
1
@Paul,这在很大程度上取决于操作系统。我不会轻易地做出概括性的结论。你是否将我的断言误解为malloc必须调用特权级函数,并认为malloc本身运行在内核空间中?例如,在POSIX系统上,许多malloc实现依赖于mmap。mmap需要内核级别的支持才能运行。 - San Jacinto
@Paul,说得好,这句话措辞不当。 - San Jacinto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接