操作系统·虚拟存储器

局部性原理:时间、空间的局部性

虚拟存储器的原理:
只将当前执行需要的部分页或段读入到内存,让程序开始执行。
执行过程中,如果需执行的指令或访问的数据未在内存(称为缺页或缺段),则由处理器通知OS将相应的页或段调入到内存,然后继续执行程序。
操作系统将内存中暂时不使用的页或段调出保存在外存上,从而腾出空间存放将要装入的程序以及将要调入的页或段。

虚拟存储器的特征:多次、对换、虚拟

虚拟存储器的实现建立在离散管理的基础之上。

虚拟内存的实现方法:请求分页系统和请求分段系统

6.1 虚拟存储技术概述

6.1.1 局部性原理

局部性原理(principle of locality):指程序在执行过程中的一个较短时期,所执行的指令地址指令的操作数地址,分别局限于一定区域。
时间局部性:一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短时期内;
空间局部性:当前指令和邻近的几条指令,当前访问的数据和邻近的数据都集中在一个较小区域内。

局部性原理的具体体现:
程序在执行时,大部分是顺序执行的指令,少部分是转移和过程调用指令。
过程调用使程序的执行由一部分区域转到另一部分区域。过程调用的嵌套深度一般不超过5,因此执行的范围不超过这组嵌套的过程
程序中存在相当多的循环结构,它们由少量指令组成,而被多次执行。
程序中存在很多对一定数据结构的操作,如数组操作,但往往局限在较小范围内。

6.1.2 虚拟存储的基本原理

在程序装入时,不必将其全部读入到内存,而只需将当前执行需要的部分页或段读入到内存,
就可让程序开始执行。
在程序执行过程中,如果需执行的指令或访问的数据未在内存(称为缺页或缺段),则由处理器通知OS将相应的页或段调入到内存,然后继续执行程序。
另一方面,操作系统将内存中暂时不使用的页或段调出保存在外存上,从而腾出空间存放将要装入的程序以及将要调入的页或段。

虚拟存储器的定义:具有请求调入功能置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。其逻辑容量由内存容量和外存容量之和决定,其运行速度接近于内存速度。

6.1.3 虚拟存储器的特征

多次性:一个作业允许分成多次调入内存,是虚拟存储器最重要的特征,是任何其他存储管理方式所不具有的(不连续性)
对换性:暂时不用的代码和数据调至外存(换出),需要时再将它们从外存调入内存(换入);对换技术(部分对换)
虚拟性:从逻辑上扩充内存容量,使用户看到的内存容量大于实际的内存容量,是虚拟存储器的最重要的目标。(大空间)
这些扩充内存的技术都是以CPU时间和外存空间换取昂贵内存空间,这是操作系统中的资源转换技术。虚拟性是以多次性和对换性为基础的,多次性和对换性以离散分配为基础。

6.1.4 虚拟存储的实现方法

虚拟存储器的实现建立在离散管理的基础之上。

请求分页系统
在分页系统的基础上增加请求调页功能和置换页面功能所形成的页式虚拟存储器系统、置换时以页面为单位。
硬件支持:请求分页的页表机制、缺页中断机构、地址变换机构。
软件支持

请求分段系统
在分段系统的基础上增加请求调段功能和分段置换功能所形成的段式虚拟存储器系统。
请求分段的段表机制、缺段中断机构、地址变换机构
软件支持

6.1.5 引入虚拟存储技术的好处

大程序:可在较小的可用内存中执行较大的用户程序;
大的用户空间:提供给用户可用的虚拟内存空间通常大于物理内存(real memory)
并发:可在内存中容纳更多程序并发执行;
易于开发:不会影响编程时的程序结构。

6.2 请求分页存储管理方式

6.2.1 请求分页中的硬件支持

基本思想:
请求分页建立在基本分页的基础之上,增加了请求调页和页面置换功能。 
每次调入调出的基本单位都是长度固定的页面 
在进程开始运行之前,不是装入全部页面,而是装入几个或零个页,之后根据进程运行的需要,动态装入其它页;
当内存空间已满,而又需要装入新的页面时,则根据某种算法淘汰某个页,以便装入新的页。

1.请求页表机制
作用:将用户地址空间中的逻辑地址映射为内存空间的物理地址
状态位P:存在位,仅有一位。用来表示该页是否已经装入内存;
访问字段A:记录此页在一段时间被访问的次数,可用来决定淘汰哪页(由不同的算法决定);
修改位M:标识此页是否在被调入内存后被修改过,保证外存中所保留的副本始终是最新的,供页面置换时参考;
外存地址:该页在外存上的位置,通常是物理块号。 

2.缺页中断处理过程
程序在执行时,首先检查页表,当状态位指示该页不在主存时,则引起一个缺页中断发生,其中断执行过程与一般中断相同:
保护现场(CPU环境);
中断处理(中断处理程序装入页面);
恢复现场,返回断点继续执行。

缺页中断同一般中断的区别?
相同点:
都是中断。需要保护现场、中断处理、恢复现场
不同点:
一般中断是一条指令完成后中断,缺页中断是一条指令执行时中断;
一条指令执行时可能产生多个缺页中断。如指令可能访问多个内存地址,这些地址在不同的页中。

操作系统·虚拟存储器_第1张图片

 3.地址变换过程
在地址映射过程中,在页表中发现所要访问的页不在内存,则产生缺页中断。操作系统接到此中断信号后,就调出缺页中断处理程序,根据页表中给出的外存地址,准备将该页调入内存。此时应将缺页的进程挂起(调页完成唤醒)如果内存中有空闲块,则分配一个块,将要调入的页装入该块,并修改页表中相应页表项的状态位及相应的内存块号;若此时内存中没有空闲块,则要淘汰某页(若被淘汰页在内存期间被修改过,则要将其写回外存)。

操作系统·虚拟存储器_第2张图片

 6.2.2 请求分页中的内存分配

1.最小物理块的确定
最小物理块:能保证进程正常运行所需的最小物理块数。
进程应获得的最少物理块数,与硬件结构有关,取决于指令的格式、功能和寻址方式。

2.内存分配策略 (assignment policy)

固定分配策略和可变分配策略
全局置换策略和局部置换策略

物理块的分配策略:
固定分配+局部置换
为每个进程分配一组固定数目的物理块,在运行期间不变;
缺页时只能从本进程的n个物理块中选择一个用于换出再调入一页,保证分配给该进程的内存空间不变;
困难:很难确定为每个进程分配多少个物理块。操作系统·虚拟存储器_第3张图片
可变分配+全局置换
先为每个进程分配一定数目的物理块,OS也保持一个空闲物理块队列,当进程缺页时,由系统从空闲物理块队列中取一个分配给该进程。
当系统空闲物理块队列用完,OS从内存中按某算法选出一页调出,可能任一进程中的页。
最易实现,但会影响到其他页。
操作系统·虚拟存储器_第4张图片
可变分配+局部置换
为每个进程分配一定数目的物理块,当缺页时,只允许从该进程在内存的页面选一页调出。
如进程在运行中频繁发生缺页中断,则系统会为该进程分配若干附加的物理块,直至缺页率减少到适当程度。
操作系统·虚拟存储器_第5张图片

3.物理块的分配算法(初始分配)
平均分配:所有可供分配的物理块平均分配给各进程。
按比例分配:根据进程的大小按比例分配物理块。
考虑优先权分配:为紧急作业分配较多的物理块。
通常方法是把内存中可供分配的物理块分成两部分:一部分按照比例分配给各进程;另一部分根据优先权分配,为高优先权适当增加相应份额。

6.2.3 调入策略

1.何时调入页面 
调入策略确定在外存中页面的调入时机。在页式虚拟管理中有两种常用策略。
①请求调页(demand paging):只调入发生缺页时所需的页面,请求调入的页面一定会被访问,这种策略每次仅调入一页。
优点:容易实现。
 缺点:对外存I/O次数多开销较大
②预调页(prepaging):以预测为基础的预调页策略,将那些预计在不久以后便会被访问的页面预先调入内存。在发生缺页需要调入某页时,一次调入该页以及相关的几个页(工作集)。
优点:提高调页的I/O效率。
缺点:基于预测,若调入的页在以后很少被访问,则效率低,预调的成功率仅有50%

2.何处调入页面
①有足够的交换区:进程装入时,将其全部页面复制到交换区,以后总是从交换区调入。
执行时调入速度快。
要求交换区空间较大。
②缺少足够的对换区:凡是不会被修改的页面,都直接从文件区读入,而被置换时不需调出;会被修改的页面,被置换时需调出到交换区,以后从交换区调入。节省交换区空间。

3.页面调入过程
所要访问的页面不在内存(存在位0),向CPU发出缺页中断;中断处理程序保留CPU环境分析中断原因转入中断处理程序;中断处理程序查找页表得到该页的外存物理块;若内存能容纳新页则启动磁盘IO将所缺之页调入内存,修改页表。若内存满则按照某种页面置换算法从内存中选出某页换出(若该页未被修改过则不必写回磁盘;若该页被修改过则必须写回磁盘),再把所缺的页调入内存中,修改其相关的页表项,同时将其写入快表。整个页面调入过程对用户是透明的。

4.缺页率

F:访问页面失败的次数
A:访问页面成功的次数与访问页面失败的次数之和
缺页率受以下几个因素影响:页面大小;进程所需物理块数;页面置换算法;程序固有特性

6.3 页面置换算法

功能:需要调入页面时,选择内存中哪个物理页面被置换。
目标:把未来不再使用的或短期内较少使用的页面调出,通常只能在局部性原理指导下依据过去的统计数据进行预测
不适当的算法可能导致进程发生抖动;
一个好的页面置换算法应该具有较低的页面更换频率。

6.3.1 最佳页面算法(OPT, optimal)

Belady于1966年提出的理论上的算法
选择“未来永不再使用的”或“在最长时间内不再被访问的”“在离当前最远位置上出现的”页面被置换。是一种理想情况,实际执行中是无法预知的,因而不能实现。“最佳”是指对于任意的内存固定空间m和程序 p, 缺页中断率最小。它是一个理论上的算法。可用作其他算法性能评价的依据。

假定系统为某进程分配了三个物理块,并考虑有以下的页面号引用串。操作系统·虚拟存储器_第6张图片

采用最佳置换算法,只发生了6次页面置换,发生了9次缺页中断。缺页率=9/21

6.3.2 先进先出页面置换算法(FIFO)

置换原理:选择建立最早的页面被置换(选择在内存中驻留时间最久的页面予以淘汰)。可以通过链表来表示各页的建立时间先后。
特点:性能较差。较早调入的页往往可能是经常被访问的页,这些页在FIFO算法下被反复调入和调出产生异常现象。

采用FIFO算法进行页面置换时的情况。
操作系统·虚拟存储器_第7张图片

一共发生了12次页面置换,比最佳置换算法多了1倍。缺页率15/21=3/4,15次页面中断。

FIFO是根据各个页面调入内存的时间来选择被淘汰页面,但页面调入的先后并不能反映页面的
使用情况。 FIFO算法未考虑到程序的动态特性,可能引起异常。 

FIFO的Belady现象
Belady现象:采用FIFO算法时,如果对一个进程未分配它所要求的全部页面,有时就会出现分配的块数增多,缺页率反而提高的异常现象。
Belady现象的描述:一个进程P要访问M个页,OS分配N个内存页面给进程P;对一个访问序列S,发生缺页次数为PE(S,N)。当N增大时,PE(S, N)时而增大,时而减小。
Belady现象的原因:FIFO算法的置换特征与进程访问内存的动态特征是矛盾的,即被置换的页面并不是进程不会访问的。

6.3.3 最近最久未使用置换算法(LRU)

基本思想:基于程序的局部性原理,在前面几条指令中使用频繁的页面很可能在后面的几条指令中频繁使用,反之,已经很久没有使用的页面很有可能在未来较长一段时间内不会使用
置换原理:在缺页发生时选择最后一次访问时间距离当前时间最长的一页并淘汰之。即淘汰没有使用的时间最长(最近最久未使用)的页。
特点:局部性原理的合理近似,性能接近最佳置换(OPT)算法;实现代价很高(软件方法或硬件方法)

我们用“最近的过去”来直接推断“最近的将来”。
操作系统·虚拟存储器_第8张图片

发生了9次页面置换。缺页率:12/21

LRU的实现方法—硬件方法
①寄存器
为每个在内存中的页面配置一个移位寄存器,表示为:

当进程访问某物理块时,要将相应的寄存器的位置为1。
定时信号将每隔一定时间将寄存器右移一次,把n位寄存器的数看作是一个无符号的整数,最近最久未使用的页面就对应着具有最小数值的寄存器 。用于记录某进程在内存中各页的使用情况。
②LRU的实现方法—软件方法:栈
LRU置换算法也可用堆栈的方法来实现。
栈中存放当前内存中的页面号,每当访问一页时就调整一次堆栈,总是使最近访问的那页的页面号保持在栈顶,然后根据当前被访问时间的近远,依次排列,栈底总是最近最久未使用的那页的页面号。

6.3.4 最少使用置换算法(LFU)

原理:选择到当前时间为止被访问次数最少的页面被置换;每页设置访问计数器(移位寄存器),用来记录该页面被访问的频率;发生缺页中断时,淘汰计数值最小的页面,并将所有计数清零

6.3.5 轮转算法(clock)

也称最近未使用算法(NRU, Not Recently Used),它是LRU和FIFO的折中。
每页有一个使用访问位(use),若该页被访问则置use=1。将内存中所有页面都通过链接指针链成一个循环队列。
置换时采用一个指针,从当前指针位置开始按地址先后检查各页,若页的use=0,则该页被置换。
若页的use=1,则修改use,置为0,暂不换出,给予该页第二次驻留内存的机会,再按照FIFO算法检查下一个页面,最后指针停留在被置换页的下一个页。操作系统·虚拟存储器_第9张图片
改进的轮转算法:
选中某页淘汰时,若该页被修改过,需要先写入外存,再调入所需页。若未被修改,则可直接调入。改进的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。然后重复第一步,如果仍失败,必要时再重复第二步,此时就一定能找到被淘汰的页。
该算法与简单 Clock算法比较,可减少磁盘的I/O操作次数,为了找到要淘汰的页面,可能需要经过几轮扫描,使该算法本身的开销有所增加。

影响缺页次数的因素: 
页置换算法
分配给进程的物理块数
页本身的大小
程序的编制方法
操作系统·虚拟存储器_第10张图片

6.4 抖动与工作集

6.4.1 抖动产生的原因和预防方法

不适当地提高多道程序度,不仅不会提高系统吞吐量,反而会出现“抖动”现象,就是刚被换出页很快要被访问,需重新调入,因此在调入前要先选一页调出;而这个刚被换出的页,很快又要被访问,又要将它调入,如此频繁地更换页面,以致一个进程在运行时,把大部分时间花费在页面置换的工作上,我们称该进程发生了“抖动”。

1.抖动产生的原因
调度程序一旦发现CPU的利用率降低,就立即提高多道程序度,引入新的进程参加运行,以提高CPU的利用率。
当新进程进入内存时,由于空闲物理块队列中的物理块都用完了,只能从其它运行进程处去获得物理块,于是又将进一步加剧了另外一些进程的缺页情况,又使等待页面调入/调出的进程数目增多,这又降低了CPU的利用率
那么为了提高CPU的利用率,调度程序又去引入新的进程,这就产生了恶性循环,使缺页率急剧地上升。这时候,运行进程的大部分时间都用于进行页面的换入/换出,几乎不能完成任何有效的工作,我们称这时的进程是处于“抖动”状态。
操作系统·虚拟存储器_第11张图片
从图中可看出CPU的利用率和多道程序度之间的关系。开始时,CPU的利用率随着程序度的提高而提高,达到某一峰值后,如果继续增加多道程序度,将产生抖动,从而导致CPU的利用率急剧下降。
原因:页面置换算法不合理;分配给进程的物理页面数太少;多道程序的度。

2.抖动的预防
核心问题:
选择合适的页面置换算法。
分配给进程合适的物理页面数。
调整多道程序度:
①采取局部置换策略
②把工作集算法融入到处理机调度中
③利用L=S准则调节缺页率
④选择暂停的进程

6.5 请求分段存储管理方式

6.5.1 请求段表

1.请求段表内容存在位(在/不在内存)
修改位(是否修改过)
访问字段(记录被访问的次数)
外存地址
存取方式(权限位):用于标识本分段的存取属性是只执行、只读,还是允许读/写。
增补位:这是请求分段式管理中特有的字段,用于表示本段在运行过程中,是否进行过动态增长。 

2 缺段中断处理
检查内存中是否有足够的空闲空间
①若有,则装入该段,修改有关数据结构,中断返回
②若没有,检查内存中空闲区的总和是否满足要求,是则应采用紧凑技术,转① ;否则,淘汰一个(些)段,转①
分段是信息的逻辑单位,不会出现一条指令被分割在两个分段中,或者一组信息被分割在两个分段中的情况。一条指令执行期间,可能产生多次缺段中断。操作系统·虚拟存储器_第12张图片
3.地址变换机构和地址变换过程
操作系统·虚拟存储器_第13张图片

6.5.2 分段共享与保护

1.共享段表
操作系统·虚拟存储器_第14张图片
在系统中配置一张共享段表,每个共享段在共享段表中都有一个表项,记录共享段的段号、段长、内存始址、存在位等,以及共享这个分段的每个进程的情况。
①共享进程计数count:整型变量count是为了记录有多少个进程需要共享该分段。
②存取控制字段
③段号:对于同一个共享段,不同的进程可用不同的段号去共享该段。

2.共享段的分配与回收
①共享段的分配
第一个进程:分配内存空间,调入共享段,进程的段表加一该共享段的表项,在共享段表中加一个表项,置count=1。
以后的进程:在调用进程的段表增加一该共享段的表项,填写该共享段的物理地址;在共享段表中增加一个表项,添加该进程的有关内容,置count= count+1 。
②共享段的回收
count-1=0:取消进程段表中有关共享段的表项,回收物理内存,取消共享段表中有关共享段的相应表项。
count-1≠0:取消进程段表中有关共享段的表项, 取消共享段表中有关该进程的相应内容。

3.分段保护

在分段系统中,各个分段在逻辑上是独立的,因此信息保护也是比较容易实现的。一般采用以下方法来进行分段保护:
①越界检查
段表:段长
段表寄存器:段表长度
②存取控制检查
在段表的每个表项中,都设置了一个“存取控制”字段来规定对该段的访问方式。

通常的访问方式有:
①只读:只允许读访问。
②只执行:只允许执行,不允许读,也不允许写。
③读/写:允许进行读写访问。

环保护:
处理器状态分为多个环(ring),分别具有不同的存储访问特权级别,通常是级别高的在内环(如OS核心),编号最小(0环),级别最高;
规则:程序可访问同环或更低级别环(外环)的数据;可调用同环或更高级别环(内环)的服务。操作系统·虚拟存储器_第15张图片

你可能感兴趣的:(操作系统,操作系统)