操作系统--------页面置换算法

我在很多地方遇到了这个问题,所以想写来看看,避免在以后换回再次的遇到这个问题,就在今天进行深入的了解下这个问题,我先它会对我以后的生活工作会有很大的帮助的。

概念

在地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断。当发生缺页中断时操作系统必须在内存中选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的算法我们就叫页面置换算法。

为什么要进行页面置换

在请求分页存储管理系统中,由于使用了虚拟存储管理技术,使得所有的进程页面不是一次性的全部调入内存,而是部分页面装入。
这就有可能出现以下的情况:要访问的页面不在内存,这时系统产生缺页中断,操作系统在处理缺页中断的时候,要把所需页面从外存调入到内存中。如果这时内存中有空闲块,就可以直接调入该页面,如果这时内存中没有空闲块,那么我们就先淘汰一个已经在内存中的页面,腾出空间,再把所需的页面装入,即进行页面置换。
有助于我们理解的关键词有:请求分页,虚拟存储,缺页中断,页面置换。

常见的页面置换算法

先进先出(FIFO)、最佳置换法(OPT)和最近最少使用使用置换法(LRU)等。

1)先进先出算法(FIFO):是一个实现起来比较简单的页面置换算法,其基本原则就是“选择最早进入主存的页面淘汰”,其理由是最早进入的页面,其不再使用的可能性要比最近调入的页面大。
这种算法只是在按线性顺序访问地址空间时才是最理想的。否则效率不高。因为 那些常被访问的页面,往往在主存中也停留的最久,结果它们因变“老”而不得不被置换出去。
FIFO的另一个缺点就是:它有一种异常的现象,即在增加存储块的情况下,反而使缺页中断率增加了。当然导致这种异常现象的页面走向实际上是很少见的。
2)最近最少使用的算法(LRU):就是将最近最少使用页面置换出去。(若命中,则在模拟的时候可以将其写到最后,每次都将最前面的替换)。
LRU 算法常常被采用的一种算法,并被认为是相当好的。但是存在如何实现它的问题.它需要实际硬件的支持,其问题是怎样确定最后使用的时间顺序,对此主要有两种可行的方法:

1、计数器。最简单的情况是使每个页表项对应一个使用时间字段,并给CPU增加一个逻辑时钟或计数器。每次存储访问,该时钟都加1。每当访问一个页面时,时钟寄存器的内容就被复制到相应页表项的使用时间字段中。这样我们就可以始终保留着每个页面最后访问的“时间”。在置换页面时,选择该时间值最小的页面。这样做,不仅要查页表,而且当页表改变时(因CPU调度)要维护这个页表中的时间,还要考虑到时钟值溢出的问题。

2.栈。用一个栈保留页号。每当访问一个页面时,就把它从栈中取出放在栈顶上。这样一来,栈顶总是放有目前使用最多的页,而栈底放着目前最少使用的页。由于要从栈的中间移走一项,所以要用具有头尾指针的双向链连起来。在最坏的情况下,移走一页并把它放在栈顶上需要改动6个指针。每次修改都要有开销,但需要置换哪个页面却可直接得到,用不着查找,因为尾指针指向栈底,其中有被置换页。

因实现LRU算法必须有大量硬件支持,还需要一定的软件开销。所以实际实现的都是一种简单有效的LRU近似算法。

3)OPT(最佳置换算法,理想置换算法):
这是一种理想情况下的页面置换算法,但实际上是不可能实现的。该算法的基本思想是:发生缺页时,选择内存中最后要被访问的页面置换出去。这个算法唯一的一个问题就是它无法实现。当缺页发生时,操作系统无法知道各个页面下一次是在什么时候被访问。虽然这个算法不可能实现,但是最佳页面置换算法可以用于对可实现算法的性能进行衡量比较,是一种很好评价算法。

其余的算法我们一般不是经常的见到,所以就在这里不进行写入了。

猜你喜欢

转载自blog.csdn.net/daboluo521/article/details/80399995
今日推荐