第五章 虚拟存储器
5.1虚拟存储器概述
-
前面介绍的各种存储器管理方式有一个共同的特点,即它们都要求将一个作业全部装入内存后方能运行。于是,出现了下面这样两种情况:
(1)有的作业很大,其所要求的内存空间超过了内存总容量,作业不能全部被装入内存,致使该作业无法运行;
(2)有大量作业要求运行,但由于内存容量不足以容纳所有这些作业,只能将少数作业装入内存让它们先运行,而将其它大量的作业留在外存上等待。原因:内存容量不够大。
解决办法:
- (1)从物理上增加内存容量
- (2)从逻辑上扩充内存容量
5.1.1 常用存储管理方式的特征和局部性原理
-
常用存储管理方式的特征
上一章所介绍的存储器管理方式都是传统的存储器管理方式他们的两个共有特征
(1)一次性:指作业必须一次性全部装入内存才能开始执行
(2)驻留性:作业被装入内存后,整个作业一直驻留在内存
-
局部性原理
程序在运行时将呈现局部性的规律
在一较短时间内,程序的执行仅局限于某个部分,相应的,他所访问的存储空间也是局限于某个区域
(1)时间局限性
程序在某条指令被执行后,则不久后该指令可能再次执行,如果数据被访问过,则不久后该数据可能再次被访问
- 典型原因:程序中存在大量循环操作
(2)空间局限性
一旦程序访问了某个存储单元,在一段时间后可能访问该单元附近的存储单元
- 典型情况:程序的顺序执行
-
虚拟存储器的基本工作情况
基于局部性原理可知:
- 程序在运行之前不全装内存,仅将当前要运行的页面或段先装入,其余部分暂留在盘上。
- 程序在运行时,需要访问的页(段)已调入内存,继续执行;
- 程序所要访问的页(段)尚未调入内存(缺页或缺段),程序利用OS所提供的请求调页(段)功能将它们调入内存,则继续执行。
- 如果此时内存已满,无法再装入新的页(段),则还须再利用页(段)的置换功能,将内存中暂时不用的页(段)调至盘上,腾出足够的内存空间后,再将要访问的页(段)调入内存,继续执行。
5.1.2 虚拟存储器的定义和特征
-
虚拟存储器的定义
感觉系统存储量大于程序大小的一种错觉,这就是虚拟存储器
实质上是具有请求调入和置换功能,在逻辑上实现内存容量扩充的一种存储器系统
- 逻辑容量由内存和外存之和觉定,速度接近于内存,每位成本又接近于外存
-
虚拟存储器的特征
(1)多次性
(2)对换性
(3)虚拟性
PS:虚拟性是以多次性和对换性为基础的,而多次性和对换性是必须建立在离散分配的基础上。
5.1.3 虚拟存储器的实现方法
-
请求分页系统
(1)硬件支持:① 请求分页的页表机制 ② 缺页中断机构 ③ 地址变换机构
(2)实现请求分页的软件
-
请求分段系统
(1)硬件支持:① 请求分段的段表机制 ② 缺段中断机构 ③ 地址变换机构
(2)实现请求分段的软件
-
段页式虚拟存储系统
5.2请求分页存储管理方式
5.2.1 请求分页的硬件支持
-
请求页表机制
基本作用:将用户地址空间的逻辑地址映射为内存空间中的物理地址
页号 物理块号 状态位P 访问字段A 修改位M 外存地址 (1)状态位(存在位P):该字段仅有一位,又称位字。它用于指示该页是否已经调入内存,供程序访问时参考
(2)访问字段A:用于记录本页在一端时间内被访问了多少次,或者记录最近已有多长时间未被访问,提供给置换算法(程序)在选择换出页面参考
(3)修改位M:标识该页在调入内存后是否被修改过。内存中每一页都在外存中保留一个副本置换该页时,若未被修改,则不需要将该页写到外存上,以防止增加系统开销和再次启动磁盘,若发生修改,则要保证副本时钟是最新的,将该页写入外存,以供下次置换页面时参考
(4)外存地址:用于支出该页在外存的地址,通常是物理块号,供调入该页时参考
-
缺页中断机制
缺页中断是一种特殊的中断,它与一般的中断相比有明显区别,主要表现在:
- 指令执行期间产生和处理中断信号
- 一条指令执行期间可能发生多次缺页中断
-
地址变换机构
分页系统的地址变换机构加入一些功能如:产生和处理缺页中断,内存中换出一页的功能
图2.请求分页中地址变换过程
5.2.2 请求分页中的内存分配
-
最小物理块的确定
PS:随着进程分配物理块的减少,进程缺页率上升,会降低进程执行速度,为使进程能够有效工作,分配一定的物理块,这不是最小物理块的概念
定义:保证进程正常运行所需的最小物理块数
决定因素:与计算机硬件结构有关,取决于指令格式,功能和寻址方式
-
内存分配策略
请求分页采用两种内存分配策略:固定和可变分配策略。进行置换策略:全局置换和局部置换
(1)固定分配局部置换 (2)可变分配全局置换 (3)可变分配局部置换
-
物理块分配算法
固定分配策略:
①平均分配算法:将系统中可供给的物理块平均分配给各个进程。(未考虑进程本身大小)
②按比例分配算法:跟据进程大小按比例分配
-
如果系统中有n个进程,每个进程页面大小为Si,则各进程页面数总和
∑ i = 1 n s i \sum_{i=1}^{n}{s_i} i=1∑nsi -
又假定系统中可用的物理块总数为m,则每个进程所能分到的物理块数为bi可由下式计算:
S i S × m = b i \frac{S_i}{S}×m=b_i SSi×m=bi
③优先权分配算法
实际应用中,考虑到重要的,紧急的作业能尽快完成给它分配较多的内存空间
-
-
通常采用方法:把内存中可分配物理块分为两部分:
- ①按比例分配给各进程
- ②根据各个进程的优先度进行分配,为优先度高的分配适量份额
5.2.3 页面调入策略
为使进程能够正常运行,必须将事先要执行的那部分进程和数据所在的页面调入内存
现在问题:
- 系统应在何时调入这些页面
- 系统应在何处调入这些页面
- 如何调入这些页面
-
何时调入
①预调策略
以预测为基础,将不久后运行的会访问的页面调入
进程第一次运行程序时将程序员指定的页调入
每当被调入时将工作集所有页调入
②请求调页策略
缺页时调入,一次调一页,开销大,IO频繁
-
何处调入
-
请求分页系统外存分为两部分:文件区和对换区
-
文件区离散分配(访问慢),对换区连续分配(访问快)
系统拥有足够的对换空间
全部从对换区调入,开始时进程全部装入对换区
系统缺少对换空间
未被修改的文件从文件区调入;被修改的部分从对换区调入或换出
UNIX方式
未被运行的页面从文件区调入,修改过的从对换区调入。共享时不调入
-
页面调入过程
① 访问的页面未在内存(存在位为0),发生缺页中断
② 中断机构保留断电的CPU和断点环境,分析中断原因转入中断ISR
③ 根据页表找到外存地址
④ 若内存有空闲页则启动I/O调入,修改页表和块表
⑤ 若内存满,按照置换算法换出一页(若修改过则写入磁盘)再调入,修改页表和块表
⑥ 根据修改后的页表访问调入页
-
缺页率
A次页面访问访问成功S次,访问失败F次(A=S+F),缺页率:
f = F A f=\frac{F}{A} f=AF影响缺页率的因素:
① 页面的大小,页面越大缺页率越低
② 进程分配的物理快数,快数越多越低
③ 页面置换算法,用缺页率衡量算法优劣
④ 程序固有特性,局部化程度越高越低
-
5.3页面置换算法
页面置换算法的引入:
①调入时内存不足则要置换
② 页面置换算法用于选择换出页面,直接影响系统性能
③ 抖动: 刚换出的页面又要访问,浪费时间
④ 好的页面置换算法要有更低的更换频率,以后不用或很长时间不访问的页面
⑤ 最佳置换算法是理想化算法:性能好但是无法实现,用作标准
⑥ 先进先出最直观,性能最差,很少用
5.3.1 最佳置换算法和先进先出算法
-
最佳置换算法
理论算法
选择以后永不使用,或在很长时间内不在访问的页面
缺页率最低,但无法实现
作为一个标准
图3.最佳置换算法算法图 -
先进先出算法
- 最早出现的置换算法
- 总是先淘汰先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰
- 页面按先后次序排队,并设置一个指向最老页面的替换指针
- 算法实现简单,但无法保证经常用到页面不被淘汰
图4.先进先出算法算法图
5.3.2 最近最久未使用和最少使用置换算法
-
最近最久未使用算法(LRU)
- FIFO算法:页面调入先后不反映页面使用情况
- LRU算法根据页面调入后的情况作决策,淘汰最久进最久未使用页面
- 增加访问字段,记录最后一次访问经过的时间,淘汰最大值页面
- 最佳算法"向后看",LRU“向前看”
- LRU效果较好,但要较多硬件支持
图5.最近最久未使用算法算法图
LRU算法硬件支持
寄存器
每个内存页面配置一个移位寄存器R=Rn-1Rn-2Rn-3…R2R1R0访问时将Rn-1置1,定期右移一位,选数值最小页面
图6. 8个面访问LRU访问情况 如上图6,最先R~3~被淘汰,因为其移位次数最少,最近最久未使用栈
利用特殊栈保存当前页面号,访问某页面时,将其压入栈顶。栈顶是最新被访问页面,栈低是最近最久未使用页面
设访问序列为4,7,0,7,1,0,1,2,1,2,6
图7. LRU算法栈示意图
- 最少使用(LFU)置换算法
- LFU为每个页面设置一个移位寄存器,用来记录访问频率
- 选择最近使用最少页面淘汰
- 计数器不现实,只能用寄存器
- 思路:每次访问最高位置1,定期右移,选取最小值页面
- 即可实现实现LRU,又可使用LFU
- 不能完全反映近期页面使用情况
5.3.3 Clock 置换算法
- LRU效果好但要求硬件较多,成本高
- 实际中使用LRU近似算法,例如Clock
简单的Clock算法
① 为每页设置一个访问位,将所有页面链接成一个循环
② 页面访问时检查访问位
③若访问位为0则换出,若为1则置0再给一次机会,FIFO检查下一页面
-
因循环检查,故城Clock算法
-
只反映页面是否被访问,换出未访问页面,也称最近未使用NRU
改进型Clock算法
考虑页面是否被修改,被修改比不被修改换出开销大,置换代价大
- 选择未使用过且未修改过的页面,设访问位A修改位M:
- 1类(A=0,M=0) :最佳淘汰页
- 2类(A=0,M=1):并不是很好的淘汰页
- 3类(A=1,M=0):有可能再次被访问
- 4类(A=1,M=1):该页可能再次被访问
① 从头寻找AM=00页面,找到则淘汰
② 从头寻找AM=01页面,找到则淘汰
③ 所有页面的页面A置0
④ 从头寻找AM=00页面,找到则淘汰
⑤ 从头寻找AM=01页面,找到则淘汰,一定能找到
- 比简单Clock算法可减少磁盘IO次数,但要多次扫描
影响页面置换的因素
- 页面置换算法:最重要原因,减少缺页率
- 写回磁盘时间:设置已修改换出页面链表,多个页面一起换出,减少I/O次数
- 读入内存时间:减少频率,减少开销
5.3.4 页面缓冲算法(PBA)
被换出页面仍然留在内存空闲块中,所有的空闲块形成一个空闲页面缓冲池
-
缺页时,可从缓冲池中找缺的页,减少I/O,减少开销
-
VAX/VMS页面缓冲算法,可显著降低换进换出频率:
① 可变分配局部置换,每进程有一定得物理块,系统有空闲块
② 空闲页面链表:减少页面换进开销
③ 修改页面链表:减少页面换出次数
5.3.5 访问内存有效时间
请求分页管理中内存有效访问时间包括:
访问页表时间t、访问快表时间λ、更新快表时间λ、访问内存数据时间t、缺页中断处理时间ε
- 页在内存 快表有页表项EAT=t+λ
- 页在内存 快表无页表项EAT=t+λ+t+λ
- 页不在内存 EAT=t+λ+ε+t+λ
如果考虑到快表的命中率和缺页率等因素
EAT =λ+a X t+(1-a)×[t+fX(ε+λ+t)+(1-f)×(λ+t)]
5.4“抖动”与工作集
5.4.1 多道程序与抖动
- 多道程序度:系统允许同时运行的程序道数
- 道数太小CPU利用率低
- 倒数太多利用率也低(抖动)
产生抖动的根本原因:
① 系统中同时运行的进程太多
② 每个进程分配物理块太少,不能满足进程运行基本需求
③ 运行频繁出现缺页,磁盘请求太多
④ 进程都在等待而不能做有效工作
缺页率与进程物理块数的关系
进程缺页率与进程分配的物理块数有关,块数越多缺页率越低
5.4.2 工作集
工作集定义
- 1968年Denning提出工作集理论,程序局部性原理,活跃页面
- 工作集:某段时间△里,进程实际要访问页面的集合
- 为减少缺页应将程序的全部工作集装入内存
- 进程在时间t的工作集记为w(t,△)△为工作集窗口尺寸
- 工作集是△的非降函数,即w(t,△)≤w(t,△+1)
- 只能用过去某段时间的行为作为将来某段时间行为的近似。
5.4.3 "抖动"的预防方法
调节多道程序度控制抖动发送
① 采用局部置换策略,不影响其他进程,效果不是很好
② 把工作集融入处理机调度中,缺率很高则先增加页面而不调入新作业
③ L=S调节多道程序度。L缺页之间平均时间,s平均缺页服务时间:L>S很少缺页;L<S频繁缺页;L=S利用率很高
④ 选择暂停进程;降低多道程序度,先暂停优先级最低进程
5.5请求分段存储管理方式
- 分段基础上建立请求分段式虚拟存储器
- 以分段为单位调入调出
- 先调入少量段运行,缺段时再调入新端,没有新空间则淘汰
- 需要硬件支持:段表机制,缺页中断,地址变换机构
5.5.1 请求分段中的硬件支持
- 请求分段机制
- 最主要的数据结构
段名 | 段长 | 段内基址 | 存取方式 | 访问字段A | 修改位M | 状态位P | 增补位 | 外存始址 |
---|
存取方式:实施段保护,读/写/执行
访问字段A:访问频繁程度,供置换算法,调出段参考
修改位M:调入后是否被修改,置换段时参考
增补位:特有字段,运行过程中是否动态增长
外存始址:该段在外存中的物理地址
-
缺段中断机构
-
请求分段系统采用请求调段策略
访问段未调入内存时产生缺段中断
由缺段中断处理程序将所需段调入内存
-
缺段中断机构需要在指令执行期间产生和处理缺段中断
-
一条指令执行期间可能产生多次缺段中断
-
不定长,缺段中断比缺页中断复杂
缺段中断处理过程
-
-
地址变换机构
- 在分段地址变换机构的基础上形成
- 在地址变换时,若发现访问段不存在内存,则先调入段并修改段表,然后利用段表进行地址变换
图11 请求分段地址变换过程
5.5.2 分段的共享与保护
-
共享段表
-
分段共享:系统配置一张共享段表,每个共享段占一表项
-
表项记录信息:
共享段段号,段长,内存始地址,状态位,外存始地址,共享计数,共享该段进程信息
① 共享进程计数
② 存取控制字段:为不同进程赋予不同权限
③ 段号:同一共享段在不同进程有不同段号
-
共享段的分配和回收
共享段的分配
① 第一个进程调入段,共享段表增加一项,计数置1
② 其他进程共享段有该共享段,不调入,计数加1,共享段表添加进程信息
共享段的回收
① 计数减一
② 计数若为0,则释放段内存,若不为0,取消进程在共享段表的信息
-
分段保护
每个分段逻辑上相对独立,容易实现信息保护。保护措施:
①越界检查:地址变换时进行,段表长和段长字段比较
②存取控制检查:段表存取控制字段,R/RW/E,段共享不同用户不同权限
③ 环保护机构:地编号环具有高优先级,OS内核为0环,其他服务程序中环,应用程序外环。
访问规则:a.可以访问同环或者外环数据 b.可以调用同环或者外环服务
- 参考:计算机操作系统(第四版)(汤小丹)