[操作系统] 页面置换算法(一)

页面置换算法(一)



当发生缺页中断时,操作系统必须在内存中选择一个页面将其换出内存,以便为即将调入的页面腾出空间。如果要换出的页面在内存驻留期间已经被修改过,就必须把它写回磁盘已更新该页面在磁盘上的副本。如果该页面没有被修改过,则说明,它在磁盘上的副本已经是最新的,不需要回写。

1. 最优页面置换算法

在缺页中断发生时。在内存中的页面有的可能需要10条指令后才被访问,有的可能100条,或者1000条指令后才被访问。最优置换算法总是将需要指令最多的被置换。但这个算法是无法实现的,因为无法知道页面下一次将在什么时候被访问。但是可以先在仿真程序上运行,跟踪页面访问情况,在第二次运行时利用第一次运行收集到的信息来实现。

2. 最近未使用页面置换算法

系统为每个页面设置了两个状态位(当页面被访问时的R位,以及被修改时的W位)。可以用硬件实现,如果硬件没有支持这些位。则进行以下模拟,启动一个进程,并将其所有页面标记为不在内存,一旦访问任何一个页面就会引发一次缺页中断,此时操作系统设置R(访问位)位,修改页表项并使其指向正确页面,并改为只读模式,然后重新启动中断指令;如果随后对该页的修改又引发一次缺页中断,则操作系统设置这个页面的M位并将其改为读/写模式。当启动一个进程时,所有页面的两位都由操作系统设置成0,R被定期地清零,以区别最近没有被访问的页面和被访问的页面。

当发生缺页中断时,把所有页面分为4类:

第0类:没有被访问,没有被修改
第1类:没有被访问,已被修改
第2类:已被访问,没有被修改
第3类:已被访问,已被修改

第一类可以产生是因为第三类页面R位被时钟清零。不清除M位的原因是写回磁盘时需要用到这个信息。该算法从类编号最小的非空类中挑选一个页面淘汰。

3. 先进先出置换算法

操作系统维护一个当前在内存中页面的链表队列,存在时间最长的页面将被替换,而新换进内存的页面将被添加到队尾。这种方法有可能淘汰常用的页面。

4. 第二次机会页面置换算法

对先进先出进行修改,检查最老页面的R(访问位)位。如果R位是0那么这个页面没有被使用,可以被置换,如果是1,则将R位清0,并把该页面放到链表的尾端,修改他的装入时间。这个方法虽然可以避免常用页面被换出,但需要经常在链表中移动页面,降低了效率。

5. 时钟页面置换算法

将所有页面保存在一个类似时钟面环形链表中,一个表针指向最老的页面。当发生中断时,同第二次机会置换一样,如果R位为0,则插入新页面,并把表针移动一个位置。如果R位为1,就清除R位同时移动表针。

时钟页面置换算法

6. 最近最少使用页面置换算法

基于观察,在前面几条指令中频繁使用的页面在后面的几条指令中被使用的几率很大。而很久没有使用的页面在未来较长的一段时间内仍然不会被使用。所以可以置换最长未使用的页面。该方法被称为(LRU-Latest Recently Used)。

这个算法代价很高,需要在内存中维护一个所有页面的链表,最近最多使用的页面在表头。每次访问内存都需要更新链表,在链表中找到一个页面,删除它,然后移动到表头,非常浪费时间。

但是,还是有一些硬件实现的LRU算法

1. 64位计数器

要求硬件有一个64位计数器C,每条指令执行完后自动加1,每个页表项必须有一个足够容纳这个计数器值的域。在每次访问内存后,将当前的C值保存到被访问页面的页表项中。一旦发生缺页中断,操作系统就检查所有页表项中计数器的值,找到值最小的一个页面。就是最近最少使用的页面。

2. n x n 矩阵

在一个有n个页框的机器中,LRU硬件可以维持一个初值n*n位的矩阵。当访问到页框k时,硬件首先把k行的位都设置成1,再把k列的位置都设置成0。在任何时候二进制数值最小的行就是最近最少使用的。

LRU算法

除了以上提到的硬件方法之外,还可以使用软件模拟LRU。

3. 软件模拟LRU

前面两种LRU算法虽然在理论上可以实现,但并不是所有计算机都有这种硬件。要使用软件实现,一种可能的方法称为最不常用算法(NFU-Not Frequently Used)该算法将每个页面与一个软件计数器相关联,计数器初值为0.每次时钟中断时,由操作系统扫描内存中所有的页面,将每个页面的R位(访问位,它的值是0或1)加到它的计数器上。这个计数器大体上跟踪了各个页面被访问的频繁程度。发生缺页中断时,则置换计数器值最小的页面。但是NFU不会忘记任何事情,比如一个页面可能开始被频繁使用,计数器值很高。但是过一段时间后,它不在经常被访问了,但是被经常访问的其他页面计数器总是比他小,结果是将有用的页面置换走了。

所以,我们需要对此进行改进,修改以后的算法称为老化算法。首先,在R位被加进之前先将计数器右移一位;其次,将R位加到计数器最左端而不是最右端。

如图所示,假设在第一个时钟滴答后,页面0到页面5的R值分别为1、0、1、0、1、1,即在第一次时钟滴答前,程序访问了以免0,2,4,5,它们的R位被设置为1。第一次时钟滴答到二次时钟滴答之间,程序访问了页面0,1,4,于是得到图中的b。

老化算法

发生缺页中断时,将置换计数器值最小的页面。与LRU不同的是,图e中的页面3和5,它们连续两个时钟滴答都没有被访问过。根据LRU,下一个置换应该在这两个页面中选择一个。

但是在这个算法中,因为我们只知道它们在两个时钟滴答前被访问了,但是我们并不知道再那个时钟滴答中,哪个页面被较晚的访问,所以我们只能置换页面3,因为页面5在更往前的两个时钟滴答中也被访问过。

第二个区别是,老化算法的计数器只有有限位数,因此限制了其对过往页面的记录。如果两个页面的计数器都是0,只能随机挑选一个进行置换,但实际上,可能其中一个被访问过,只不过时间超出了位数。例如,计数器只能记录8位,但是页面1在9个时钟滴答前被访问过,页面2在1000个时钟滴答前被访问过,可是他们的计数器都是0。

参考书目:现代操作系统第三版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值