操作系统的页面置换算法思路简单记录

上次字节面试问了我个LFU算法的实现,我一下没反应过来,英文全称是啥来着?最近最久未使用?啥叫最近来着?一脸懵,今天复习一下,代码就不写了,理解思想之后代码很好写

前言

  • 进程运行时,若其访问的页面不在内存中而需将其调入,但内存中已无空闲空间时,就需要从内存中调入一页程序或数据,送入磁盘的对换区,选择调入页面的算法就称为页面置换算法
    ----------------------------------------------------------------来自操作系统王道书

OPT(OPTimal replacement)

  • 最佳置换算法选择的被淘汰页面是以后永不使用的页面,或是在最长时间内不再被访问的页面,以便获得最低的缺页率
  • 显然只有在已知用户访问情况的时候我们才能用这种算法,或者离线处理用户访问, 这显然不合理,所以这种算法我们就不聊了,是一种理想算法,无法应用

FIFO(First In First Out)

  • 先进先出置换算法,也就是优先淘汰最早进入内存的页面,这个显然用队列就好了

LRU(Least Recently Used)

  • 最近最久未使用置换算法,选择最近最长时间未访问过的页面予以淘汰,它认为过去一段时间内未访问过的页面,在最近的将来可能也不会被访问,这里的最近指的是空间上的最近,最久指的是时间上离得远
  • 那么怎么实现这种算法呢?考虑简单方法,如果产生了缺页,首先一个一个把页面调入内存,这样的话内存中已经有了一些页面,假设已经占满了内存,设页面 i i i的访问时间为 t i t_i ti,假设现在又来了一个请求,访问了第 i i i个页面,我们更新第 i i i个页面的时间 t i t_i ti, 这个没问题;但是如果请求发生了缺页,那么我们需要淘汰掉一个旧的页面,如果直接暴力做效率很差
  • 我们现在要解决的问题是快速删除和快速更新,由于页面有先后顺序,那么删除任意元素我们很容易能够想到链表,但是普通链表不能够实现 O ( l o g n ) O(logn) O(logn)查询,如果使用静态链表,它需要申请一段连续空间,也不好,所以我们选择比静态链表更好的哈希链表,也就是使用一个 h a s h m a p hashmap hashmap来存储每个节点的地址, K K K值为页面编号, V V V值为节点地址
  • 最后思路如下,使用一个双向链表按照顺序来存页面,同时使用一个哈希表来存每个页面的地址,如果访问了某个页面,首先从哈希表中 O ( l o g ) O(log) O(log)的查询地址,然后把这个节点拿到链表的最前面,表示这个点是最近被访问的;如果发生了缺页,那么我们淘汰掉链表的最后一个节点即可

LFU(Least Frequently Used)

  • 最近最不经常使用置换算法,选择最近的最不常使用的页面进行淘汰,这和 L R U LRU LRU算法比较相似,有了上面的基础,考虑一下这个问题,我们使用一个双向链表来存储页面,当加入一个页面的时候,因为我们要更新它的它的出现频率(次数),怎么办?且我们要删掉出现频率最低的也就是出现次数最少的,如果有多个出现次数相同,我们还要删掉最近的那个页面
  • 实际上我们可以使用一个哈希表来记录每种出现次数,所以结构应该是HashMap<Integer, Vector<List<Node>>> mp,这样哈希表第一个出现的 K K K就是出现次数最少的某些页面,如果出现缺页,我们就可以删除下面链表的最后一个节点;如果命中了,就把这个点删掉,接到下一个出现次数链表的头部,这样就好了

还有其他的页面置换算法感觉不太重要就不写了,有问题请留言交流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Clarence Liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值