3.1 存储管理的主要模式
3.1.1 用户编程的逻辑地址
用户编程所使用的地址空间,从0开始编号
段号:段内地址
3.1.2 段式程序设计
把一个程序设计成多个段
用户可自用段覆盖技术扩充内存空间使用量
3.1.3 进程执行的物理地址
物理地址,又称绝对地址,即程序执行使用的地址空间。CPU执行指令时按照物理地址进行。
3.1.4 主存的划分方式
3.1.5 存储管理的主要模式
创建进程首先将程序和数据装入内存。将源程序转换为可在内存执行的程序,通常需要以下步骤:
编译:编译程序将用户源代码编译成若干个目标模块
链接:链接程序将编译后的目标模块及所需库函数链接一起,形成一个完整的装入模块
链接有以下三种方式
- 静态链接:程序运行前,将各目标模块及它们所需的库函数链接成一个完整的可执行程序,以后不再拆开
- 装入时动态链接:将用户源程序编译后所得的一组目标模块,在装入内存时,采用边装入边链接的链接方式
- 运行时动态链接:对于某些目标模块的链接,是在程序执行中需要时链接。优点是便于修改和更新,便于实现对目标模块的共享。
装入:由装入程序将装入模块装入内存
- 绝对装入:编译程序,事先知道程序未来驻留在内存的地址,产生绝对地址的目标代码。程序逻辑地址和绝对地址一致,绝对装入程序按装入模块中的地址直接将程序和数据装入内存。只适合单道程序环境。地址可编译或汇编给出,也可程序员赋予。通常在程序中采用的是符号地址,编译或汇编时转换为绝对地址。
- 静态重定位。可重定位装入:多道程序中,多个目标模块的起始地址通常为0,此时采用重定位装入方式。==装入时==对目标模块地址修改称为重定位,装入时一次完成称为静态重定位。特点是必须有足够的空间。进入内存后,运行期间不能在内存中移动,也不能申请内存地址。
- 动态重定位。动态运行时装入:程序在内存中移动,就需要动态装入方式。装入程序把装入模块装入内存后,并不立刻进行地址转换,而是在执行时进行。因此装入内存后的所有地址为相对地址,这种方式需要一个重定位寄存器。特点:可将程序分配到不连续的存储区,运行前装入部分代码既可,运行期间,按需动态申请分配内存,便于程序段的共享,可以向用户提供一个比主存大得多的地址空间。
3.2 存储管理的功能
3.2.1 地址转换
又称重定位,逻辑地址->绝对地址
存储保护
3.2.2 主存分配
分配:进程装入主存时,存储管理软件进行具体的主存分配操作,并设置一个表格记录主存空间的分配情况
去配:当某个进程撤离或主动归还主存资源时,存储管理软件要收回它所占用的全部或者部分存储空间,调整主存分配表信息
3.2.3 主存共享
多个进程共享主存储器资源:多道程序设计技术使若干个程序同时进入主存储器,各自占用一定数量的存储空间,共同使用一个主存储器
多个进程共享主存储器的某些区域:若干个协作进程有共同的主存程序块或者主存数据块
3.2.4 存储扩充
存储扩充:把磁盘作为主存扩充,只把部分进程或进程的部分内容装入内存 1.对换技术:把部分不运行的进程调出 2.虚拟技术:只调入进程的部分内容
3.3 虚存
3.4 存储管理的硬件支撑
3.4.1 存储器的组织层次
3.4.2 存储管理涉及的存储对象
3.4.3 cache及其组织
Cache是介于CPU和主存储器间的高速小容量存储器,由静态存储芯片SRAM组成。
CPU往往需要重复读取同样的数据块,Cache的引入与缓存容量的增大,可以大幅提升CPU内部读取数据的命中率,从而提高系统性能
3.4.4 地址转换/储存保护的硬件支撑
比较操作即存储保护
虚存存储器的硬件支撑
3.5 单连续分区存储管理
每个进程占用一个物理上完全连续的存储空间
3.5.1 单用户连续分区存储管理
适用于单用户单任务操作系统
实现:主存通过栅栏寄存器分两个区域:用户区和系统区,硬件用它在执行时进行存储保护
一般采用静态重定位进行地址转换
硬件实现代价低
3.5.2 固定分区方式的地址转换
3.6 可变分区存储管理
3.6.1 理想
按进程的内存需求来动态划分分区
主存分配表
3.6.2 内存的分配与去配
3.6.2.1 首次适应法
在空闲分区表的第一个目录查起,最先满足的空闲区分配给作业。空闲分区要按地址由低到高排序,优先使用地址部分,在低址造成许多空闲区,高址保留大的空闲区。每次收回一个分区必须搜索未分配区表确定它的位置且要移动表格中的登记
优点:减少查找时间
3.6.2.2 最佳适应法
找出满足作业要求且大小最小的空闲区,使碎片尽量小。
3.6.2.3 最坏适应法
挑选最大空闲分区,算法要求按从大到小形成一个空闲分区链
3.6.2.4 循环首次适应法
与首次适应法不同的使,每次从上次找到空闲开始查找。使得空闲区分布均匀
3.6.3 可变分区的地址转换/存储保护
3.6.4 分区移动技术
3.7 页式存储管理
3.7.1 页式存储管理的基本思想
将主存划分为多个大小相等的页架,类似书的页
程序的逻辑地址分为页
不同的页放在不同的页架,不需要连续
页表维系进程的主存(逻辑和物理)完整性
3.7.2 页式存储管理的地址转换思路
页式存储管理的空间分配
页式存储管理的页共享
多个进程共享程序和数据
数据共享:不同进程可以使用不同页号共享数据页
程序共享:使用相同页号是做不到的。
3.8 页式存储管理的地址转换
3.8.1 进程表
3.8.2 多道程序环境下的地址转换
3.9 页式虚拟存储管理-主流
3.9.1 页式虚拟存储管理的基本思想
进程全部页面装入虚拟存储器,执行时先把部分页面装入实际内存,然后根据执行行为,动态调入不在主存的页,同时进行必要的页面调出。
请求页式存储管理:第一次只把进程第一页信息装入主存
3.9.2 地址转换和缺页中断
3.10 页面调度
3.10.1 概念
主存满又需装入新页时,页式虚存管理器按照一定算法把已在主存的页调出
页面调度:选择淘汰页的工作
页面调度算法:选择淘汰页的算法
设计不当,会出现刚被淘汰立刻又被调入,称为抖动和颠簸
3.10.2 缺页中断率
假定进程P共n页,系统分配页架数m个
P运行中成功访问次数为S,不成功访问次数为F,总访问次数:A=S+F
缺页中断率定义为:f=F/A
缺页中断率是衡量存储管理性能和用户编程水平的重要依据,与n、m有关。
3.10.3 页面调度算法
OPT:最佳算法,只可模拟不可实现
LRU:最近最少用
LFU:最不常用
3.10.4 模拟实现
LRU算法的模拟实现
每页建一个引用标志,供硬件使用
设置一个时间间隔中断:中断时页引用标志置0
地址转换时,页引用标志置1
淘汰页面时,从页引用标志为0的页中间随机选择
时间间隔多长是个难点
LFU
基于时间间隔中断,并给每一页设置一个计数器
时间间隔中断发生后,所有计数器清0
每访问页1次就给计数器加1
选择计数值最小的页面淘汰
CLOCK
3.11 反置页表
MMU:内存管理单元
3.11.1 反置页表的基本设计思想
内存中的每个页架建立一个页表,按照块号排序
表项包含:正在访问该页框的进程标识、页号及特征位,和哈希链指针等
用来完成内存页架到访问进程页号的对应,即物理地址到逻辑地址的转换。
页号:虚拟地址号
进程标识符:使用该页的进程号
MMU通过哈希表把进程标识和虚页号转 换成一个哈希值,指向IPT的一个表目
MMU遍历哈希链找到所需进程的虚页号, 该项的索引就是页架号,通过拼接位移便 可生成物理地址
若遍历整个反置页表中未能找到匹配页表 项,说明该页不在内存,产生缺页中断, 请求操作系统调入
3.12 段式存储管理
3.12.1 段式程序设计
每个程序可由若干段组成,每一段都可以从“0” 开始编址,段内的地址是连续的。程序空间是二维的。
分段存储器的逻辑地址由两部分组成 段号+单元号 [用户可控的]
3.12.2 段式存储管理的基本思想
3.12.3 段表
存储管理需要增加设置一个段表,每个段占用一个段表项,包括:段始址、段 限长,以及存储保护、可移动、可扩充等标志位
3.12.4 地址转换流程
3.13 段式虚拟存储管理
3.13.1 基本思想
把进程的所有分段都存放在辅存中,进程运行时先把当前需要的一段或几段装 入主存,在执行过程中访问到不在主存的段时再把它们动态装入