浅谈 内存:内存 两大问题:1. 如何 分配 内存 ? 2. 如何 回收 释放 的 内存
系统 从 可利用 空间表中 寻找 合适 大小的 内存 分配给用户,并 将 释放的 内存 重新 插入 可利用空间表里,以便 下次 继续 分配给用户。可是 怎么 分配 和 回收呢?
内存的分配与回收 有三种策略:1. 首次拟合法 2. 最佳拟合法 3.最差拟合法
1.首次拟合法,
内存分配:从 利用空间表里 从 表头 顺序 查找 第一个 满足大小的 内存,并将其分配给用户,所以其 分配 算法时间 复杂度 为 O(n),n为表长
内存回收:直接 插在表头,时间复杂度 为 O(1)
2.最佳拟合法,
内存分配:从 表里 寻找 一个 大于 等于 并且 最接近 指定 大小的 内存。所以 每次 查找 需要 遍历 表。为了 不用 每次 都遍历 表,将 表 节点 按空间 从小 到大 排列。分配时间复杂度 为 O(n),n为表长
内存回收:需要 按 顺序 插入 指定的位置, 时间 复杂度 也是 O(n)
3.最差拟合法:
内存分配:与 表里 寻找 一个 大于等于 并且 是 最大 的 内存。所以 也需要 遍历表。为了不用每次都遍历表,将 表 节点 从 大 到小排列。查找 时间 复杂度为O(1),(最大的总是在第一个)
内存回收:同样 需要 按 顺序 插入 指定位置。时间复杂度O(n)
所以 从效率上来说: 首次 拟合法 > 最差拟合法 > 最佳拟合法
但是 不同 策略 适合 不同的场景:
最佳 拟合法 总是 寻找 最接近的内存,有可能 生成 一些 存储量非常小的内存,造成 无法 分配。但是 同时 也 保留了 很大的内存 以备 以后 分配 大内存之需。适合 内存分配大小 比较 广的情况。
最差拟合法:总是寻找 最大的内存,从而使空闲表的 大小 接近 均匀。适合 分配内存大小 比较窄的情况。
首次拟合法:内存分配是 随机的,因此它 介于 两者之间。
三种策略 都会 造成 一些 内存 非常小的空间,从而 使 这些 内存空间 无法 被分配。为了更有效的利用内存,需要 将 相邻的空闲的内存 合并成一个 更大的内存。
今天的 边界标识法 ,其中的 一种方法。
边界标识法 在 内存 的头部 和尾部 的边界 设置 一个标记, 标记 这个 内存 是空闲 还是 被占用。这使得 在 释放 空间时,