概述
1 | #内存管理机制 |
前提
动态内存管理,肯定会出现堆区 已用 未用 交替的情况
内存分配的重要性
内存管理策略与内存分配效率是衡量系统性能的重要因素
内存分配策略
动态内存池
原理
- 系统启动前,预先分配一块区域
- 将内存分为 固定大小 [ 4B 8B 16B] 的区域
- 用链表链接起来
特点
- 效率高: 内存释放与分配只是链表的增 删操作
- 内存浪费: 大小固定,预先分配
- 适合固定的数据结构进行空间的分配 [TCP首部 IP首部]
动态内存堆
原理
仅存在一个空闲内存块,长度m 大于用户的请求n
m中前n个字节返回给用户,剩余的
m-n
个字节,重新组织一个空闲块多个空闲块,长度大于n
首次拟合
申请: 从空闲链表头查找,找到第一个
释放: 插入链表头
最佳拟合
申请: 空闲链表中找到长度和n最接近的空闲块 [空闲链表一般按照大小排序]
释放: 遍历链表插入到合适的位置[大小顺序]
最差拟合
申请: 空闲链表按照大小排序,每次都将链表头的内存分配给用户[最大的区域]
释放: 遍历链表插入到合适的位置[大小顺序]
特点
- 最佳拟合
- 内存请求大小范围较广 [每次分配都是找最接近的,大的空闲块会被保护不被使用]
- 缺点: 产生很小甚至无法被使用的内存块
- 最差拟合
- 内存请求大小范围较窄 [每次选择最大的,使得各个块大小趋于均匀]
- 首次拟合
- 不知道内存请求范围 [ 分配是随机的]
动态内存池
1 | 只能分配固定大小的内存空间,用户必须知道各个类型的POOL,以及这个类型POOL的个数 |
源码文件
memp.c
memp.h
结构体
1 | 1. memp_t : 每个类型 宏定义,枚举 |
函数
1 | void memp_init(void); |
memp_init
- memp_memory : 各个类型缓冲池每项 链接成链表
- memp_tab : 各个类型缓冲池 链表头部
memp_alloc
从对应的链表中取出内存,并返回
memp_free
动态内存堆
本质: 对一个事先定义好的内存块进行合理有效的组织和管理
数据结构
1 | 1. 内存块大小具有最小限制,MIN_SIZE = 12 |
C语言技巧
枚举定义
1 | typedef enum { |
1 |
|
1 | typedef enum { |