内存分配与回收

最后更新于: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的地址 ### 场景三:回收区在两边没有空闲区 - 为回收区创建新的空闲节点 - 插入到相应的空闲区链表中去
';