解释一下页面置换算法,例如LRU(最近最少使用)、FIFO(先进先出)
常见页面置换算法有最佳置换算法(OPT)、先进先出(FIFO)、最近最久未使用算法(LRU)、时钟算法(Clock)。
最佳置换算法: 该算法根据未来的页面访问情况,选择最长时间内不会被访问到的页面进行置换。那么就有一个问题了,未来要访问什么页面,操作系统怎么知道的呢?操作系统当然不会知道,所以这种算法只是一种理想情况下的置换算法,通常是无法实现的。
先进先出算法:也就是最先进入内存的页面最先被置换出去。这个算法比较简单明了,就不过多解释了。但是先进先出算法会存在一个问题,就是Belady问题,即随着分配给进程的空闲页面数增加,缺页的情次反而也会增加。
这和我们常识是相悖的,因为我们通常认为如果一个进程经常发生缺页,那么就应该应该为他多分配一点内存。然而使用FIFO算法时,反而可能导致更多缺页情况出现。这就是Belady问题,Belady问题只会在使用FIFO算法时出现。
最近最久未使用算法:LRU算法基于页面的使用历史,通过选择最长时间未被使用的页面进行置换。LRU算法的核心思想是,最近被访问的页面可能在未来被再次访问,而最长时间未被访问的页面可能是最不常用的,因此将其置换出去可以腾出空间给新的页面
LRU算法通常是使用一个数据结构去维护页面的使用历史,维护使用历史就是通过访问字段实现的。访问字段的位数和操作系统分配给该进程的页面数有关,比如分配4个页面,访问字段就是2位,16个页面,访问字段就是4位,依次类推。如此,每一个页面的访问字段都可以不同,通过访问字段的不同,我们就可以判断页面的使用历史。
时钟算法:Clock算法基于一个环形链表或者循环队列数据结构来管理页面的访问情况,用于选择被置换的页面。Clock算法的核心思想是通过使用一个指针(称为时钟指针)在环形链表上遍历,检查页面是否被访问过。这个访问过同样需要我们上面说到的访问字段来表示,此时访问字段只有一位。每个页面都与一个访问位相关联,标记该页面是否被访问过。
当需要进行页面置换时,Clock算法从时钟指针的位置开始遍历环形链表。
如果当前页面的访问位为0,表示该页面最久未被访问,可以选择进行置换。将访问位设置为1,继续遍历下一个页面。
如果当前页面的访问位为1,表示该页面最近被访问过,它仍然处于活跃状态。将访问位设置为0,并继续遍历下一个页面如果遍历过程中找到一个访问位为0的页面,那么选择该页面进行置换。