文章目录
- 一、用户空间内存管理 ( malloc / free / ptmalloc / jemalloc / tcmalloc )
- 二、内核空间内存管理
-
- 1、内核内存管理系统调用 ( sys_brk | sys_mmap | sys_munmap )
- 2、sys_brk、sys_mmap 系统调用
一、用户空间内存管理 ( malloc / free / ptmalloc / jemalloc / tcmalloc )
" 应用程序 " 通过使用
C 中的 malloc
/ free
函数 ,
或者 C 中的 new
/ delete
函数 ,
glibc 提供的 ptmalloc
函数 , FreeBSD 提供的 jemalloc
函数 , Google 提供的 tcmalloc
函数 ,
操作 堆内存 ;
上述函数 都是 " 用户空间 " 操作内存的函数 ;
malloc
/ free
函数 是 glibc 函数库 ( GNU 发布的 libc 库 ) 的 " 内存分配器 " , 由 ptmalloc
函数提供 内存操作接口 ;
glibc 库提供的 ptmalloc
函数 的原理是 , 调用 Linux 内核 提供的 brk / mmap 系统调用接口 , 以 " 内存页 “ 为单位 , 申请内存 , 然后将申请的内存 分成 ” 内存块 “ 分配给 用户空间 的 ” 应用程序 "
二、内核空间内存管理
1、内核内存管理系统调用 ( sys_brk | sys_mmap | sys_munmap )
在 " 内核空间 " 中 , 调用 Linux 内核中的 sys_brk
/ sys_mmap
/ sys_munmap
函数 , 管理 " 堆内存 " ;
sys_brk
通过修改 堆内存 的 终止地址 , 扩张 / 收缩 堆内存 ;sys_mmap
在 " 内存映射区 " 分配 " 虚拟内存页 " ;sys_munmap
释放 " 虚拟内存页 " ;
上述函数属于 " 虚拟内存管理 “ , 虚拟内存管理 从 ” 进程虚拟地址空间 “ 分配 / 释放 ” 虚拟内存页 " ;
2、sys_brk、sys_mmap 系统调用
可参考 【Linux 内核 内存管理】Linux 内核堆内存管理 ② ( 动态分配堆内存方式 | brk 系统调用 | mmap 系统调用 | brk 系统调用源码介绍 ) 博客 ;
① brk 系统调用 : 该方式本质是 设置 " 进程数据段 “ 的 结束地址 , 将该 ” 结束地址 " 向 高或低 移动 , 实现堆内存的 扩张或收缩 ;
② mmap 系统调用 : 向 Linux 操作系统 申请 " 虚拟地址空间 " 内存 , 并且将某个文件 " 映射 “ 到该申请的内存中 ; 如果 不需要映射文件 到该空间中 , 则该空间就是 ” 匿名空间 " , 可作为 " 堆内存 " 使用 ;