[操作系统系列]虚拟存储管理

虚拟存储管理

虚拟存储以局部性原理为基础提出的。

局部性原理:
1)程序执行时,大多数情况下是顺序执行的。虽然分支和过程调用指令导致程序不能顺序执行,但这两类指令只在所有 程序指令中占小部分
2)过程调用会使程序的执行轨迹从一部分内存区域转至另一部分区域,但过程调用的深度不会超过5。
3)程序中有许多循环语句,这些语句会重复多次执行。
4)程序中对数组,数据结构的操作,往往局限在很小的范围内。
[局部性表现在两个方面]:
时间局限性:程序中的的某条指令一旦执行,不久后会再次执行。
空间局限性:程序一旦访问某存储单元,不久后会访问其附近的存储单元。也就是说一段时间内程序的访问会局限在一个较小的范围内

虚拟存储器:
所谓虚拟存储器,是指具有请求调入功能和置换功能, 能从逻辑上对内存容量加以扩充的一种存储器系统。其逻辑容量 是内存容量和外存容量之和,运行速度接近于内存速度,而成本却又接近于外存。
虚拟存储将程序的逻辑地址空间与内存的物理地址空间分开处理,各自形成编址范围;利用大容量的外存储器存放程序和数据,而实际内存作为程序执行时的工作区。当要执行作业时,先将要执行到的部分程序和数据调入内存,暂时不执行的 部分就留在外存,等内存中的部分程序执行结束后,再将等待执行的部分程序调入内存工作区中。(请求页式存储管理)
【虚拟存储器的特征】:
离散性:作业不装入连续的存储空间,内存分配采用离散分配方式。
多次性:一个作业被分割,分多次调入内存。
对换性:作业在运行过程中可以根据需要换进、换出内存。
虚拟性:只是从逻辑上扩充了内存的容量,物理内存不变。

请求页式存储管理:
与静态分页管理不同请求页按需分配。将需要运行的页面存放于内存,暂时不需要运行的页面存放于辅存,当需要运行存放于辅存上的页面时,再将对应的页面调入内存。
请求页在页表中增加四个字段,支持页面置换的实现。
在这里插入图片描述
状态位P:标志该页是否已调入内存;
访问字段A:用于记录该页最近是否被访问过或被访问的次数;
修改位M:标志 该页在调入内存后是否被修改;
外存地址:该页面存储在外存上的地址

【缺页中断机构】:
当所要访问的页面不在内存时,产生缺页中断,请求OS将所缺的页面调入内存缺页时操作系统保护CPU执行现场;执行缺页中断处理程序;回复CPU执行现场。缺页中断是一种特殊的中断!其在指令执行期间产生中断一条指令执行期间可能产生多次缺页中断。

【地址变换机构】:
请求页式的地址变换机构是在页式管理的基础上为了实现虚拟存储系统而形成的,增加了缺页中断,内外存页置换。
1)地址变换时首先检查页号是否大于页表寄存器中的页表长度,若是则产生越界中断。否则转(2)
2)根据页号同时查找快表和页表,若在快表找到,则修改页表项的访问字段,写操作还要将修改为置为1,若在快表中找不到则在内存的页表中继续查找。(转3)
3)在页表(快表)中找到后首先检查页表中的状态位,了解该页是否在内存,如果在内存则(转5)(若在内存的页表中找到该项还需将页表项写入快表,若快表已满则使用某种算法换出一项)若该页没有在内存(转4)
4)若该页没有在内存,则产生一个缺页中断,由中断处理程序负责将需要的页从外存调入内存。若此时内存已满则用某种算法置换一页。(转5)
5)利用页表(快表)中给出的存储块号和页内位移形成物理地址。
在这里插入图片描述
请求页式管理的驻留集管理:
请求页式管理中进程在运行是没必要将其所有的页调入内存,因此操作系统必须决定将那多少页些页调入内存。
【置换和分配策略】:
[局部置换]进程缺页时,只能从该进程在内存的几个页面中选出一页换出,然后再调入一页,进程在内存中的页数不变。
[全局置换]从所有进程的页面中权衡选择一页换出。
[固定分配]为每个进程分配固定页数的内存空间、且运行过程中不变
[可变分配]先为每个进程分配一定数目的物理块。当某进程缺页时,系统会选择合适的空闲块分配给进程。通常采取的方法是把内存中可供分配的所有物理块分成两部分:一部分按比例地分配给各进程;一部分则根据各进程的优 先权,适当地增加其相应份额后,分配给各进程。
分配和置换策略由操作系统组合

【页面置换算法】:
1)最佳置换算法(OPT):
是一种不可能的理论上的算法他要求置换那些不再使用或者最久不使用的页,由于无法预知这些页因而无法实现,但可以作为其他算法的标准衡量其他算法
2)先进先出置换算法(FIFO):
是最简单的页面置换算法。这种算法的基本思想是:当需要淘汰一个页面时,总是选择驻留主存时间最长的页面进行淘汰,即先进入主存的页面先淘汰。其理由是:最早调入主存的页面不再被使用的可能性最大。
3)最近最久未使用(LRU)算法:
利用局部性原理,根据一个作业在执行过程中过去的页面访问历史来推测未来的行为。它认为过去一段时间里不曾被访问过的页面,在最近的将来可能也不会再被访问。所以,这种算法的实质是:当需要淘汰一个页面时,总是选择在最近 一段时间内最久不用的页面予以淘汰。
LRU性能较好,但需要寄存器和栈的硬件支持。LRU是堆栈类的算法,堆栈类算法不可能出现Belady异常
[Belady现象]:如果对—个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多但缺页率反而提高的异常。
4)时钟(CLOCK)置换算法
LRU算法的性能接近于OPT,但是实现起来比较困难,且开销大;FIFO算法实现简单,但性能差。所以操作系统的设计 者尝试了很多算法,试图用比较小的开销接近LRU的性能,这类算法都是CLOCK算法的变体。
简单的CLOCK算法是给每一帧关联一个附加位,称为使用位。当某一页首次装入主存时,该帧的使用位设置为1;当该 页随后再被访问到时,它的使用位也被置为1。对于页替换算法,用于替换的候选帧集合看做一个循环缓冲区,并且有一个指针与之相关联。当某一页被替换时,该指针被设置成指向缓冲区中的下一帧。当需要替换一页时,操作系统扫描缓冲区,以查找使用位被置为0的一帧。每当遇到一个使用位为1的帧时,操作系统就将该位重新置为0;如果在这个过程开始时,缓冲区中所有帧的使用位均为0,则选择遇到的第一个帧替换;如果所有帧的使用位均为1,则指针在缓冲区中 完整地循环一周,把所有使用位都置为0,并且停留在最初的位置上,替换该帧中的页。由于该算法循环地检查各页面的情况,故称为CLOCK算法,又称为最近未用(Not Recently Used, NRU)算法。
CLOCK算法的性能比较接近LRU,而通过增加使用的位数目,可以使得CLOCK算法更加高效。在使用位的基础上再增加一个修改位,则得到改进型的CLOCK置换算法。这样,每一帧都处于以下四种情况之一:
最近未被访问,也未被修改(u=0, m=0)。则该页是最佳的淘汰页
最近被访问,但未被修改(u=1, m=0)。
最近未被访问,但被修改(u=0, m=1)。
最近被访问,被修改(u=1, m=1)。
算法执行如下操作步骤:
从指针的当前位置开始,扫描帧缓冲区。在这次扫描过程中,对使用位不做任何修改。选择遇到的第一个帧(u=0, m=0) 用于替换。
如果第1)步失败,则重新扫描,查找(u=0, m=1)的帧。选择遇到的第一个这样的帧用于替换。在这个扫描过程中,对每个跳过的帧,把它的使用位设置成0。
如果第2)步失败,指针将回到它的最初位置,并且集合中所有帧的使用位均为0。重复第1步,并且如果有必要,重复第2步。这样将可以找到供替换的帧
增加修改位的原因是同等条件下优先选择没有被修改过的页,因为置换修改过的也时需要将该页写回磁盘。
[抖动现象]:进程大部分时间都用于页面置换,而不能完成任何有效工作,这时系统处于抖动状态。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值