内存管理目录:
1. 操作系统内存管理方面的任务
- 抽象:逻辑地址空间。不需要考虑复杂的实际物理地址空间。
- 保护:独立地址空间。进程之间程序运行不相互影响。
- 共享:访问相同内存。
- 虚拟化:更多的地址空间。最需要的放到内存中。
2. 在操作系统中管理内存的不同方法
- 程序重定位(逻辑地址和物理地址转换)
- 分段
- 分页
- 虚拟内存
- 按需分页虚拟内存
实现高度依赖于硬件。
必须知道内存架构。
MMU(内存管理单元):硬件组件负责处理CPU的内存访问请求。
3. 一种简单的内存管理方法
- 当一个程序准许运行在内存中时,分配一个连续的区间。
- 分配一个连续的内存区间给运行的程序以访问数据。
- 碎片问题
-
- 外碎片:还没有分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的空闲区域。
- 内碎片:已经分配出去(明确指出属于哪个进程),却不能被利用的内存空间。
4. 连续分配策略
(1) 首次适配
- 需求
- 按地址排序的空闲块列表
- 分配需要寻找一个合适的分区
- 重分配需要检查,看是否自由分区能合并于相邻的空闲分区
- 优势
- 简单
- 易于产生更大的空间块
- 劣势
- 外部碎片问题
- 不确定性
(2) 最优适配
- 为了避免分割大空闲块
- 为了最小化外部碎片产生的尺寸
- 需求
- 按尺寸排列的空闲块列表
- 分配需要寻找一个合适的分区
- 重分配需要搜索及合并于相邻的空闲分区
- 优势
- 当大部分是小尺寸时非常有效
- 比较简单
- 劣势
- 外部碎片
- 重分配慢
- 易产生很多没用的微小碎片
(3) 最差适配
- 为了避免有太多微小的碎片
- 需求;
- 按尺寸排列的空闲块列表
- 分配很快(获得最大的分区)
- 重分配需要合并于相邻的空闲分区,若有,然后调整空闲块列表
- 优势
- 假如分配是中等尺寸效果最好
- 劣势
- 重分配慢
- 外部碎片
- 易于破碎大的空闲块以致打分去无法被分配
5. 碎片整理
- 压缩式碎片整理
- 移动内存空间,减少碎片。
- 交换式碎片整理
- 内存中没有空间,借用硬盘上的空间。当前没有用的程序放到硬盘。
6. 非连续内存分配
- 连续内存分配的缺点:
- 分配给一个程序的物理内存是连续的
- 内存利用率低
- 有外碎片和内碎片问题
- 非连续分配的优点:
- 一个程序的物理地址空间是非连续的
- 更好的内存利用和管理
- 允许共享代码与数据(共享库等…)
- 支持动态加载和动态链接
- 非连续分配缺点
- 如何建立虚拟地址和物理地址之间的转换?
硬件方案/软件方案
- 如何建立虚拟地址和物理地址之间的转换?
两种硬件方案
- 分段(更好的分类和共享)
- 程序的分段地址空间
- 分段寻址方案
- 分页(绝大多数CPU使用)
- 划分物理内存至固定大小的帧
- 划分逻辑地址空间至相同大小的页
- 建立方案:转换逻辑地址为物理地址(pages to frames)
页表和MMU/TLB
7. 分页机制
一个程序的逻辑地址空间被划分为大小相等的页
- 页内偏移的大小=帧内偏移的大小
- 页号大小<>帧号大小
页寻址机制
- 页映射到帧
- 页是连续的虚拟内存
- 帧是非连续的物理内存
- 不是所有的页都有对应的帧
分页机制的性能问题
- 访问一个内存单元需要2次内存访问
- 页表可能非常大
- 解决方法
-
- TLB:空间换时间
- 间接访问(二级页表/多级页表):时间换空间
大地址空间问题
- 有大地址空间,前向映射页表变得繁琐。
- 不是让页表与逻辑地址空间的大小相对应,而是让页表与物理地址空间的大小相对应。
- 解决方案
- 反向页表
- 页表的大小不在和逻辑地址直接相关,而是和物理地址相关。
- 技术要求较高。缓存,哈希。
- 反向页表