虚拟存储器
1 虚拟存储器概述
1.1 常规存储管理方式的特征
(1)常规存储管理方式的特征
① 一次性:作业在运行前需一次性地全部装入内存
② 驻留性:作业装入内存后,便一直驻留内存,直至作业运行结束
(2)常规存储器的问题
① 有的作业很大,所需内存空间大于内存总容量,使作业无法运行
② 有大量作业要求运行,但内存容量不足以容纳下所有作业,只能让一部分先运行,其它在外存等待
- 虚拟存储器能解决的问题:增加内存容量。从逻辑上扩充内存容量----虚拟存储器
1.2 局部性原理
(1)局部性原理
程序运行时存在的局部性现象,指程序在执行时呈现出局部性规律,即在一较短时间内,程序的执行仅限于某个部分,相应地,它所访问的存储空间也局限于某个区域。
① 程序执行时,除了少部分的转移和过程调用指令外,在大多数情况下是顺序执行
② 过程调用将会使程序的执行轨迹由一部分区域转移至另一部分区域,但调用深度大多数情况不超过5
③ 程序中存在许多循环结构,由少数指令构成,但是被多次执行
④ 对许多数据结构的处理,往往都局限于很小的范围内
(2)局限性表现—两个方面
① 时间局部性:由于大量的循环操作,某指令或数据被访问后,则不久可能会被再次访问。
② 空间局部性:如顺序执行,指程序在一段时间内访问的地址,可能集中在一定的范围之内
1.3 虚拟存储器的定义和特征
(1)虚拟存储器的定义
- 虚拟存储器是指仅把作业的一部分装入内存便可运行作业的存储管理系统
- 它具有请求调入功能和置换功能,能从逻辑上对内存容量进行扩充
- 其逻辑容量由外存容量和内存容量之和决定,其运行速度接近于内存,成本接近于外存
(2)虚拟存储器的特征
虚拟性以多次性和对换性为基础,而多次性和对换性又是离散分配为基础
① 多次性—最基本的特征:多次性是虚拟存储器最重要的特征,是指一个作业中的程序和数据无需在作业运行时一次性地全部装入内存,而是允许被分成多次调入内存运行。
② 对换性:是指一个作业中的程序和数据,无须在作业运行时一直常驻内存,而是允许在作业运行过程中进行换进、换出。可以提高内存利用率。
③ 虚拟性—最本质的特征:虚拟性是指能够从逻辑上扩充内存容量,使用户所看到的内存容量远大于实际内存容量。虚拟性是虚拟存储器所表现出来的最重要的特征,也是实现虚拟存储器最重要的目标
1.4 虚拟存储器的实现方法
虚拟存储器的实现都建立在离散分配内存的管理方式
(1)分页请求系统
在分页系统的基础上增加了请求页面功能和页面置换功能。置换以页面为单位。需要硬件和软件的支持
硬件:① 请求分页的页表机制 ② 缺页中断机构 ③ 地址变换机构
软件:① 请求调页的软件 ② 页面置换的软件
(2)请求分段系统
在分段系统的基础上增加了调段及分段置换功能。置换以段为单位。需要硬件和软件的支持
硬件:① 请求分段的段表机制 ② 缺段中断机构 ③ 地址变换机构
软件:① 请求调段的软件 ② 实现段置换的软件
分页请求系统 | 分段请求系统 | |
---|---|---|
基本单位 | 页 | 段 |
长度 | 固定 | 不固定 |
分配方式 | 固定分配 | 动态分配 |
复杂性 | 简单 | 复杂 |
2 请求分页存储管理方式
为了实现请求分页,系统必须提供一定的硬件支持。计算机系统除了要求一定容量的内存和外存外,还需要有请求页表机制、缺页中断机构以及地址变换机构
2.1 请求分页中的硬件支持
(1)请求页表机制
在请求分页系统中需要的主要数据结构是请求页表,即在页表的基础上进行了扩充,基本作用仍然是逻辑地址映射为内存空间中的物理地址,增加四个字段
- 状态位P(存在位):指示该页是否已调入内存,判断是否缺页
- 访问字段A:记录本页在一段时间内被访问的次数或最近未被访问的时间。根据访问位来决定淘汰哪页
- 修改位M:表示该页在调入内存后是否被修改过。若修改过,则换出时需重写至外存。供置换页面时参考
- 外存地址:指出该页在外存上的地址
(2)缺页中断机构
在请求分页系统中,当访问的页不在内存,便产生一缺页中断,请求OS将所缺页调入内存空闲块,若无空闲块,则需置换某一页,同时修改相应页表表目。
缺页中断与一般中断区别表现:
① 在指令执行期间产生和处理中断信号。缺页中断要立即处理
② 一条指令在执行期间,可能产生多次缺页中断
(3)地址变换机构
在分页系统地址变换机构的基础上,为实现虚拟存储器,增加功能如产生和处理缺页中断
在进行地址变换时,首先检索快表,若未找到应到内存中去查找页表。
2.2 请求分页中的内存分配
分配内存涉及三个问题:
① 为保证进程能正常进行,所需要最小物理块数的确定
② 在为每个进程分配物理块,应采取什么分配策略(固定or可变)
③ 为不同进程所分配的物理块数,是采取平均分配算法还是根据进程大小按比例分配
(1)最小块数的确定
最小物理块数是指能够保证进程正常运行所需的最小物理块数,进程应获得最小物理快数,与计算机的硬件结构有关,取决于指令的格式,功能和寻址方式。
(2)内存分配策略
两种分配策略:固定和可变
两种置换策略:全部置换和局部置换
① 固定分配局部置换
缺点:每个进程分配物理块难以确定;太少会频繁出现缺页中断,降低系统吞吐量,太多使内存驻留进程数目少,造成CPU空闲或其他资源空闲的情况。
② 可变分配全部置换
缺点:凡是产生缺页中断的进程,都将获得新的物理块,仅当空闲物理块队列中的物理块用时,OS才能从内存中选择一页调出。被选中的进程物理块会减少,导致缺页率增加。
③ 可变分配局部置换
- 固定分配:分配给进程的物理块数是固定的,不可变的
- 可变分配:分配给进程的物理快数不是是固定的,随着进程的运行时变化的
- 全局置换:是指在发生缺页时,在OS所保留的所有空闲物理块中选择一个,换入
- 局部置换:是指发送缺页时,只能从分配给该进程的n个物理块中,选择一个换出
(3)物理块分配算法
① 平均分配算法
② 按比例分配算法
③ 考虑优先权的分配算法
通常采取的方法是把内存中可供分配的所有物理块分成两部分:一部分按比例地分配给各进程;另一部分则根据各进程的优先权进行分配,为高优先进程适当地增加其相应份额。
2.3 页面调入策略
使进程能够正常运行,必须事先将要执行的那部分程序和数据所在的页面调入内存,三个问题
① 系统应在何时调入所需页面
② 系统应从何处调入这些页面
③ 如何进行调入的
(1)何时调入页面
为确定系统将进程运行时所缺页表调入内存的时机,可以采用下面两种方法:
① 预调页策略:将预计在不久之后便会被访问的页面预先调入内存,进程的页一般存放在外存的一个连续区域中。一次调入若干个相邻的页会比一次调入一页更高效。但如果调入的一批页面中的大多数都未被访问,则浪费了内存。
② 请求调页策略:当进程在运行中发生缺页时,就立即提出请求,由系统将缺页调入内存。但这种策略每次仅调入一页,须花费较大的系统开销,增加了启动磁盘 I/O 的频率。
(2)从何处调入页面
当发生缺页请求时,系统从何处将缺页调入内存,可分为下面三种情况:
① 系统拥有足够的对换区空间:这时可以全部从对换区调入所需页面,以提高调页速度。为此需将于该进程有关的文件从文件区复制到对换区。
② 系统缺少足够的对换区空间:这时凡是不会被修改的文件,都直接从文件区调入;而当换出这些页面时,由于它们未被修改,则不必再将它们重写到磁盘(换出),以后再调入时,仍从文件区直接调入。但对于那些可能被修改的部分,在将它们换出时便须调到对换区,以后需要时再从对换区调入。
(3)页面调入过程
每当程序所要访问的页面未在内存时(存在位为“0”),便向CPU发出一缺页中断,中断处理程序首先保留CPU环境,分析中断原因后转入缺页中断处理程序。 此时该程序通过查找找到该页面的物理块,然后将其换入到内存中。
(4)缺页率
假设一个进程的逻辑空间为n页,系统为其分配的内存物理块数为m(m≤n)。如果在进程的运行过程中,访问页面成功(即所访问页面在内存中)的次数为S,访问页面失败(即所访问页面不在内存中,需要从外存调入)的次数为F,则该进程总的页面访问次数为A = S + F,那么该进程在其运行过程中的缺页率即为 f = F / A
3 页面置换算法
地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断。当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法
3.1 最佳置换算法
- 其所选择的被淘汰页面是以后永不使用的,或者是在未来最长时间内不再被访问的页面
- 采用最佳置换算法,通常可以保证获得最低的缺页率
- 但由于人们目前无法预知,哪个页面是未来最长时间不被访问的,所以该算法是无法实现的,但可以用该算法去评价其他算法
利用最佳页面置换算法时的置换图
3.2 先进先出(FIFO)页面置换算法
- 该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰
- 这种算法的实现和队列是一样,OS维护一个当前在内存中的所有页面的链表,最新进入的页面在尾部,最久的在头部,每当发生缺页中断,就替换掉表头的页面并且把新调入的页面加入到链表末尾
利用FIFO置换算法时的置换图
3.3 最近最久未使用置换算法(LRU)
当需要淘汰一个页面时,总是选择最近最久未使用的页面予以淘汰
LRU页面置换算法
- LRU置换算法的硬件支持
(1)寄存器
为了记录某进程唉内存中各页的使用情况,须为每个在内存中的页面配置一个移位寄存器。
某进程具有8个页面时的LRU访问情况
(2)栈
- 每当进程访问某页面时,便将该页面的页面号从栈中移出,将它压入栈顶
- 因此,栈顶始终是最新被访问的页面编号,栈底是最近最久未使用的页面编号
用栈保存当前使用页面时栈的变化情况
3.4 最少使用置换算法(LFU)
- 采用该算法时,应为在内存中的每个页面设置一个移位寄存器,用来记录该页面被访问的频率
- 当需要淘汰一个页面时,总是选择最近时期使用最少的页面予以淘汰
- LFU 与 LRU 的访问图完全相同
3.5 Clock置换算法(最近未使用算法 NRU)
- LRU算法的性能接近于OPT,但是实现起来比较困难,且开销大
- FIFO算法实现简单,但性能差。
- NRU是开销比较小的接近LRU性能的
(1)简单的CLOCK算法
- 为每页设置一位访问位,再将内存中的所有页面都通过链接指针成一个循环队列
- 当某页被访问时,其访问位被置为1
- 置换算法在选择一页淘汰时,只需要检查页的访问位。如果是0,就选择该页换出;若为1,则重新将它置0,暂不换出,给予该页第二次驻留内存的机会。
- 按照FIFO算法检查下一个页面,当检查到队列中的最后一个页面时,若其访问位仍为1,再返回队首去检查第一个页面
(2)改进型Clock 置换算法
对于修改过的页面,在换出的时候所付出的开销比未修改过的页面大。在使用位的基础上再增加一个修改位,则得到改进型的CLOCK置换算法,考虑置换代价。
由访问位A和修改位M可以组合四种类型页面:
① A=0 M=0:表示该页最近即未被访问,也未被修改,是最佳的淘汰页
② A=0 M=1:表示该页最近未被访问,但已被修改,并不是很好的淘汰页
③ A=1 M=0:表示该页最近被访问,但未被修改,该页有可能再被访问
④ A=1 M=1:表示该页已被访问且被修改,该页可能再被访问
执行过程分成三步:
① 从指针的当前位置开始,扫描循环队列,寻找A=0 M=0的第一类页面,将遇到的第一个页面作为所选中的淘汰页。在第一次扫描期间不改变访问位A
② 如果第一步失败,寻找A=0 M=1的第二类页面,将遇到的第一个页面作为所选中的淘汰页。在第二轮扫描期间,将所有扫描过的页面的访问位都置0
③ 如果第二步也失败,则将指针返回到最开始的位置,并所有的访问位都复0,然后重复第二步。
attention:改进型的CLOCK算法优于简单CLOCK算法之处在于替换时首选没有变化的页。由于修改过的页在被替换之前必须写回,因而这样做会节省时间
3.4 页面缓冲算法(PBA)
(1)影响页面换进换出效率的若干因素
① 页面置换算法 ② 写回磁盘的频率 ③ 读入内存的频率
(2)页面缓冲算法(PBA)
主要特点:① 显著降低页面换进换出的频率,是磁盘I/O的操作次数大为减少。②因为第①,所以才能使其采用一种简单的置换策略,如先进先出FIFO算法,不需要特殊的硬件支持。
页面缓冲算法(PBA)在内存分配上采用了可变分配和局部置换方式,系统为每个进程分配一定数目的物理块,系统自己保留一部分空闲物理块,为了显著降低页面换进换出的频率,在内存中设置了两个链表
- 空闲页面链表
实际上是一个空闲物理块链表,是系统掌握的空闲物理块,用于分配给频繁发生缺页的进程,以降低该进程的缺页率。
- 修改页面链表
由已修改的页面所形成的链表,设置该链表的目的为了减少已修改页面换出的次数。
4 “抖动”与工作集
4.1 多道程序度与“抖动”
(1)多道程序度与处理机的利用率
-
由于虚拟存储器系统能从逻辑上扩大内存,这时,只需装入一个进程的部分程序和数据便可开始运行,故人们希望在系统中能运行更多的进程,即增加多道程序度,以提高处理机的利用率。
-
但处理机的实际利用率却如图:(其中横轴表示进程的数量,纵轴表示多道程序度。之所以会发生后面阶段利用率趋于0的情况,是因为在系统中已发生抖动。)
(2)产生“抖动”的原因
-
根本原因:同时在系统中运行的进程太多,由此分配给每一个进程的物理块太少,不能满足进程正常运行的基本要求,致使每个进程在运行时,频繁地出现缺页,必须请求系统将所缺之页调入内存。这会使得在系统中排队等待页面调进/调出的进程数目增加
-
对磁盘的有效访问时间也随之急剧增加,造成每个进程的大部分时间都用于页面的换进/换出,而几乎不能再去做任何有效的工作,从而导致发生处理机的利用率急剧下降并趋于0的情况
4.2 工作集
(1)基本概念
进程发生缺页率的时间间隔与进程所获得的物理块数量有关
(2)定义
- 工作集是指在某段时间间隔 ∆ 里,进程实际要访问的页面的集合
- 把进程在某段时间间隔 ∆ 里,在时间 t 的工作集记为w(t,∆),变量 ∆ 称为工作集“窗口尺寸”
某进程访问页面的序列和窗口大小分别为3、4、5时的工作集。由此,可将工作集定义为,进程在时间间隔(t- ∆,t)中引用页面的集合
(3)工作集的特点
① 工作集的大小是变化的
② 相对比较稳定的阶段和快速变化的阶段交替出现
③ 根据局部性原理,进程会在一段时间内相对稳定在某些页面构成的工作集上
④ 当局部性区域的位置改变时,工作集大小快速变化
⑤ 当工作集窗口滑过这些页面后,工作集又稳定在一个局部性阶段
4.3 “抖动”的预防方法
(1)采取局部置换策略
缺页时,只能在分配给自己的内存里进行置换,不允许从其他进程获取新的物理块,这样即使该进程发生抖动也不好影响其他进程。但效果不是很好,在某进程发生抖动后,他还会常去处于磁盘的io等待队列中,这会延迟其他进程区人员中断的处理时间
(2)把工作集算法融入到处理机调度中
当调度程序发现处理机利用率低下时,它将试图从外存调入一个新作业进入内存,来改善处理机的利用率。 在融入工作集算法后,在调度程序从外存调入作业之前,必须检查每个进程在内存驻留页面是否足够多。如果都足够多,此时便可以将新作业调入内存中,反之则不调入
(3)利用“L=S”准则调节缺页率
Denning于1980年提出了“L=S”的准则来调节多道程序度,其中L是缺页之间的平均时间,S是平均缺页服务时间,即用于置换一个页面所需的时间。如果是L远比S大,说明很少发生缺页,磁盘的能力尚未得到充分的利用;反之,如果是L比S小,则说明频繁发生缺页,缺页的速度已超过磁盘的处理能力。只有当L与S接近时,磁盘和处理机都可达到它们的最大利用率。理论和实践都已证明,利用“L=S”准则,对于调节缺页率是十分有效的
(4)选择暂停的进程
当多道程序度偏高时,已影响到处理机的利用率,为了防止发生“抖动”,系统必须减少多道程序的数目。 此时根据某种算法选择一个进程,暂停该进程
5 请求分段存储管理方式
请求分段存储管理方式和请求分页管理方式,在实现原理和所需要的硬件支持都是十分相似的。只不过,是以分段为单位进行换入和换出的
5.1 请求分段中的硬件支持
与请求分页系统相似,在请求分段系统中所需的硬件支持有段表机制、缺段中断机构,以及地址变换机构
(1)请求段表机制
在请求分段系统中需要的主要数据结构是请求段表,即在段表的基础上进行了扩充,增加以下字段
- 存取方式: 存取属性(执行、只读、允许读/写)
- 访问字段A:记录该段被访问的频繁程度
- 修改位M: 表示该段在进入内存后,是否被修改过
- 存在位P: 表示该段是否在内存中
- 增补位: 表示在运行过程中,该段是否做过动态增长
- 外存地址: 表示该段在外存中的起始地址
(2)缺段中断机构
和与缺页中断机构类似,请求分段系统中采用的是请求调段策略。每当发现运行进程所要访问的段尚未调入内存时,便由缺段中断机构产生一缺段中断信号,进入OS后,由缺段中断处理程序将所需的段调入内存
(3)地址变换机构
请求分段系统中的地址变换机构是在分段系统地址变换机构的基础上形成的。因为被访问的段并非全在内存,所以在地址变换时,若发现所要访问的段不在内存,必须先将所缺的段调入内存,并修改段表,然后才能再利用段表进行地址变换。为此,在地址变换机构中又增加了某些功能,如缺段中断的请求及处理等
5.2 分段的共享与保护
(1)为了实现分段共享,可在系统中设置一个共享段表,所有共享段都在共享段表中占有一个表项,共享段表内容如下
(2)共享段的分配与回收
- 共享段分配
为共享段分配内存时,对第一个请求使用该共享段的进程,由系统为之分配一个物理区,再把共享段表中增加一表项,修改添加相应的数据。对于后面申请使用该共享段的进程,只需要在该进程段表中增加一项,并添加修改相应的数据。
- 共享段的回收
当共享此段的某进程不在需要该段时,将该段释放,包括撤销该进程段表中对应的表项。同时修改共享段表的数据,当没有一个进程调用该段时,则操作系统对该段进行回收。
5.3 分段保护
(1)越界检查
利用地址变换机构来完成,在此中设置了段表寄存器,用于存放段表始址和段表长度信息。
(2)存取控制检查
以段位基本单位进行的。通常的访问方式:
① 只读 ② 只执行 ③ 读/写
(3)环保护机构
低编号的环具有高优先权。OS处于0号,某些重要的实用程序和操作系统服务占中间环,而一般则被安排在外环上,遵循规则;
- 一个程序可以访问驻留在相同或者较低特权(外环)中的数据
- 一个程序可以调用驻留在相同环或较高特权环(内环)中的服务