我是C和堆内存的新手,但仍在努力了解动态内存分配。
我跟踪了Linux系统调用,发现如果我使用malloc请求少量的堆内存,则malloc在内部调用brk
但是,如果我使用malloc请求大量的堆内存,则malloc在内部调用mmap
因此brkmmap之间必须有很大的区别,但是从理论上讲,无论请求的大小如何,我们都应该能够使用brk分配堆内存。那么,为什么在分配大量内存时malloc调用mmap

最佳答案

那么,为什么在分配大容量内存时malloc调用mmap?
简短的答案是提高Linux的较新实现的效率,以及随之而来的更新的内存分配算法。但是请记住,这是一个非常依赖于实现的主题,并且对于所讨论的特定Linux OS的不同年份和风格,其理由为何会有所不同。
Here is fairly recent write-up有关低级部分mmap()brk()在Linux内存分配中的作用。而且,不是最近,但仍然很相关的Linux Journal文章,其中包含一些非常适合此处主题的内容,包括:

关于brk():
incidentally,“... mmap()在Unix的早期版本中不存在。brk()是当时增加进程数据段大小的唯一方法。Unix的第一个版本使用mmap()是SunOS在80年代中期,第一个开源版本是1990年的BSD-Reno。”从那时起,内存分配算法的现代实现已经进行了许多改进,从而得以重构,从而大大减少了使用brk()进行存储分配算法的需求。

10-07 21:45