前面所介绍的各种存储器管理方式,有一个共同特点:作业全部装入内存后方能运行
问题: ➢ 大作业装不下 ➢ 少量作业得以运行
解决办法:
➢ 方法一:从物理上增加内存容量,成本高
➢ 方法二:从逻辑上扩充内存容量->虚拟存储技术
程序的局部性的应用
1. 部分装入:在程序装入时,不必将其全部读入到内存,而只需将当前需要执行的部分页或段读入到内存,就可让程序开始执行。
2. 请求调页(段):在程序执行过程中,如果需执行的指令或访问的数据尚未在内存(称为缺页或缺段),利用OS提供的请求调页(段)功能,将相应的页或段调入到内存,然后继续执行程序。
3. 置换:如果此时内存已满,无法装入新的页(段),则还必须调用页(段)置换功能。
4. 大作业+多并发:这样,便可使一个大的用户程序,在较小的内存空间运行; 也可在内存中同时装入更多进程并发运行。
虚拟存储器:具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。
多次性:作业中的程序和数据允许被分成多次调入内存允许
对换性:作业运行时无须常驻内存,允许作业在运行过程中换进、换出
虚拟性:从逻辑上扩充了内存容量,使用户看到的内存容量远大于实际内存容量
离散性:在内存分配时采用离散分配方式
实现原理:进程运行只装入部分程序和数据,在外存保留完整副本,运行中动态调整进程在内存中的部署
优点: 利用率高,方便用户,对多道程序运行有较强的支持
实现方式:有两种典型虚拟存储器实现方式
页式虚拟存储
1. 页式虚拟存储:在分页系统的基础上,增加了请求调页功能、页面置换功能所形成的页式虚拟存储系统
2. 基本思想:分页管理,装入少量页运行,缺页故障后调整
3. 页表结构: 页号+ 标志位+ 块号+ 外存地址
4. 地址转换: 正常地址转换,缺页时产生缺页中断
段式虚拟存储
1. 段式虚拟存储:在分段系统的基础上,增加请求调段及分段置换功能后,所形成的段式虚拟存储
2. 基本思想:装入部分段,动态装入或调出段
3. 段表结构:段号+ 主存起址+ 长度+ 辅存起址+标志位+扩充位…
4. 缺段中断:缺段时产生缺段中断
5. 地址变换机构:逻辑地址->物理地址,增加缺段中断
请求分页中的硬件支持
请求页表机制
缺页中断机构
➢ 在指令执行期间产生和处理中断信号
➢ 一条指令在执行期间,可能产生多次缺页中断
地址变换机构
➢ 与分页内存管理方式类似
为了实现请求分页,系统要提供一定的硬件支持。除了一定容量的内存和外存,还需要有:页表机制、缺页中断机构和地址变换机构
扩充表(以前页表结构只包含页号和块号两个信息,这是进行地址变换机构所必须的,为了判断页面在不在主存,可在原页表上扩充)
页表机制
用于将用户逻辑地址空间变换为物理地址空间。在页表中增加若干项,以便于标志程序或数据的状态。页表项:
状态位(存在位)P:表示该页是否调入内存
访问字段A:用于记录该页在某段时间内被访问的次数
修改位M:表示该页在调入内存后是否被修改过
外存地址:该页在外存上的地址,通常是物理块号
缺页中断机构
缺页中断:在地址映射过程中,在页表中发现所要访问的页不在内存,则产生缺页中断。操作系统接到此中断信号后,就调出缺页中断处理程序,根据页表中给出的外存地址,将该页调入内存,使进程继续运行下去
2. 分配:如果内存中有空闲块,则分配一页,将新调入页装入内存,并修改页表中相应页表项目的状态位及相应的内存块号
3. 淘汰:若此时内存中没有空闲块,则要淘汰某页,若该页在内存期间被修改过,则要将其写回外存
处理过程:保护CPU现场、分析中断原因、转入缺页中断处理程序、恢复CPU环境
特点:缺页中断发生在指令执行期间,而通常情况下,CPU是在一条指令执行完后,才检查是否有中断请求到达;一条指令在执行期间,可能产生多次缺页中断。
地址变换机构
1. 在地址变换时,首先检索快表,试图从中找到要访问的页。如找到,修改其访问位。对于“写”指令,还要设置修改位的值。如未找到则转3。
2. 利用页表项中的物理块号和页内地址,形成物理地址。
3. 查找页表,找到页表项后,判断其状态位P,查看该页是否在内存中。如果在,则将该页写入快表(若快表已满,则应该先调出某个或某些页表项)。如果不在,则产生缺页中断,由OS从外存将该页调入内存
请求分页中的内存分配
在为进程分配物理块时,要解决下列的三个问题:
1. 保证进程可正常运行所需要的最少物理块数
2. 每个进程的物理块数,是固定值还是可变值(分配策略)
3. 不同进程所分配的物理块数,是采用平均分配算法还是根据进程的大小按照比例予以分配(分配算法)。
内存分配策略
1、固定分配局部置换
⚫ 思路
– 分配固定数目的内存空间,在整个运行期间都不改变
⚫ 策略
– 如果缺页,则先从该进程在内存的页面中选中一页,进行换出操作,然后再调入一页
⚫ 特点
– 为每个进程分配多少页是合适的值难以确定
2、可变分配全局置换
⚫ 思路
– 每个进程预先分配一定数目的物理块,同时OS也保持一个空闲物理块队列
⚫ 策略
– 当缺页时,首先将对OS所占有的空闲块进行分配,从而增加了各进程的物理块数。当OS的空闲块全部用完,将引起换出操作
3、可变分配局部置换
⚫ 思路
– 系统根据缺页率动态调整各进程占有的物理块数目,使其保持在一个比较低的缺页率状态下
⚫ 特点
– 使大部分进程可以达到比较近似的性能
物理块分配算法
在采用固定分配策略时,可使用下列方法来分配:
1. 平均分配算法:将系统中所有可供分配的物理块,平均分配给各个进程。
2. 按比例分配算法:按照进程的大小比例分配物理块。
3. 考虑优先权的分配算法:为了对于紧迫的作业,能够尽快完成。可以将内存的物理块分成两部分,一部分按比例地分配给各进程;另一部分则根据各进程的优先权,适当增加其相应的份额,分配给各进程。
页面调入策略
何时调入页面
➢ 预调页策略:预先调入一些页面到内存
➢ 请求调页策略:发现需要访问的页面不在内存时,调入内存
从何处调入页面
➢ 如系统拥有足够的对换区空间,全部从对换区调入所需页面
➢ 如系统缺少足够的对换区空间,凡是不会被修改的文件,都直接从文件区调入;当换出这些页面时,由于未被修改而不必再将它们重写磁盘,以后再调入时,仍从文件区直接调入
➢ UNIX方式:未运行过的页面,从文件区调入;曾经运行过但又被换出的页面,从对换区调入
① 进程需要的页面不在内存,引起缺页中断
② 中断处理程序保留现场环境,转入缺页中断处理程序
③ 中断处理程序查找页表,得到对应的外存物理块号。如果内存有空闲,则启动磁盘操作,将所缺的页面读入,并修改页表。否则,到4。
④ 执行置换算法,选出要换出的页面,如果该页修改过,应将其写入磁盘,然后将所缺页调入内存,修改相应表项,将其存在位置为‘1’,并放入快表。
⑤ 利用修改后的页表,形成物理地址,访问内存数据。
缺页率
访问页面成功(在内存)的次数为S
访问页面失败(不在内存)的次数为F
总访问次数为A=S+F
缺页率为 f= F/A
影响因素:页面大小、分配内存块的数目、页面置换算法、程序固有属性
缺页中断处理的时间:假设被置换页面被修改的概率是β
请求分页存储管理方式
⚫ 优点:
– 可提供多个大容量的虚拟存储器:作业的地址空间不再受主存大小的限制
– 主存利用率大大提高:作业中不常用的页不会长期驻留在主存,当前运行用不到的信息也不必调入主存
– 能实现多道作业同时运行
– 方便用户:大作业也无须考虑覆盖问题
⚫ 缺点:
– 缺页中断处理增加系统开销
– 页面的调入调出增加I/O系统的负担
– 此外页表等占用空间且需要管理,存在页内零头