连续内存分配
简单内存管理
- 内存碎片:不能被利用的空间内存
- 外部碎片:在分配单元间的未使用内存
- 内部碎片:在分配单元中的未使用内存,已经分配,无法使用
- 分区的动态分配
- 简单内存管理:给需要运行的程序分配一个连续的内存区间
- 算法:
- 首次适配:
- 基本原理:简单
- 实现: 寻找第一个适合的空闲块进行分配
- 需求:
1. 按地址排序的空闲块链表
2. 分配需要寻找一个合适的分区
3. 重分配需要检查,看是否自由分区能合并于相邻的空闲分区(若有) - 优势:简单 易于产生大的空闲块,向着地址空间的结尾
- 劣势:外部碎片 不确定性
- 最优适配:
- 基本原理: 寻找最适合满足分配请求的空闲块进行分配
为了避免分割大的空闲块
为了最小化外部碎片产生的尺寸 - 需求:
1. 按尺寸排列的空闲块链表
2. 分配需要寻找一个合适的分区
3. 重分配需要搜索及合并于相邻的空闲分区(若有) - 优势: 当大部分分配是小尺寸时非常有效 比较简单
- 劣势: 外部碎片 重分配慢 易产生很多没用的微小碎片(不怎么好)
- 基本原理: 寻找最适合满足分配请求的空闲块进行分配
- 最差适配(找到一个与内存分配请求的大小差距最大的空闲块)
- 原理:为了避免太多的微笑块
- 需求:
1. 按尺寸排列的空闲块链表
2. 分配很快(获得最大分区)
3. 重分配 - 优势:分配是中等尺寸效果最好
- 劣势:重分配慢 外部碎片 易于破碎大的空闲块以至于大分区无法被分配
- 首次适配:
- 算法:
没有最好的算法 各有利弊
压缩式(紧致)和交换式内存管理
- 压缩式:将内存中运行的程序位置挪动,为后面的程序腾出大的空闲空间
- 需要考虑的问题:
什么时候进行挪动? 程序在等待中挪动,不能在运行时挪动
+拷贝开销大 如果频繁操作)
- 需要考虑的问题:
- 交换:将硬盘当做备份,将等待的程序挪动到硬盘,腾出空间
- 问题: 选择哪一个换出,什么时候
交换力度:单个程序 如果程序较大 则开销大
- 问题: 选择哪一个换出,什么时候
非连续内存分配
为什么要用非连续?
- 连续缺点:
- 分配给一个程序的物理内存是连续的
- 内存利用率低
- 有内存碎片
通过非连续改善这些问题
- 非连续好处:
- 更好的内存利用和管理
- 共享代码与数据
- 支持动态加载和动态链接
- 非连续缺点 : 在于管理开销本身
建立虚拟地址和物理地址转换
- 软件方面 :开销大
- 硬件方面:
-
分段
- 程序的分段地址空间
代码角度:各个断 主程序 子程序 共享库
数据角度:栈段 堆段
段表硬件实现 操作系统进行初始化
- 程序的分段地址空间
-
分页
- 帧 物理内存被分割成大小相等的帧
- 页 程序的逻辑地址空间被划分为大小相等的页
-
分段与分页的区别:段大小可变,页大小不可变
-