目录
2.2.2先进先出页面置换算法(FIFO,First In First Out)
2.2.3最近最久未使用页面置换算法(LRU, Least Recently Used)
2.2.5Clock页面置换算法(NRU,Not Recently Used)
2.2.6页面缓冲算法PBA(Page Buffering Algorithm)
一、虚拟存储器概述
前面所介绍的各种存储器管理方式,有一个共同特点:作业全部装入内存后方能运行。
问题: 大作业装不下、少量作业得以运行
解决办法: 扩充内存、逻辑上扩充内存容量(虚拟存储器)
1.1局部性原理
1. 常规存储器管理方式的特征:
一次性:作业被一次性全部装入内存
驻留性:作业一直驻留在内存
一次性和驻留性使许多在程序运行中不用或暂不用的程序(数据)占据了大量的内存空间,使得一些需要运行的作业无法装入运行。
2. 微机操作系统的发展:
1.2定义与特征
1. 虚拟存储器定义:
原理:基于局部性原理,应用程序在运行之前,没有必要全部装入内存,仅须将那些当前要运行的部分页面或段先装入内存便可运行,其余部分暂留在盘上。
定义:虚拟存储器:具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。
目标:其逻辑容量由内存容量和外存容量之和所决定,其运行速度接近于内存速度,而成本接近于外存。
2.虚拟存储器的特征:
(1) 多次性:作业中的程序和数据允许被分成多次调入内存运行
(2) 对换性:作业运行时无须常驻内存
(3) 虚拟性:从逻辑上扩充了内存容量,使用户看到的内存容量远大于实际内存容量
1.3实现方法
请求分页系统:
硬件支持:页表、缺页中断、地址变换机构。
软件支持:请求调页软件、页面置换软件。
请求分段系统:
硬件支持:段表、缺段中断、地址变换机构。
软件支持:请求调段软件、段置换软件。
段页式虚拟存储器:
增加请求调页和页面置换。
Intel 80386 及以后。
二、请求分页存储管理方式
2.1请求分页存储管理
2.1.1请求分页中的硬件支持
1. 请求页表机制:
(1)状态位P:指示该页是否在内存
(2)访问字段A:记录该页在一段时间内被访问的次数
(3)修改位M:也称脏位(dirty bit),标志该页是否被修改过
(4)外存地址:指示该页在外存中的地址(物理块号)
2. 缺页中断机构:
在指令执行期间产生和处理中断信号。
一条指令在执行期间,可能产生多次缺页中断。
3. 地址变换机构:与分页内存管理方式类似
补充知识点1:请求页表机制
补充知识点2:地址变换机构具体实现
2.1.2请求分页中的内存分配
2.1.3页面调入策略
1. 何时调入页面:
预调页策略:预先调入一些页面到内存。
请求调页策略:发现需要访问的页面不在内存时,调入内存。
2. 从何处调入页面:
(1)如系统拥有足够的对换区空间,全部从对换区调入所需页面
(2)如系统缺少足够的对换区空间,凡是不会被修改的文件,都直接从文件区调入;当换出这些页面时,由于未被修改而不必再将它们重写磁盘,以后再调入时,仍从文件区直接调入;修改部分,放入对换区
(3)UNIX方式:未运行过的页面,从文件区调入;曾经运行过但又被换出的页面,从对换区调入
3.页面调入方法:
(1)查找所需页在磁盘上的位置。
(2)查找一内存空闲块:
如果有空闲块,就直接使用它;
如果没有空闲块,使用页面置换算法选择一个“牺牲”内存块;
将“牺牲”块的内容写到磁盘上,更新页表和物理块表。
(3)将所需页读入(新)空闲块,更新页表。
(4)重启用户进程。
4. 缺页率:
缺页中断处理时间的例子:
2.2页面置换算法
页面置换:找到内存中没有使用的一些页,换出
算法:替换策略。
性能 :找出一个导致最小缺页数的算法。
同一个页可能会被装入内存多次。
页面置换完善了逻辑内存和物理内存的划分——在一个较小的物理内存基础之上可以提供一个大的虚拟内存。
页面置换算法:
最佳置换算法(OPT) 先进先出置换算法(FIFO) 最近最久未使用置换算法(LRU)
最少使用算法(LFU) Clock置换算法 页面缓冲算法
需要一个最小的缺页率。
通过运行一个内存访问的特殊序列(访问序列),计算这个序列的缺页次数。
2.2.1最佳页面置换算法OPT(Optimal)
最佳置换算法例子:
2.2.2先进先出页面置换算法(FIFO,First In First Out)
先进先出置换算法例子:
2.2.3最近最久未使用页面置换算法(LRU, Least Recently Used)
LRU算法的硬件支持:
1)寄存器:为内存中的每个页面设置一个移位寄存器。
被访问的页面对应寄存器的Rn−1位置为1,定时右移。
具有最小数值的寄存器所对应的页面为淘汰页。
(2)栈:保存当前使用的各个页面的页面号。
被访问的页,移到栈顶。
栈底是最近最久未使用页面的页面号。
2.2.4最少使用页面置换算法LFU
为内存中的每个页面设置一个移位寄存器,用来记录该页面的被访问频率。
LFU 选择在最近时期使用最少的页面∑Ri作为淘汰页。
2.2.5Clock页面置换算法(NRU,Not Recently Used)
LRU的近似算法,又称最近未用(NRU)或二次机会页面置换算法
1. 简单的Clock算法
每个页都与一个访问位相关联,初始值位0。
当页被访问时置访问位为1。
置换时选择访问位为0的页 ;若为1,重新置为0。
2.改进型Clock算法:
除须考虑页面的使用情况外,还须增加置换代价。
淘汰时,同时检查访问位A与修改位M
第1类(A=0,M=0):表示该页最近既未被访问、又未被修改,是最佳淘汰页。
第2类(A=0,M=1):表示该页最近未被访问,但已被修改,并不是很好的淘汰页。
第3类(A=1,M=0):表示该页最近已被访问,但未被修改,该页有可能再被访问。
第4类(A=1,M=1):表示该页最近已被访问且被修改,该页有可能再被访问。
置换时,循环依次查找第1类、第2类页面,找到为止
第一轮扫描:扫描第一个(A=0, M=0)的帧用于替换,不改变访问位A。
第二轮扫描:扫描第一个(A=0, M=1)的帧用于替换,将所有扫描过的页面访问位A都置0
第三轮扫描:扫描第一个(A=0, M=0)的帧用于替换,不修改任何标志。
第四轮扫描:扫描第一个(A=0, M=1)的帧用于替换。
2.2.6页面缓冲算法PBA(Page Buffering Algorithm)
1. 影响效率的因素:(1)页面置换算法 (2)写回磁盘的频率 (3)读入内存的频率
目的:
显著降低页面换进、换出的频率,减少了开销。
可采用较简单的置换策略,如不需要硬件支持。
2. 具体做法:
设置两个链表: ①空闲页面链表:保存空闲物理块。 ②修改页面链表:保存已修改且需要被换出的页面等被换出的页面数目达到一定值时,再一起换出外存。
访问内存的有效时间EAT:
知识回顾:
2.3“抖动”与工作集
如果一个进程没有足够的页,那么缺页率将很高,这将导致:
CPU利用率低下。
操作系统认为需要增加多道程序设计的道数。
系统中将加入一个新的进程。
抖动(Thrashing) :一个进程的页面经常换入换出。
1. 处理机的利用率:
2.产生“抖动”的原因:
根本原因:
同时在系统中运行的进程太多;
因此分配给每一个进程的物理块太少,不能满足进程运行的基本要求,致使进程在运行时,频繁缺页,必须请求系统将所缺页面调入内存。
抖动的发生与系统为进程分配物理块的多少有关。
3.缺页率与物理块数之间的关系:
进程发生缺页的时间间隔与所获得的物理块数有关。
根据程序运行的局部性原理,如果能够预知某段时间内程序要访问的页面,并将它们预先调入内存,将会大大降低缺页率。
4.工作集定义:
所谓工作集,指在某段时间间隔Δ里进程实际要访问页面的集合。
把某进程在时间t的工作集记为w(t, Δ),其中的变量Δ称为工作集的“窗口尺寸”。
工作集w(t,Δ)是二元函数,即在不同时间t的工作集大小不同,所含的页面数也不同;工作集与窗口尺寸Δ有关,是Δ的非降函数,即:w(t,Δ)⊆w(t,Δ+1)
工作集举例:
5.抖动的预防方法:
(1)采取局部置换策略:只能在分配给自己的内存空间内进行置换;
(2)把工作集算法融入到处理机调度中;
(3)利用“L=S”准则调节缺页率:
L是缺页之间的平均时间 。
S是平均缺页服务时间,即用于置换一个页面的时间 。
L>S,说明很少发生缺页 。
L<S,说明频繁缺页。
L=S,磁盘和处理机都可达到最大利用率 。
(4)选择暂停进程。
三、请求分段存储管理方式
3.1 请求分段中的硬件支持
1. 请求段表机制:
(1)存取方式:表示段存取属性为只执行、只读或允许读/写
(2)访问字段A:记录该段在一段时间内被访问的次数
(3)修改位M:标志该段调入内存后是否被修改过
(4)存在位P:指示该段是否在内存
(5)增补位:表示该段在运行过程中是否做过动态增长
(6)外存始址:指示该段在外存中的起始地址(盘块号)
2. 缺段中断机构:
在指令执行期间产生和处理中断信号。
一条指令在执行期间,可能产生多次缺段中断。
由于段不是定长的,对缺段中断的处理要比对缺页中断的处理复杂。
3.地址变换机构:
若段不在内存中,则必须先将所缺的段调入内存,并修改段表,然后利用段表进行地址变换。
3.2分段的共享
1. 共享段表:保存所有的共享段
共享进程计数count、存取控制字段、段号
2. 共享段的分配:
对首次请求使用共享段的用户,分配内存,调入共享段,修改该进程段表相应项,再为共享段表增加一项,count=1。
对其他使用共享段的用户,修改该进程段表相应项,再为共享段表增加一项,count=count+1。
3.共享段的回收:
撤销在该进程段表中共享段所对应的表项,unt=count-1操并执行co作。
若为0,回收该共享段的内存,并取消共享段表中对应的表项。
若不为0,只取消调用者进程在共享段表中的有关记录。
4.分段保护:
(1)越界检查:
由地址变换机构来完成; 比较段号与段表长度;段内地址与段表长度。
(2)存取控制检查:以段为基本单位进行。
通过“存取控制”字段决定段的访问方式; 基于硬件实现。
(3)环保护机构:
低编号的环具有高优先权;
一个程序可以访问驻留在相同环或较低特权环(外环)中的数据;
一个程序可以调用驻留在相同环或较高特权环(内环)中的服务。
四、虚拟存储器实现实例
实例1:Windows XP系统
采用请求页面调度以及簇来实现虚拟存储器
使用簇在处理缺页中断时,不但会调入不在内存中的页(出错页),还会调入出错页周围的页。
创建进程时,系统会为其分配工作集的最小值和最大值:
最小值:进程在内存中时所保证页面数的最小值。
若内存足够,可分配更多的页面,直到达到最大值。
通过维护空闲块链表(与一个阈值关联)来实现。
采用局部置换方式。
置换算法与处理器类型有关:如80x86系统,采用改进型Clock算法。
实例2:Linux系统(以32位为例)
虚拟存储器是大小为4GB的线性虚拟空间。
4GB的地址空间分为两个部分:
用户空间占据0~3GB(0xC0000000)
由用户进程使用(MMU)
使用请求页式存储管理
内核空间占据3GB~4GB
由内核负责
使用buddy和slab内存管理 (zoned buddy 分配器和slab分配器)