4、操作系统内存管理——页面的换入换出

注:参考哈工大李治军老师公开课。

对于用户而言,用户看到的是一个整体的内存入4G,而且用户可以随便访问4G内存空间的任意位置;但是对于真实的物理内存可能只有1G大小,当用户访问内存时,如果内存里面有需要的内容,就直接访问;如果没有,就去磁盘上查找,然后再把需要找到的数据,再将这些数据载入到内存中供用户使用。那么在这个过程中就需要把磁盘上的数据写到内存里面(换入),也需要把内存中的一些数据写回磁盘上(换出)。

图一:虚拟内存与物理内存

请求调页(换入)

当用户访问一个页时,MMU回去查询一个操作系统维护的页表,看看用户访问的页是否存在于内存当中,如果存在,就直接调用;如果没有,就需要开启中断,执行页错误处理程序,在磁盘中找到相应的数据页,并在内存中找到一块空闲,将其载入进来,然后中断返回,执行用户程序,在去访问内存中用户需要的页。

图二:页面调入过程

 

页面置换(换出)

当我们不断地将页面换入内存当中,内存肯定会不足的,我们需要选择一些页面进行换出,为新的数据腾出空间,但是我们应该选择那些页面换出呢?以下主要讨论一些常用的换出策略。

 

备注:下面的例子默认内存只能存放三个页。

FIFO:先进先出页面置换,可能出现频繁的替换,例如例子图三中的A刚被换出,马上就被换入。

图三:FIFO算法示例


MIN算法:淘汰最远将使用的页,这是最优方案,但是这种方式需要知道程序未来的走向,这是很难实现的,例如if(…){…}只有在运行的过程中,才能知道程序的走向。

图四:MIN算法示例


LRU算法:用过去的历史预测将来。下面是几种LRU算法的实现方法:

 

LRU时间戳算法:就是用一张表(两列:一列是页编号,一列是对应页最近使用的时间),每次调用页都更新这张表。每次换出就换出那个时间最小对应的页。

图五:LRU时间戳算法

这个算法看似简单,但是麻烦的是操作系统需要一直维护这张表

 

LRU页码栈算法:这是对LRU时间戳算法的一种变种,就是维护一个栈,当一个页面使用了,查询栈中的页码,如果栈中没有它的页码,就直接把它的页码放在栈底;如果有,就把栈中的那一项调整到栈顶,每次替换都替换栈底页码对应的页。这个算法一样有个问题,就是每次访问需要维护这张,需要消耗一定的代价。

图六:LRU页码栈算法

 

LRU—SCR算法:每页自动增加一个引用位,每次访问该页,就由硬件将该页的引用位设置位1,每次需要替换就由一根指针扫描每一页的引用位,如果引用位为1,就修改为0;如果为0,就将该页替换出去,并指向下一页。


图七:SCR算法

对于SCR算法,有一个问题,就是程序是具有局部性的,所以经常出现在替换间期内每一页都被访问过,当需要替换时,每一页的引用位都是1,这样每次被替换出去的就是指针所指的那一页,从而退化成了FIFO算法。

 

LRU—Clock算法: SCR算法中的问题原因就是替换期间比较长,在这个期间内每页都被访问了,那么解决方式就是引入一根更新指针,每隔一段时间,把所有页的引用位设置为0,通过这样的防止SCR算法的退化。打个比方:替换指针就是时钟上的分针,而更新指针就相当于时钟上的秒针。(系统常用)

图八:Clock算法

 

 

到此,页的换出算法就讨论完了。那么操作系统内存管理的整体轮廓也就出来了:

图九:操作系统内存管理的整体轮廓

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值