虚拟存储器概述
- 常规存储管理方式的特征和局部性原理
- 特征
- 一次性
作业必须一次性地全部装入内存后才能开始运行
导致大作业无法在小内存中运行
对内存空间的一种浪费 - 驻留性
整个作业一直驻留在内存中
占据了大量的内存空间
浪费宝贵的内存资源
- 一次性
- 局部性原理
- 时间局部性
某条指令被执行,之后可能再次执行
程序内存在大量的循环操作 - 空间局部性
访问了某个存储单元,附近的存储单元也将被访问
地址可能集中在一定范围之内
程序的顺序执行
- 时间局部性
- 特征
- 虚拟存储器的定义和特征
- 虚拟存储器的定义
虚拟存储器是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统 - 虚拟存储器的特征
- 多次性
一个作业中的程序和数据允许被分成多次调入内存运行 - 对换性
无须在作业运行时一直常驻内存,允许在运行过程中进行换进、换出 - 虚拟性
从逻辑上扩充内存容量,使看到的内存容量远大于实际内存容量
- 多次性
- 虚拟存储器的定义
- 虚拟存储器的实现方法
- 请求分页系统
分页请求系统是在分页系统的基础上增加了请求调页功能和页面置换功能所形成的页式虚拟存储系统
它通过调页功能及页面置换功能陆续地把即将运行的页面调入内存,同时把暂不运行的页面换出到外存上,为了能实现请求调页和页面置换功能,系统必须提供必要的硬件支持和实现请求分页的软件- 硬件支持
- 请求分页的页表机制
它是在纯分页的页表机制上增加若干项而形成的,作为请求分页的数据结构 - 缺页中断机构
每当用户程序要访问的页面尚未调入内存时,便产生一缺页中断,以请求OS将所缺的页调入内存 - 地址变换机构
它同样是在纯分页地址变换机构的基础上发展形成的
- 请求分页的页表机制
- 实现请求分页的软件
包括有用于实现请求调页的软件和实现页面置换的软件。
它们在硬件的支持下,将程序正在运行时所需的页面(尚未在内存中的)调入内存,再将内存中暂时不用的页面从内存置换到磁盘上
- 硬件支持
- 请求分段系统
- 请求段页式系统
- 请求分页系统
请求分页存储管理方式
-
请求分页中的硬件支持
-
请求页表机制
在请求分页系统中的每个页表应含以下诸项
状态位P:指示该页是否已调入内存
访问字段A:记录本页在一段时间内被访问的次数
修改位M:标识该页在调入内存后是否被修改过;若已被修改,将该页重写到外存上
外存地址:物理块号 -
缺页中断机构
缺页中断与一般中断的区别- 在指令执行期间而不是一条指令执行完后产生和处理中断信号,属于内部中断
- 一条指令在执行期间可能产生多次缺页中断
-
地址变换机构
地址变换过程
首先检索快表,找出所要访问的页;若找到,便修改页表项中的访问位
若没找到,去内存中查找页表,查看状态位P是否已调入内存;若已调入内存,将该页写入快表;若快表已满,进行换入换出
若未调入内存,产生缺页中断,从外存调入内存
-
-
请求分页中的内存分配
- 内存分配策略
- 固定分配局部置换
为每个进程分配一组固定数目的物理块,运行期间不改变 - 可变分配全局置换
将空闲物理块或所有进程的物理块选择一块换出,将所缺页换入 - 可变分配局部置换
允许从该进程在内存的页面中选择一页换出,这样不会影响其他进程的运行
- 固定分配局部置换
- 物理块分配算法
采用固定分配策略时,可以采用以下几种算法将系统中可供分配的所有物理块分配给各个进程- 平均分配算法
- 按比例分配算法
如果系统中有n个进程,每个进程的页面数为 S i S_{i} Si,则系统中各进程页面数的总和为
S = ∑ i = 1 n S i S=\sum^{n}_{i=1}S_{i} S=i=1∑nSi
又假定系统中可用物理块总数为m,则每个进程所能分到的物理快数为 b i b_{i} bi,可由下式计算
b i = S i S ⋅ m b_{i}= \frac{S_{i}}{S} \cdot m bi=SSi⋅m
这里, b i b_{i} bi应该取整,它必须大于最小物理块数
- 考虑优先权的分配算法
- 内存分配策略
-
页面调入策略
- 何时调入页面
- 预调页策略
- 请求调页策略
- 页面调入过程
- 发出缺页中断
- 将所缺页调入内存
- 修改页表
- 缺页率
- 定义
如果在进程的运行过程中,访问页面成功的次数为 S S S,访问页面失败的次数为 F F F,则缺页率 f f f即为
f = F F + S f=\frac{F}{F+S} f=F+SF - 影响因素
- 页面大小
- 进程所分配物理块的数目
- 页面置换算法
- 程序固有特性
- 计算公式
假设被置换的页面被修改的概率是 β \beta β,其缺页中断处理时间为 t α t_{\alpha} tα,被置换页面没有被修改的缺页中断时间为 t β t_{\beta} tβ,那么,缺页中断处理时间的计算公式为
t = β ⋅ t α + ( 1 − β ) ⋅ t β t = \beta \cdot t_{\alpha}+(1-\beta) \cdot t_{\beta} t=β⋅tα+(1−β)⋅tβ
- 定义
- 何时调入页面
页面置换算法
-
最佳置换算法和先进先出置换算法
- 最佳置换算法
- 最佳置换算法所选择的被淘汰页面将是以后永不使用的,或许是在最长(未来)时间内不再被访问的页面
- 该算法是无法实现的,但可以利用该算法去评价其他算法
- 先进先出(FIFO)页面置换算法
- FIFO算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰
- FIFO算法可能出现Belady异常
- FIFO算法没有基于局部性原理
- 最佳置换算法
-
最近最久未使用和最少使用置换算法
- 最近最久未使用(LRU)置换算法
- LRU页面置换算法选择最近最长时间未使用的页面予以淘汰
- 最佳置换算法是从“向后看”的观点出发的;而 LRU 算法则是“向前看”的
- LRU算法基于局部性原理
- LRU算法是堆栈类算法
- 最少使用(LFU)置换算法
LFU算法选择在最近时期使用最少的页面作为淘汰页
- 最近最久未使用(LRU)置换算法
-
Clock置换算法
-
简单的Clock置换算法(最近未用算法或NRU算法)
-
改进型Clock置换算法
在改进型Clock算法中,又增加了修改位M- 四种页面类型
- 1类(A=0,M=0):表示该页最近既末被访问,又未被修改,是最佳淘汰页
- 2类(A=0,M=1):表示该页最近未被访问,但已被修改,不是很好的淘汰页
- 3类(A=1,M=0):表示最近已被访间,但未被修改,该页有可能再被访问
- 4类(A=1,M=1):表示最近已被访问且被修改,该页可能再被访问
- 执行过程
- 从指针的当前位置开始,扫描循环队列,在这次扫描期间不改变访问位A,选择第一个A=0且M=0的页面用于置换
- 如果第一步失败,则重新扫描,选择第一个A=0且M=1的页面用于置换。在第二轮扫描期间,将所有扫描过的页面的访问位都置0
- 如果第二步也失败,则将指针返回到开始的位置,且所有的访问位均为0。然后重复第一步,如果仍失败,必要时再重复第二步。
- 四种页面类型
-
-
访问内存的有效时间
在具有快表机制的请求分页管理方式中,存在下面三种方式的内存访问操作,以及是否考虑命中率和缺页率,其内存有效访问时间分别为- 被访问页在内存中,且其对应的页表项在快表中时: E A T = λ + t EAT=\lambda+t EAT=λ+t
- 被访问页在内存中,且其对应的页表项不在快表中时: E A T = λ + t + λ + t = 2 ⋅ ( λ + t ) EAT=\lambda+t+\lambda+t=2 \cdot(\lambda+t) EAT=λ+t+λ+t=2⋅(λ+t)
- 被访问页不在内存中,假设缺页中断处理时间为 ε \varepsilon ε,则 E A T = λ + t + ε + λ + t = ε + 2 ( λ + t ) EAT=\lambda+t+\varepsilon+\lambda+t=\varepsilon+2 (\lambda+t) EAT=λ+t+ε+λ+t=ε+2(λ+t)
- 考虑快表的命中率 α \alpha α和缺页率 f f f等因素时, E A T = λ + α ⋅ t + ( 1 − α ) ⋅ [ t + f ⋅ ( ε + λ + t ) + ( 1 − f ) ⋅ ( λ + t ) ] EAT=\lambda+\alpha \cdot t + (1-\alpha) \cdot [t+f \cdot(\varepsilon+\lambda+t)+(1-f) \cdot (\lambda+t)] EAT=λ+α⋅t+(1−α)⋅[t+f⋅(ε+λ+t)+(1−f)⋅(λ+t)]
- 如果不考虑命中率,仅考虑缺页率,设缺页中断处理时间为 φ \varphi φ,得 E A T = t + f ⋅ ( φ + t ) ⋅ 4 − ( 1 − f ) ⋅ t EAT=t+f \cdot(\varphi+t)\cdot 4-(1-f)\cdot t EAT=t+f⋅(φ+t)⋅4−(1−f)⋅t
其中,EAT为内存的有效访问时间, λ \lambda λ为查找快表的时间, t t t为访问实际物理地址所需的时间
“抖动”与工作集
- 抖动
- 定义
页面置换中,频繁的页面调度行为称为抖动或颠簸 - 产生“抖动”的原因
某个进程频繁访问的页面数目高于可用的物理页帧数目
系统中运行的进程太多,分配给进程的物理块太少,导致每个进程频繁地出现缺页
每个进程大部分时间都用于页面换入换出,处理机利用率趋于0
- 定义
- 工作集
工作集是指在某段时间间隔里,进程实际所要访问页面的集合 - “抖动”的预防方法
- 采取局部置换策略
- 把工作集算法融入到处理机调度中
- 利用“L=S”准则调节缺页率
- 选择暂停的进程
请求分段存储管理方式
-
请求分段中的硬件支持
- 请求段表机制
请求段表的段表项中包括以下字段:段名(号)、段长、段基址、存取方式、访问字段A、修改位M、存在位P、增补位、外存始址 - 地址变换机构
- 请求段表机制
-
分段保护
- 越界检查
- 存取控制检查
- 环保护机构