1.Linux内存管理(三)--内存分配之malloc
Linux内存管理(三)--内存分配之malloc
本文将探讨 Linux 中动态内存分配的源码核心机制,特别是源码 malloc 函数的运作原理。开源社区提供了丰富的源码内存分配器,其中 glibc 中的源码 ptmalloc2 就是基于 dlmalloc 并引入多线程支持的实例。malloc 的源码源码位于 glibc-2.\malloc\malloc.c 文件中,它实际上是源码bitcoinj+源码分析指向内部实现的别名 __libc_malloc。
动态内存分配主要通过两个系统调用完成:mmap 和 brk。源码当所需内存大小超过预设阈值(默认KB)时,源码使用mmap分配;否则,源码采用brk分配。源码这一策略旨在平衡系统调用的源码频繁程度与内存分配的效率。
为了提升效率,源码malloc 实际上利用了池化思想,源码c 2048源码预先分配较大的源码内存块,以便在后续请求时直接使用,源码避免频繁调用系统调用。这一过程涉及多个核心数据结构的使用,包括 arena、malloc_state、snprintf c源码heap_info、chunk 等。
arena 被用来表示连续的堆区域,分为 main arena 和 thread arena。main arena 作为全局变量存在于 libc.so 的数据段中,不需维护多个堆,阜新远程源码且可通过 sbrk 扩展堆段。在内存耗尽时,main arena 可以通过 sbrk 或 mmap 扩展堆段至遇到内存映射段。另一方面,thread arena 的数量有限,以减少开销,spring 源码 csdn当线程数量超过 arena 数量时,arena 开始共享。
heap_info 用于存储堆的元数据,当一个 thread arena 的堆空间耗尽时,新的堆会映射到该 thread arena 中。chunk 则是描述内存分配的基本单位,包含 chunk 的大小、上一个 chunk 的状态信息以及对齐需求。
在内存组织方面,存在多种类型的 chunk,包括已分配 chunk、空闲 chunk、top chunk 和 last remainder chunk。top chunk 位于 arena 的最顶部,用于处理所有 bin 中未找到合适空闲内存的情况。当 top chunk 大小不合适时,它会被分割或通过系统调用扩容。
关于 free chunk 的管理、brk 与 mmap 的详细解释将在后续文章中深入探讨。更多关于内存管理的内容可参考《嵌入式 Linux 笔记》专栏。请在引用时注明出处。