【总结笔记】brk()与 mmap() —— Linux 分配内存的 2 种方式
参考链接:https://www.cnblogs.com/vinozly/p/5489138.html
1 brk() 分配内存
若 malloc() 小于 128 K 的内存,则使用 brk() 分配内存,将堆顶指针向高地址推【堆是从低地址向高地址扩展】,并且 只是分配虚拟内存空间 ,只有在真正访问(读/写)数据时,才会引起内核缺页中断,内核向 OS 申请分配物理内存,并建立虚拟内存空间-物理内存空间的映射关系。
下述图示省略了内存的 文件映射区

brk() 分配内存特点:
低地址内存必须在高地址内存的释放之后才能得到的释放 【这就是内存碎片的原因之一】 ,否则高地址内存处于 brk() 之后,会被当左未分配内存而被重写覆盖。当然未释放的低地址内存会被标记为空闲区,若再来一个刚好等于此个低地址内存空间的请求,malloc() 可能就再次把它给分配出去。
- 默认情况下:
当最高地址空间的空闲内存超过128K(可由M_TRIM_THRESHOLD选项调节)时,执行内存紧缩操作(trim)
2 mmap() 分配内存
若 malloc() 大于 128 K 的内存,则使用 系统调用mmap() 分配内存。与 brk() 分配内存不同的是,mmap() 分配的内存可以单独释放。


浙公网安备 33010602011771号