我是C和堆内存的新手,但仍在努力了解动态内存分配。
我跟踪了Linux系统调用,发现如果我使用malloc
请求少量的堆内存,则malloc
在内部调用brk
。
但是,如果我使用malloc
请求大量的堆内存,则malloc
在内部调用mmap
。
因此brk
和mmap
之间必须有很大的区别,但是从理论上讲,无论请求的大小如何,我们都应该能够使用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()
进行存储分配算法的需求。