当前位置: 首页 > news >正文

哈工大李治军老师操作系统笔记【23】:内存换出(Learning OS Concepts By Coding Them !)

文章目录

  • 0 回顾
  • 1 换出
    • 1.1 `get_free_page()`
    • 1.2 FIFO
    • 1.3 MIN
    • 1.4 LRU
    • 1.5 LRU+时间戳
    • 1.6 LRU+页面栈

0 回顾

  • 有换入就应该有换出
  • 从get_free_page来
  • 换入和换出应该合着一起工作

1 换出

  • get_free_page()是换入的时候得到一个物理空闲页
  • 并不是总有新的空闲页,因为内存是有限的
  • 所以必须要选择一个页换出去,这一部分主要讲的是算法
  • 这个算法实现的功能就是:
  • 把哪一页从内存当中换到磁盘上,从店面中把哪个商品放到仓库中,腾出地方来,放入别的商品,腾出内存来,换入别的页,所以需要选择一页淘汰,换出到磁盘,应该选择哪一页?
  • 这个算法放哪里?放在get_free_page(),那么,这个出现在哪里?出现在页面中断处理程序,do_no_page里面,就是14号中断的处理程序当中
  • 那里做啥事呢?首先申请一个空闲页,然后从磁盘上读入,那么现在申请空闲页的时候,那肯定有个方法,计算一下是不是空闲页不够了,如果不够了,要找一页换出去然后再申请,所以这部分代码就应该放到这里

1.1 get_free_page()

  • 缺页中断处理程序中,在从磁盘读入数据之前,首先要通过调用get_free_page()在物理内存中分配页
    • get_free_page()并不能总是获得新的页,内存是有限的
    • 需要选择一页淘汰,置换算法
      • FIFO
      • MIN
      • LRU,重点(LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰)

在这里插入图片描述


1.2 FIFO

  • FIFO
  • 使用缺页次数来评价置换算法
  • 下例使用FIFO的缺页次数是7(每次缺页都是要去磁盘读写的)

在这里插入图片描述


1.3 MIN

  • 选最远将使用的页淘汰,是最优方案
  • 还是上方的序列,D要换入,但是C距离最远,所以选C换出再D换入
  • 但这种算法基本不可能实现,因为无法预测哪一页最晚使用
  • 这是个理想算法,操作系统做不到,但可以近似想这个最优来靠近
  • 下例使用MIN的缺页次数是5

在这里插入图片描述


1.4 LRU

  • LRU
  • 用过去的历史预测将来
  • 局部性原理(正是有了局部性,才可以换入换出)
  • LRU是公认的很好的页置换算法
  • 我记得有一个算法很容易和LRU搞混,是哪个?
  • 下例使用LRU的缺页次数是5,达到了和MIN一样的效果

用过去的历史预测将来,来达到近似MIN
LRU算法:选最近最长一段时间没有使用的页淘汰(最近最少使用)


在这里插入图片描述


1.5 LRU+时间戳


在这里插入图片描述


  • LRU的准确实现,全局时钟+时间戳方案
  • 维护一个全局时钟,每页维护维护一个时间戳,表示这一页的最近使用时间
  • 则选择最近使用时间最早(最小)的页淘汰,所以把上述的D把C给换掉了
  • 算法实现很简单,但是需要遍历找到最小值,时间复杂度较高,不可行
  • 每执行一条指令的时候,就要把页的时间戳进行修改

1.6 LRU+页面栈

  • LRU的准确实现,页码栈方案
    • 新来的页,如果栈空间还够,就加到栈顶
    • 新来的页,如果栈空间不够,则淘汰栈底元素,新来的加再加入栈顶
    • 已有的页,从栈里原来的位置移到栈顶
    • 从栈顶到栈底,是按照最近使用时间戳从大到小的顺序排列的
    • 代码实现:双向链表+Map,当年实习面试好像问的就是这个,时间复杂度仍然不低,所以实际操作系统不用这种算法

在这里插入图片描述


  • 如图,在栈的顶部总是保留最近使用的
  • 然后要使用的就上浮,短时间使用的就下降
  • 这其实是deque
  • 实现代价也不小
  • 双向列表+hash表 ; 已经存在的不换出,但是要把他放到首位,其它的依次下沉;如果不存在,就将新的放在首位,末尾移出

在这里插入图片描述


相关文章:

  • Ubuntu 20.04 设置开机自启脚本
  • Vue2封装评论组件详细讲解
  • java-php-python-springboot校园新闻趣事计算机毕业设计
  • 使用Docker Compose搭建WordPress博客
  • 【Linux篇】第十一篇——动静态库(动静态库的介绍+动静态库的打包与使用)
  • 多任务学习(MTL)--学习笔记
  • 前端性能优化方法与实战01 体系总览:性能优化体系及关键指标设定
  • 小米面试——C++开发岗位
  • 【训练方法】OHEM
  • java毕业设计汽车出租平台源码+lw文档+mybatis+系统+mysql数据库+调试
  • C#教程 - 其他(Other)
  • Java项目:JSP会议-会议室管理系统
  • 计算空间物体包围球的两种算法实现
  • Unity 导航寻路快速上手
  • Advanced Git
  • Android 架构优化~MVP 架构改造
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Android框架之Volley
  • idea + plantuml 画流程图
  • JAVA SE 6 GC调优笔记
  • Javascripit类型转换比较那点事儿,双等号(==)
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Java深入 - 深入理解Java集合
  • Koa2 之文件上传下载
  • learning koa2.x
  • Linux CTF 逆向入门
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • SpiderData 2019年2月23日 DApp数据排行榜
  • Web Storage相关
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 聊聊flink的BlobWriter
  • 前端学习笔记之观察者模式
  • 小李飞刀:SQL题目刷起来!
  • 字符串匹配基础上
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (第27天)Oracle 数据泵转换分区表
  • (二)正点原子I.MX6ULL u-boot移植
  • (三)终结任务
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (十八)SpringBoot之发送QQ邮件
  • (转)程序员疫苗:代码注入
  • *** 2003
  • **CI中自动类加载的用法总结
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .NET Core引入性能分析引导优化
  • .NET Framework .NET Core与 .NET 的区别
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .NET成年了,然后呢?
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)