03 内存分配 | 《操作系统》笔记
这一系列是操作系统 (清华大学向勇、陈渝)视频课的课堂笔记,主要是课堂 PPT 和部分讲授内容的文字版,仅供参考。
概述
- 操作系统在内存管理方面的任务
- 抽象:逻辑地址空间
 - 保护:独立地址空间
 - 共享:访问相同内存
 - 虚拟化:更多的地址空间
 
 - 在操作系统中管理内存的不同方法
- 程序重定位
 - 分段
 - 分页
 - 虚拟内存
 - 按需分页虚拟内存
 
 
连续内存分配:地址空间与地址生成
- 地址空间定义
- 物理地址空间:硬件支持的地址空间
- 起始地址 0 到到地址 MAXsystem
 
 - 逻辑地址空间:一个运行的程序所拥有的内存范围
- 起始地址 0 到到地址 MAXprocess
 
 
- 当 CPU 需要执行某个指令时
- CPU
- 运算器需要在逻辑地址的内存内容
 - 内存管理单元寻找在逻辑地址和物理地址之同的映射
 - 控制器从总线发送在物理地址的内存内容的请求
 
 - 内存
- 内存发送物理地址内存的内容给 CPU
 
 - 操作系统方面
- 建立逻辑地址和物理地址之间的映射
 
 
 - CPU
 
 - 物理地址空间:硬件支持的地址空间
 - 连续内存分配
- 内存碎片问题
- 空闲内存不能被利用
 - 外部碎片:在分配单元间的未使用内存
 - 内部碎片:在分配单元中的未使用内存
 
 - 分区的动态分配
- 第一适配

- 实现
- 按地址排序空闲块
 - 寻找第一个可行的分区
 - 回收时尝试合并相邻的空闲分区(若有)
 
 - 优势
- 简单
 - 易于产生更大空闲块
 
 - 劣势
- 外部碎片
 - 不确定性
 
 
 - 最佳适配

- 实现
- 按尺寸排序空闲块
 - 寻找最合适的分区
 - 回收时尝试合并相邻的空闲分区(若有)
 
 - 优势
- 当大部分分配是小尺寸时非常有效
 - 比较简单
 
 - 劣势
- 外部碎片
 - 重分配慢
 - 易产生很多没用的微小碎片(不怎么好)
 
 
 - 最差适配

- 实现
- 按尺寸排序空闲块
 - 寻找最大的分区
 - 回收时尝试合并相邻的空闲分区(若有)
 
 - 优势
- 假如分配是中等尺寸效果最好
 
 - 劣势
- 重分配慢
 - 外部碎片
 - 易于破碎大的空闲块以致大分区无法被分配
 
 
 
 - 第一适配
 - 压缩式碎片整理

- 劣势
- 拷贝开销可能很大
 - 无法应对空间的绝对剩余量不够的情况
 
 
 - 交换式碎片整理
- 运行程序需要更多的内存
 - 抢占等待的程序并回收它们的内存
 
 
 - 内存碎片问题
 
非连续内存分配
- 概述
- 连续内存分配的缺点
- 分配给一个程序的物理内存是连续的
 - 内存利用率较低
 - 有外碎片、内碎片的问题
 
 - 非连续分配的优点
- 一个程序的物理地址空间是非连续的
 - 更好的内存利用和管理
 - 允许共享代码与数据(共享库等)
 - 支持动态加载和动态链接
 
 - 如何建立虛拟地址和物理地址之间的转换
- 软件方案
 - 硬件方案
 
 - 两种硬件方案
- 分段
 - 分页
 
 
 - 连续内存分配的缺点
 - 分段
- 分段地址空间
 - 分段寻址方案
 
 - 分段地址空间
 - 分页
- 分页地址空间
- 与分段的的最大区别
- 段的尺寸可变,页的大小固定
 
 - 概念区分
- frame:帧(物理页)
 - page:页(逻辑页)
 
 - 划分物理内存至固定大小的帧
- 大小是 2 的幂,如 512、4096、8192
 
 - 划分逻辑地址空间至相同大小的页
- 大小是 2 的幂,如 512、4096、8192
 
 - 建立方案转换逻辑地址为物理地址(pages to frames)
- 页表
 - MMU/TLB
 
 
 - 与分段的的最大区别
 - 分页寻址方案
 
 - 分页地址空间
 
页表
- 概述


- 分页机制的性能问题
- 访问一个内存单元需要 2 次内存访问
- 一次用于获取页表项
 - 一次用于访问数据
 
 - 页表可能非常大
- 64 位机器如果每页 1024 字节,那么一个页表的大小会是多少?
- 每页共有 1024 个地址,则机器共有 2^64/1024=2^54 页
 - 每页在页表中占一个字节,那么一个页表的大小为 2^54 字节
 
 
 - 64 位机器如果每页 1024 字节,那么一个页表的大小会是多少?
 - 如何处理
- 时间:缓存
 - 空间:多层次页表
 
 
 - 访问一个内存单元需要 2 次内存访问
 
 - TLB
- 页表的 cache,位于 MMU 中
 
 - 二级、多级页表

- 对应驻留位为 0 的那个二级页表就可以省去了
 
 - 反向页表
- 大地址空间问题
- 有大地址空间(64-bits),前向映射页表变得繁琐,如:5 级页表
 - 不是让页表与逻辑地址空间的大小相对应,而是让页表与物理地址空间的大小相对
 - 逻辑(虚拟)地址空间增长速度快于物理地址空间
 
 - 基于页寄存器(Page Registers)的方案
- 页表是页号(逻辑)到帧号(物理)的映射,反向页表是帧号(物理)到页号(逻辑)的映射
 

- 虽然这种方案减少了存储每个页表所需要的内存空间,但是当引用页时,它增加了查找页表所需要的时间。由于反向页表按物理地址排序,而查找是根据虚拟地址,因此可能需要查找整个表来寻求匹配。这种查找会花费很长时间。
 - 为了解决这一问题,可以使用哈希页表来将查询限制在一个或少数几个页表条目。当然,每次访问哈希页表也为整个过程增加了一次内存引用,因此一次虚拟地址引用至少需要两个内存读:一个查找哈希页表条目,另一个查找页表。为了改善性能,可以在访问哈希页表时先查找 TLB。
 
 
 - 大地址空间问题
 
03 内存分配 | 《操作系统》笔记





