操作系统 第三章 内存
清华大学 陈渝老师 操作系统教程
三、内存
计算机体系结构及内存分层体系
-
计算机体系结构
- CPU:程序/软件执行的控制 - 内存:放置程序的代码及其处理的数据 - 设备 - eg.鼠标、键盘
-
内存分层体系
- 主存(物理内存):放置操作系统本身以及需要运行的代码 - 磁盘(虚拟内存):放置永久存放的数据
-
在操作系统的内存管理范例
-
操作系统中管理内存的4个目标
-
抽象
- 逻辑地址空间
-
保护
- 独立地址空间
-
共享
- 访问相同内存
-
虚拟化
- 更多的地址空间
-
-
操作系统中管理内存的不同方法
- 程序重定位
- 分段
- 分页
- 虚拟内存
- 按需分页虚拟内存
-
实现高度依赖于硬件
- 必须知道内存架构
- MMU(内存管理单元):硬件组件负责处理CPU的内存访问请求
-
地址空间和地址生成
-
地址空间定义
- 物理地址空间 - 硬盘支持的地址空间 - 逻辑地址空间 - 一个运行的程序所拥有的内存范围
-
地址生成
-
逻辑地址生成
- eg.在C程序里,函数的位置、变量的名字就是一种逻辑地址
- .o 文件的地址从0开始
-
物理地址生成
-
CPU方面
- 运算器需要在逻辑地址的内存内容
- 内存管理单元寻找在逻辑地址和物理地址之间的映射
- 控制器从总线发送在物理地址的内存内容的请求
-
内存方面
- 内存发送物理地址内存的内容给CPU
-
操作系统方面
- 建立逻辑地址和物理地址之间的映射
-
-
-
地址安全检查
- 操作系统需要确保每个程序可以有效访问的地址空间 - 起始地址 - 地址长度
连续内存分配
-
内存碎片问题
-
空闲内存不能被利用
-
外部碎片
- 在分配单元间的未使用内存
-
内部碎片
- 在分配单元中的未使用内存
-
-
分区的动态分配
-
简单的内存管理方法
- 当一个程序准许运行在内存中,分配一个连续的区间
- 分配一个连续的内存区间给运行的程序以访问数据
-
分配策略
-
首次适配
- 为了分配n字节,使用第一个可用空闲块以致块的尺寸比n大 - 基本原理和实现 - 简单实现 - 需求 - 按地址排序的空间块列表 - 分配需要寻找一个合适的分区 - 重分配需要检查,看是否自由分区能合并于相邻的空闲分区 - 优势 - 简单 - 易产生更大的空闲块,向着地址空间的结尾 - 劣势 - 易产生外碎片 - 不确定性
-
最佳适配
- 为了分配n字节,使用最小可用空闲块以致块的尺寸比n大 - 基本原理和实现 - 为了避免分割大空闲块 - 为了最小化外部碎片产生的尺寸 - 需求 - 按尺寸排列的空闲块列表 - 分配需要寻找一个合适的分区 - 重分配需要搜索及合并于相邻的空闲分区 - 优势 - 当大部分分配是小尺寸时非常有效 - 比较简单 - 劣势 - 外部碎片 - 重分配慢 - 易产生很多没用的微小碎片
-
最差适配
- 为了分配n字节,使用最大可用空闲块以致块的尺寸比n大 - 基本原理和实现 - 为了避免又太多微小的碎片 - 需求 - 按尺寸排列的空闲块列表 - 分配很快(获得最大分区) - 重分配需要搜索及合并于相邻的空闲分区,若有,然后调整空闲块列表 - 优势 - 假如分配是中等尺寸效果最好 - 劣势 - 外部碎片 - 重分配慢 - 易于破碎大的空闲块以致大分区无法被分配
-
-
-
压缩式碎片整理
-
重置程序以合并孔洞
-
要求所有程序时动态可重置的
-
问题
-
何时重置
- 不能再程序运行时进行
-
开销
- 频繁进行此操作开销很大
-
-
-
交换式碎片整理
- 运行程序需要更多的内存
- 抢占等待的程序和回收它们的内存