malloc 是否担心 Linux 内核中的内部碎片? 例如,当我想分配 5 个页面时,malloc 会将大小四舍五入以使其幂为 2:5->8,以避免内核中的内部碎片,因为 linux 内核使用好友系统作为页面分配器。
至少对于 glibc 来说,它并不真正关心内核中的碎片。它主要是一个"最合适"的分配器,除了非常小或非常大的分配。以下是glibc的"malloc.c"顶部附近的评论摘录:
为什么要使用这个malloc?
这不是最快、最节省空间、最便携或 有史以来最可调的马洛克。然而,它是最快的之一 同时也是最节省空间、便携和可调谐的产品之一。 在这些因素之间保持一致的平衡可以产生良好的通用性 用于 malloc 密集型程序的分配器。 算法的主要属性是:
- 对于大型(>= 512 字节(请求,它是一个纯粹的最佳拟合分配器, 通常通过FIFO决定(即最近最少使用(的关系。
- 对于小型(默认为 <= 64 字节(请求,它是一个缓存 分配器,用于维护快速回收的块池。
- 介于两者之间,对于大型和小型请求的组合,它确实 尽最大努力同时实现这两个目标。
- 对于非常大的请求(默认为>= 128KB(,它依赖于系统 内存映射工具(如果支持(。
有关较长但略微过时的高级说明,请参阅 http://gee.cs.oswego.edu/dl/html/malloc.html
glibcmalloc
实现是相当可调的,使用mallopt
函数或各种环境变量来设置各种参数,如手册页 mallopt(3( 中所述。