一、分区内存管理
单一区存储管理
分区存储管理
- 固定分区
- 动态分区
单一区存储管理(不分区存储管理)
定义:用户区不分区,完全被一个程序占用
优点:简单,不需要复杂硬件支持,适用单任务OS
缺点:程序运行占用整个内存,即使小程序也如此(内存浪费,利用率低)
分区存储管理
定义
- 把用户区内存划分为若干大小不等的分区,供不同程序使用
- 适合单用户单任务系统
分类:
固定分区
- 分区表:记录分区的位置、大小和使用标志
- 特点:程序装入前,内存已被分区,不在改变。分区大小适应不同大小的程序(要维护分区表)
- 缺点:浪费内存,大程序无法运行
动态分区
定义:在程序装入时创建分区,使分区的大小刚好与内存的大小相等
特点:
- 分区的个数和大小均可变
- 存在内存碎片
需要解决的问题
- 分区的分配
- 分区的选择
- 分区的回收
- 解决内存碎片的问题
二、分区放置策略
分区的分配
空闲区表:描述内存空闲区的位置和大小的数据结构
分配过程(假定用户要求的空间大小为s)
- 从空闲区表的第一个区开始,寻找≥s的空闲区
- 找到后从分区中分割出大小为s的部分给用户使用
- 分割后的剩余部分作为空闲区仍然登记在空闲表中
注意:分割空闲区时一般从底部分割,这样只要改变·空闲区的大小,方便更新空闲区表
放置策略(空闲区表排序原则)
- 按空闲区位置递增排序(首次适应算法)
- 按空闲区位置递减排序
- 按空闲区大小的递增排序(最佳适应算法)
- 按空闲区大小的递减排序(最坏适应算法)
首次适应算法
优点:
- 尽可能地先使用低地址空间
- 当需要较大分区时再高地址空间有较大的满足可能性
最佳适应算法
优点
- 尽可能地先使用较小的空闲区,保留大的空闲区
- 当需要较大分区时由较大的满足可能性
最坏适应算法
优点:大空闲区分割后剩下部分还是很大,还能装下较大的程序
特点:仅作一次查找就可以找到所要分区
分区的回收
功能:回收程序释放分区(释放区),登记在空闲表中,以便再分配
回收算法
- 要考虑释放区与现有空闲区是否相邻
- 若释放区与现有空闲区不相邻,则直接插入空闲区表
- 若相邻,则与空闲区合并后更新空闲区表
三、内存覆盖技术
覆盖
目的:在较小的内存空间中运行较大的程序
内存分区
- 常驻区:被某段单独且固定地占用,可划分多个
- 覆盖区:能被多段共用(覆盖),可划分多个
缺点:
编程复杂:程序员划分程序模块并确定覆盖关系
程序执行时间长:从外存装入内存耗时
四、内存交换技术
原理:
- 内存不够时把进程写到磁盘(换出)
- 当进程要运行时重新写回内存(换入)
优点
- 增加进程的并发数
- 不考虑程序结构
缺点
- 换入和换出增加CPU开销
- 交换单位太大(整个进程)
考虑问题
- 减少交换传送的信息量(模块/段)
- 外存交换空间的管理方法
- 程序换入的地址重定位
五、内存碎片
- 过小的空闲区,难实际利用
- 内存碎片会降低内存有效利用率
解决碎片方法
1、规定门限值
- 分割内存区时,若剩余部分小于门限值,则全部分配给用户
2、内存拼接技术
- 将所有空闲区集中一起构成一个大的空闲区
时机:
释放区回收的时候
- 拼接频率过大,系统开销大
系统找不到足够大的空闲区时
- 空闲区的管理复杂
定期
- 空闲区管理复杂
缺点
- 消耗系统资源
- 离线拼接
- 重新定义作业
3、解除程序占用连续内存才能运行的限制
- 把程序分拆多个部分装入不同分区,充分利用碎片