内存分配与回收
最后更新于:2022-04-02 04:05:28
[TOC]
## 内存分配的过程
### 1. 单一连续分配
- 单一连续分配是最简单的内存分配方式
- 只能在单用户、单进程的操作系统中使用
### 2. 固定分区分配
- 固定分区分配是支持多道程序的最简单存储分配方式
- 内存空间被划分为若干固定大小的区域
- 每个分区只提供给一个程序使用,互不干扰
### 3. 动态分区分配
- 根据进程实际需要,动态分配内存空间
- 相关数据结构、分配算法
1. 动态分区空闲表数据结构: 在表中,标记0标识空闲,1表示使用
2. 动态分区空闲链数据结构:连续的空闲可以合成一个
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/23/9d/239d2db640f8a4eb02acbdd5d2bce606_2338x894.png)
#### 动态分区分配算法
1. 首次适应算法(FF算法)
- 分配内存时从开始顺序查找适合内存区
- 若没有合适(如大小是否合适)的空闲区,则该次分配失败
- 每次从头部开始,使得头部地址空间不断被划分
2. 最佳适应算法(BF算法)
- 最佳适应算法要求空闲区链表按照容量大小排序
- 遍历空闲区链表找到最佳合适空闲区
![](https://cdn.jsdelivr.net/gh/idcpj/imgs/1599979691652-49E71532-A863-41FE-A543-5D9289611100.png)
3. 快速适应算法(QF算法)
- 快速适应算法要求有多个空闲区链表
- 每个空闲区链表存储一种容量的空闲区
![](https://cdn.jsdelivr.net/gh/idcpj/imgs/1599979776781-BA3B1CBE-BCA4-483B-A3C5-635883B9CC15.png)
## 内存回收的过程
### 场景一:回收区在空闲区下方
- 不需要新建空闲链表节点
- 只需要把空闲区1的容量增大为空闲区即可
### 场景二:回收区在空闲区上方
- 将回收区与空闲区合并
- 新的空闲区使用回收区的地址
### 场景三:回收区在两块空闲区之间
- 将空闲区1、空闲区2和回收区合并
- 新的空闲区使用空闲区1的地址
### 场景三:回收区在两边没有空闲区
- 为回收区创建新的空闲节点
- 插入到相应的空闲区链表中去
';