操作系统——虚拟内存的换入\换出(2)

        物理内存相较于虚拟内存而言是很小的,我们不可能只进行页面换入,当物理空闲页框不足时,我们需要将已建立的映射关系破坏,将该虚拟内存也换出,获得空闲内存框。后面的内容就着重介绍换出是如何实现的。


1.基本的页面换出算法

        页面换出算法所要解决的就是决定该淘汰的是哪一页,淘汰哪一页最为合适。算法的评判标准就是换页次数的多少,因为换出是请求换页的一部分,尽量少的换页次数可以减少CPU的访存时间,提高CPU的利用效率。

        以一个虚拟内存访问序列ABCABDADBCB为例,先看FIFO页面置换算法的工作过程和效果。

         CPU为该进程一共分配了3个物理页框,最初填入ABC就有3次换页,FIFO执行的是先入先出策略,每当新的换页请求需要换出页面时,就要将最先进入的页面换出。从上图可知一共进行了7次换页。

        观察换页过程可以发现,当D换入的时候换出的是A,但A紧接着又被访问,所以又需要换入A,这是导致换页次数多的原因。那么此时我们应当选择换出的是C,因为换入A后,后面的访问序列中C是距离目前的访问最远的,这种根据未来页面使用情况淘汰最远页面的算法,就叫最优置换(Optimal Replacement)算法。

         根据最优置换算法,换页次数从7次降低到了5次,验证了其有效性。但在实际的操作系统中,我们是无法实时知晓后续的页面访问情况,所以这种算法是无法实现的。

        既然无法得知未来的页面访问情况,那我们1可以根据过去的访问情况来设计算法,程序访问地址时是具有局部性的,往往接下来马上要访问的页面,在不久前也被访问过。在进行换出时,选择最近最少被使用的页面,这就是LRU(least recently used)算法。比如在上面要换入D页面时,对比历史访问情况,最近使用的页面时B和A,那么应当换出的页面是C。

         使用LRU算法后,换页次数变成了5。

2.LRU算法的准确实现

        LRU算法的效率是很高的,但是任何一种算法都必须在实际的操作系统中实现,来观察它的实际效果。最容易想到的就是建立一个时间戳,记录每一个页面的访问时间,当需要换出时,选择访问时间最小的,即代表最近最少使用的页面。

         还是以D页面换入时为例,此时A最近被使用的时间是4,B是5,C是3,那么就将数字最小的C换出,将D换入,并记录D的访问时间6。但时间戳的记录和维护代价很大,每一个页面都需要一个时间戳,那么时间戳也需要记录在页表中,这就增加了页表的大小,而且随着计算机的运行,时间戳的数字越来越大,甚至会出现溢出的情况;而且由于页面数量可能很多,每次换出时比较时间戳的大小,这个过程也是很复杂的。

        可以用另一种形式实现LRU算法。用页面栈的形式,将最先进入的页面放在栈底,将后进入的依次由栈底排向栈顶。每当页面栈满需要换出时,就将栈底的页面换出,将新的页面放在栈顶。

         但每次维护页面栈时,都会进行几次额外的指针读写,每次地址访问都会有几次内存访问,读写效率会降低很多。

3.clock算法

        LRU算法的实现代价过大,我们可以用一个记录访问情况的访问位R来代替时间戳的概念,当R=1时代表页面最近被访问过,而当R=0时表示最近未被访问。

         clock算法的核心就是将进程的所有页框组成环形线性表,当有换出需求时,线性表指针就会从当前所指位置开始进行环形扫描,如果页框的R为1就将它置0,继续扫描,如果页框的R为0就将它换出。这就相当于给了页框两次不被换出的机会,因此这种算法常被称为第二次机会置换算法(second chance replacement)

        SCR算法是对LRU算法的近似实现,它是通过对R位的判断将最近没有被使用过的页面换出,而不是将最近最少被使用的页面换出。“最近”这个概念指的就是从上一次缺页扫描结束后开始,到这一次缺页发生进行扫描时的这一段时间。而实际上,缺页的情况发生的比较少,那么就会导致两次缺页之间的时间间隔很长,指针扫描的间隔时间也很长。如果这个时间长到每一个页面都被访问了一次,所有页面的R都被置为了1,那么指针扫描一遍后又会回到原点,将最先扫描的页面换出,实现的是FIFO算法的效果。

        为了解决这个问题,需要增加一个扫描指针,扫描指针会定期进行扫描,将所有页框的R置0,这样“最近”就从两次缺页的时间间隔变成了扫描指针的扫描周期。当缺页发生时,换出指针会选择出一个扫描周期以内未被访问的页框,将页框内容换出。

 4.页框个数分配和全局置换

        当分配给进程的物理页框被使用完,系统才会调用clock算法进行页的换出,那么该如何分配每个进程的物理页框数量了?

        对于进程来说,自然是分配给自己的物理页框越多越好。但物理内存的大小是有限的,如果给每个进程分配的页框过多,那么就会导致可以同时并发的进程数量过少,CPU的效率降低。从下图的CPU利用率与进程数量关系的曲线图我们可以发现,随着进程数量的增加,CPU利用率不断增加,但达到巅峰后又迅速下降,这种情况被称之为系统颠簸 。

         系统颠簸出现的原因是并发的进程数量过多,每个进程获得的物理内存太小,不足以覆盖程序执行的局部,这导致因为缺页而被换出去的页面马上有需要被访问而换入,处于不断地循环中,系统颠簸就发生了。

        解决系统颠簸的关键就是确定程序执行的局部大小,使分配给每个进程的页框数量要大于局部即可。如果出现系统的空闲内存不足,那么将一些进程挂起,确保每个进程获得足够大小的物理页框数量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值