第三章的主要内容是:操作系统的物理内存管理
- CPU
- 内存
- I/O
运行内存(主存) / 磁盘(虚拟内存). 主存是在运行程序时所需要保存的数据空间,而磁盘是用于持久化数据保存的数据空间.
CPU可以访问的内存包括两大类 : 寄存器 / cache(L1缓存 / L2缓存)
层次
微处理器(CPU访问)
|___CPU寄存器 / L1缓存
|___L2缓存
主存(程序访问)
磁盘(程序访问)
从CPU寄存器到磁盘,读写速度不断降低,单位成本不断降低,大小不断增大。
-
抽象:逻辑地址空间
-
保护:独立地址空间
-
共享:访问相同内存
-
虚拟:更多的地址空间
- 程序重定位
- 分段
- 分页
- 虚拟内存
- 按需分页虚拟内存
实现高度依赖于硬件, 其中内存管理单元(MMU)负责处理CPU的内存访问请求
地址空间的定义
- 物理地址空间 —— 硬件支持的地址空间( address : [0, Max_sys] )
- 逻辑地址空间 —— 一个运行在程序所拥有的的内存范围( address : [0, Max_prog] )
内存碎片问题指的是空闲的内存无法被利用
- 外部碎片 : 分配单元间的未使用内存
- 内部碎片 : 分配单元内的未使用内存
分区的动态分配方式有以下三种 :
- 第一匹配分配 : 在内存中找到第一个比需求大的空闲块, 分配给应用程序
- 最优适配分配 : 在内存中找到最小的空闲块, 分配给应用程序
- 最差适配分配 : 在内存中找到最大的空闲块, 分配给应用程序
分配方式的区别
分配方式 | 第一匹配分配 | 最优适配分配 | 最差适配分配 |
---|---|---|---|
分配方式实现需求 | 1. 按地址排序的空闲块列表 2. 分配需要寻找一个合适的分区 3. 重分配需要检查是否可以合并相邻空闲分区 |
1. 按尺寸排序的空闲块列表 2. 分配需要寻找一个合适的分区 3. 重分配需要检查是否可以合并相邻空闲分区 |
1. 按尺寸排序的空闲块列表 2. 分配最大的分区 3. 重分配需要检查是否可以合并相邻空闲分区 |
优势 | 简单 / 易于产生更大空闲块 | 比较简单 / 大部分分配是小尺寸时高效 | 分配很快 / 大部分分配是中尺寸时高效 |
劣势 | 产生外部碎片 / 不确定性 | 产生外部碎片 / 重分配慢 / 产生很多没用的微小碎片 | 产生外部碎片 / 重分配慢 / 易于破碎大的空闲块以致大分区无法被分配 |
三种分配方式并无优劣之分,因为我们无法判断内存请求的大小
可以看到的是,三种分区动态分配的方式都会产生外部碎片,因此我们可以对碎片进行一定的整理来解决碎片问题。
-
压缩式碎片整理
- 重置程序以合并碎片
- 要求所有程序是动态可重置的
- 问题 :
- 何时重置 ? (在程序处于等待状态时才可以重置)
- 需要考虑内存拷贝的开销
-
交换式碎片整理
-
运行程序需要更多的内存时,抢占等待的程序并且回收它们的内存
-
问题 :
- 哪些程序应该被回收 ?
-
情况 :
运行中 : P3
等待中 : P1 P2 P4
内存分布 -> 主存 : OS / P1 / P3 / P2 / P4 磁盘 : 空
当P3程序需要更大的内存时 ->
内存分布 -> 主存 : OS / P1 / P3 / P2 磁盘 : P4
-