八、内存管理(一)
概要
- 存储管理的要求
- 分区存储管理
- 分页存储管理
- 分段存储管理
前言
- 存储体系
- 存储器的层次结构:
![image]()
- 高速缓存Cache:KB-MB级、少量、高速、昂贵、易失
- 内存:GB级、中等速度、中等价格、易失
- SSD:数10GB级、较高速、价格高、非易失
- 磁盘/外存:GB-TB级、低速、价廉、非易失
- 存储器的层次结构:
- 内存
- 系统区:存放操作系统
- 用户区:存放用户程序数据
- 存储管理的任务
- 主要工作:将程序载入内存以让CPU执行
- 目的:
- 划分内存区域以容纳多个进程(多道程序设计)
- 有效分配内存以容纳尽量多的进程
6.1存储管理的要求
- 重定位
- 保护
- 共享
- 逻辑组织
- 物理组织
6.1.1重定位
- 逻辑地址/相对地址
- 逻辑地址:与内存内容无关的内存位置
- 相对地址:相对于某一点(通常是程序起始位置,也可能是段基址)的逻辑地址(如偏移地址)
- 物理地址/绝对地址
- 物理地址:内存的实际地址,也称绝对地址
- 多道程序设计和共享内存技术要求程序使用相对地址以支持重定位
- 程序员不知道程序在运行时在内存中所处的位置
- 处于内存某一区域的程序代码,在运行中可能被交换出到外存,后来又被交换进内存的另外一块区域
- 重定位一般要求硬件(CPU)支持
6.1.2保护
- 多道程序和共享内存要求一个进程不能对其他进程进行有意或无意的非授权访问
- 程序的内存引用只能在运行时检查
- 重定位导致无法在编译时检查绝对地址
- 多道程序设计语言允许地址的动态计算(如数组下标、指向某种数据结构的指针等)
- 通常整合在重定位的硬件机制中(从软件上,难以预计所有非法情况,开销较高)
6.1.3共享
- 支持不同进程访问内存的同一区域
- 可能情形
- 同一程序的不同进程实例共享程序区
- 合作进程间共享某些数据结构
- 重定位机制通常也支持共享
6.1.4逻辑组织
- 物理上,主存和辅存通常是一维线性结构
- 采用模块化形式组织用户程序及数据,反应程序组织的逻辑性
- 模块化有利于设计期间的编程
- 模块化有利于运行时刻的保护/共享
- 分段存储管理技术最符合用户(程序员)组织程序的观点
6.1.5物理组织
- 主存与辅存间的信息交换有利于实现系统目标
- 要求程序员关心物理组织不切实际
- 主存有限需采取覆盖技术,消耗程序员经历和时间
- 程序员无法预知可用主存的数量和位置
- 物理组织是操作系统的责任(资源管理)
6.1.6覆盖技术和交换技术
- 原因:多道环境下扩充内存
- 覆盖技术主要用在早期的操作系统中
- 交换技术被广泛用于小型分时系统中,导致了虚存技术的出现
- 共同点
- 进程的程序和数据主要放在外存
- 只有当前需要执行的部分才放在内存
- 内外存之间进行信息交换
覆盖技术
- 把程序划分为若干个功能上相对独立的程序段,按照其自身的逻辑结构,让不会同时执行的程序段共享同一块内存区域
- 程序员向系统提供覆盖结构,由操作系统完成程序段之间的覆盖
![image]()
交换技术
- 内存空间紧张时,系统将内存中的某些进程暂时移到外存,把外存中的某些进程换到内存,占据前者原来所占用的区域
- 交换技术即进程在内存与外存之间的动态调度
- 与覆盖技术比较:
- 交换技术不要求用户给出程序段之间的逻辑覆盖结构
- 交换发生在不同的进程或作业之间,而覆盖发生在同一进程或作业之内
![image]()
6.2分区存储管理技术
- 分区
- 包括固定分区和动态分区
- 只在一些特殊场合使用(如内核存储管理)
- 在一些已过时的操作系统中采用
- 简单内存分页(不单独使用)————大小相等,需一次装入一个进程的所有页
- 简单进程分段(不单独使用)————需一次装入一个进程的所有段
- 虚拟内存分页————不需一次装入一进程的所有页
- 虚拟内存分段————不需一次装入一进程的所有段
6.2.1固定分区
- 将内存划分成固定大小的区域:
- 等长
- 不等长
![image]()
- 等长分区:任何小于或等于分区大小的进程都可以全部载入某一可用分区中(无可用分区时,可以应用交换技术)
- 问题:
- 若进程大于分区,则只能部分载入,要应用覆盖技术
- “小”进程将产生内碎片,导致内存利用率降低
- 问题:
- 不等长分区:在一定程度上缓解了等长分区存在的问题(没有完全解决!)
- 等长分区的放置算法:
- 进程可以放到任何一个可用分区中
- 不等长分区的放置算法:
- 多队列:为每个分区设立一个输入队列,各个队列中的进程只能使用对应的分区————某些队列为空时会造成内存的浪费(如小分区队列满而大分区队列空)
- 单队列:只有一个输入队列,进程使用可容纳它的最小空闲分区(无可用分区时可“交换”)
![image]()
- 固定分区优缺点
- 优点
- 相对简单,开销小
- 缺点
- 分区数目预设(系统创建时),限制了活动进程数目
- 分区大小预设,小作业不能充分利用其占有空间
- 优点
- 采用固定分区的操作系统
- MFT(Multiprogramming with a Fixed Number of Tasks,IBM 1966年推出)
6.2.2动态分区
- 实例:IBM OS/MVT (Multiprogramming with a Variable Number of Tasks,具有可变任务数的多道程序设计,1967年)
- 系统运行中分区数目和大小均可改变
- 最初分区数目为0,进程需要多少就给它分配多大的分区(按需分配)
- 存在问题:外碎片
- 消除碎片:压缩,移动进程使相互紧靠(耗时,且需要进程动态重定位)
![image]()
- 动态分区的放置算法
- 首次适配算法
- 从前端开始扫描内存,直到找到一个足够大的空闲区
- 下次适配算法(邻近适配)
- 从上次分配结束的地方开始扫描内存,直到找到一个足够大的空闲区
- 最佳适配算法
- 扫描整个内存,找出一个足够大的最小空闲区
- 最坏适配算法
- 扫描整个内存,找出一个最大的空闲区
![image]()
- 扫描整个内存,找出一个最大的空闲区
- 首次适配算法
- 动态分区算法的性能比较
- 首次适配算法
- 简单,且通常最好、最快
- 下次适配算法
- 稍差于首次适配
- 通常分配位于内存末端的空闲区,致使大块空闲区很快被分裂,因此经常要“压缩”
- 最佳适配算法
- 通常最差
- 产生大量无用的小碎片,导致需要更经常的“压缩”
- 首次适配算法
6.2.3伙伴系统
- 固定分区限制了活动进程的数量,而且内存空间利用率低
- 动态分区维护复杂,且需要额外的“压缩”开销
- 这种方案:伙伴系统(buddy system)
- 可用内存块的大小为\(2^K\),L≤K≤U
- 最小块的大小为\(2^L\)
- 最大块的大小为\(2^U\)
- 初始空间为大小为\(2^U\)的块
- 若请求的空间大小s<\(2^{U-1}\),则对分现有块
- 维护大小为\(2^K\)的所有空闲块的列表
- 可用内存块的大小为\(2^K\),L≤K≤U
- 伙伴系统举例:
![image]()
- 伙伴系统的树状表示
![image]()
6.2.4分区管理中的重定位
- 静态重定位:
- 仅进程第一次载入时把内存引用全换成绝对地址
- 动态重定位
- 动态分区只能采用动态重定位,因为消除碎片的“压缩”操作,进程的内存位置会发生改变
- 程序执行指令时,CPU内把逻辑地址才转换为内存地址
- 重定位的硬件机制
- 寄存器
- 基址寄存器
- 界址寄存器
- 地址转换
- 计算物理地址
- 安全检查
![image]()
- 寄存器
- 重定位类比:运动会班队序号对应院队序号
![image]()












浙公网安备 33010602011771号