第三章 连续式内存分配
3.1 计算机体系结构及内存分层体系
计算机体系结构
- CPU,内存,I/O
CPU中有两级缓存,CPU的缓存感受不到,是硬件控制的,如果缓存中没有,就需要去内存或者外存中读写,这时候就需要操作系统进行控制了。
2) 操作系统在内存管理要完成的目标
-抽象:逻辑地址空间
-保护:独立地址空间
-共享:访问相同内存
-虚拟化:更多的地址空间
(3)操作系统实现内存管理目标的手段
- 程序重定位
- 分段
- 分页
- 虚拟内存 (目前多数系统(如Linux)采用按需页式虚拟存储)
- 按需分页虚拟内存
以上实现高度依赖硬件 - 与计算机存储架构紧耦合
- MMU(内存管理单元):处理CPU存储访问请求的硬件
3.2 地址空间与地址生成
1)地址空间的定义
- 物理地址空间:硬件支持的地址空间
- 逻辑地址空间:一个运行的程序所拥有的内存范围。在CPU运行的进程看到的地址
2)逻辑地址的生成
3)地址生成时机和限制
4) 地址生成过程
应用程序的逻辑地址是如何映射到物理地址
=>CPU方面
a.运算器ALU需要在逻辑地址的内存内容(CPU要逻辑地址)
b.内存管理单元MMU寻找在逻辑地址和物理地址之间的映射(然后MMU找逻辑和物理地址的关系)
c. 控制器从总线发送在物理地址的内存内容的请求(关系找到后,去找对应物理地址)
=>内存方面
e.内存发送物理地址内存内容给CPU(物理地址找到了,给CPU)
=>操作系统方面
f.建立逻辑地址和物理地址之间的映射(确保程序不相互干扰)
5) 地址安全检查
3.3 连续内存分配:内存碎片与分区的动态分配
连续内存分配是给进程分配一块不小于指定大小的连续的物理内存区域
1)内存碎片问题
-空闲内存不能被利用
外部碎片:在分配单元间的未使用内存
内部碎片:在分配单元中的未使用内存
2)动态分区分配
- 当程序被加载执行时,分配一个进程指定大小可变的分区(块,内存块)
- 分区的地址是连续的
操作系统需要维护的数据结构:
- 所有进程的已分配分区
- 空闲分区
3)分区的动态分配策略
3.1 首次适配(最先匹配)**
–内容:现在想分配n字节,从低地址开始找,碰到的第一个空间比n大的空闲块就使用它。
- 要想实现首次分配,需要满足以下条件:
—需要存在一个按地址排序的空闲块列表
—分配需要找一个合适的分区
—重分配需要检查,看看自由分区能不能与相邻的空闲分区合并(形成更大的空闲块),若有的话,进行合并 - 优点:简单;在高地址空间有大块的空闲分区
- 缺点:更容易产生外部碎片; 分配大块时较慢
3.2 最佳适配
–内容:为了分配n字节,使用最小的可用空闲块,以致块的尺寸比n大
–目的:避免分割大的空闲块;最小化外部碎片产生的尺寸。
–要想实现最佳分配,需要满足以下条件:
—空闲分区列表按照大小排序
—分配需要寻找一个合适的分区
—释放时,查找并且合并相邻(是地址邻近的)的空闲分区(若有)
- 优点:大部分分配的尺寸较小时很有效;可避免大的空闲分区被拆分;可减小外部碎片的大小;相对简单
- 缺点:外部碎片;释放分区较慢;易产生很多没用的微小碎片。
3.3最差适配
–内容:为了分配n字节,使用最大的可用空闲块,以致块的尺寸比n大。
–目的:避免太多的微小碎片
–要想实现最差分配,需要满足以下条件:
-
空闲分区列表按由大到小排序
-
分配时,选最大的分区,所以分配很快
-
重分配需要合并于相邻的空闲分区(若有),然后调整空闲分区列表顺序。
-
优点:假如分配时中等尺寸较多时效果最好;避免出现太多的小碎片
-
缺点:释放分区较慢;外部碎片;易于破碎大的空闲块,因此后续难以分配大的分区。
3.4 碎片整理
碎片整理是指通过调整进程占用的分区位置来减少或避免分区碎片
(1)碎片紧凑(压缩式碎片整理)
- 通过移动分配给进程的内存分区,以合并外部碎片
- 碎片紧凑的条件:1,所有的应用程序可动态重定位
- 问题:何时移动;开销。
(2)分区对换(交换式碎片整理)
通过抢占并回收处于等待状态进程的分区,以增大可用内存空间
-运行程序需要更多的内存
-抢占等待的程序或回收它们的内存(把暂时不用的内容挪到磁盘里)
3.5 连续内存分配的实例: 伙伴系统
3.5.1 伙伴系统的分区