虚拟内存系统【页面置换算法】

news2024/11/24 20:54:37

页面置换算法

    • 📖1. 最优页面置换算法(OPT)
    • 📖2. 先入先出置换算法(FIFO)
    • 📖3. 随机(Random)
    • 📖4. 最近最少使用的置换算法(LRU)
    • 📖5. 近似LRU 时钟页面置换算法
    • 📖6. 最不常用算法
    • 📖7. 考虑脏页

在虚拟内存管理程序中,当内存不足时,由于内存压力会迫使操作系统换出一些页,为常用的页腾空间,确定要将哪个页换出就是操作系统要执行的页面置换算法.

📖1. 最优页面置换算法(OPT)

最优页面置换算法的思想为:如果你不得不踢出一些页,为什么不踢出在最远的将来才会访问的页呢? 也就是说,缓存中所有其他页都比这个页重要,因为在访问最远将来会访问的页时,比肯定会先访问其他页.

我们来看一个简单的例子,来理解最优页面置换算法. 假设一个程序按照下面的顺序访问虚拟页:0,1,2,0,1,3,0,3,1,2,1,假设缓存可以存3个页:

下面为页面的访问过程:

image-20221201164825259

我们计算缓存命中率:有6次命中和5次未命中,那么缓存命中率为54.4%,但我们忽略页的第一次未命中,那么命中率为81.8%,但是,未来的访问是无法知道的,所以你无法为操作系统实现最优策略. 因此,在开发一个真正的、可实现的策略时,我们就必须寻找其他方式决定把哪个页面提出.

📖2. 先入先出置换算法(FIFO)

许多早期的系统避免了尝试达到最优的复杂性,采用了非常简单的替换策略. 例如:一些系统使用FIFO(先入先出)页面置换算法,页在进入系统时,简单地放入一个队列,当发生替换时,先入的页被踢出,FIFO有一个很大的优势:实现简单.

我们依然使用三个页0,1,2来观察访问过程:

image-20221201173226298

对比FIFO和最优策略,FIFO明显不如最优策略,FIFO命中率只有57.1%,先进先出(FIFO)无法确定页的重要性:即使页0已被多次访问,FIFO仍然会将其踢出,因为它是第一个进入内存的.

📖3. 随机(Random)

在内存满的时候它随机选择一个页进行替换,随机具有类似与FIFO的属性,实现起来很简单,但是它在挑选替换哪个页时不够智能.

我们依然使用三个页0,1,2来观察访问过程:

image-20221201214142027

随机的表现完全取决于多幸运,随机比FIFO好一点,比最优的差一点.

📖4. 最近最少使用的置换算法(LRU)

任何像FIFO这样简单的策略都可能会有一个共同的问题:它可能会踢出一个重要的页,而这个页马上要被引用,先进先出(FIFO)将先进入的页踢出. 如果这恰好是一个包含重要代码或数据结构的页,它还是会被踢出,尽管它很快会被重新载入,因此,FIFO、Random和类似的策略不太可能达到最优,需要更好的策略.

LRU思想:页替换策略可以使用的一个历史信息是频率,如果一个页被访问了很多次,也许它不应该被替换,因为它显然更有价值. 页更常用的属性是访问的近期性,越近被访问过的页,也许再次被访问的可能性也就越大.

这个算法的思想是基于局部性原则:程序倾向于频繁的访问某些代码和数据结构(例如循环访问某些数据),因此,我们应该尝试用历史数据来确定哪些页面更重要,并在需要时将这些页保存在内存中.

image-20221201215949362

为了更好的理解LRU,使用三个页0,1,2来观察访问过程:

image-20221201220142902

我们可以计算LRU算法下的页命中率:6/8 = 75%,它已经快接近最优置换算法了.

📖5. 近似LRU 时钟页面置换算法

为什么需要近似LRU

为了实现LRU,我们需要做很多工作,在每次页访问(即每次内存访问,不管是取指令还是存储)时,我们都必须更新一些数据,从而将该页移到列表的前面(最近使用),与FIFO相比,FIFO的页列表仅在页被踢出或者新页添加到列表时才被访问,为了记录哪些页是最少和最近被使用,系统必须对每次内存引用做一些记录工作,有可能会影响性能.

所以我们可以不需要找到绝对最旧的页来替换,找到差不多旧的页就可以.

系统中的所有页都放在一个循环列表(环形链表)中,时钟指针开始指向某个特定的页,当必须进行页替换时,操作系统检查当前指向的页P的使用位是1还是0,如果是1,则意味着页面P最近被使用过,因此不适合被替换. 然后,P的使用位设置为0,时钟指针指下一页,该算法一直持续到找到一个使用位为0的页,使用位为0意味着这个页最近没有被使用过,最坏的情况下,如果所有的页都已经被使用了,那么就将所有页的使用位都设置为0.

📖6. 最不常用算法

记录每个页面的访问次数,当发生缺页中断时,将访问次数最少的页面置换出去,此方法需要对每个页面访问次数进行统计,额外开销.

📖7. 考虑脏页

时钟页面置换算法会对内存中的页是否被修改做出考虑:

如果页已被修改并因此变成脏页,则踢出它时就必须将它写回磁盘,这个操作代价较大,如果它没有被修改,踢出就没有成本,物理帧可以简单的重用于其他目的而不需要额外的I/O操作,因此,一些系统更倾向于踢出干净页,而不是脏页.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/53334.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CleanMyMac X2022苹果电脑专业清理Mac加速器软件

CleanMyMac X2023最新免费版苹果电脑专业清理软件,对于Mac电脑用户来说,Cleanmymac X是一款再熟悉不过的电脑清理软件,它是由苹果认证并对外承认的一款第三方清理软件,几乎有95%的Mac用户都会安装并使用,Cleanmymac X究…

代码随想录——栈与队列

232.用栈实现队列 力扣题目链接 使用栈实现队列的下列操作: push(x) – 将一个元素放入队列的尾部。 pop() – 从队列首部移除元素。 peek() – 返回队列首部的元素。 empty() – 返回队列是否为空。 示例: MyQueue queue new MyQueue(); queue.push(1); queu…

如何使用qemu调试内核

文件系统 调试内核需要一个基本的文件系统,我们可以使用简单的 ramdisk来作为这个文件系统,如果,需要测试一些其它应用程序,我们还需要创建一个大一点根文件系统。 Ramdisk 也就是内核启动时的initrd.img,可以使用b…

iOS创建苹果证书、制作p12证书流程

一、创建Certificates 1、在苹果开发者后台点击右上角【Account】进入以下界面,然后点击【Certificates, Identifiers & Profiles】 2、进入以下界面后点击【Create a certificate】 3、然后选择证书类型,Apple Development(开发者证书…

Oracle中ALTER TABLE的五种用法(四、五)

首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__bizMzI1NTQyNzg3MQ&mid2247485212&idx1&sn450e9e94fa709b5eeff0de371c62072b&chksmea37536cdd40da7a94e165ce4b4c6e70fb1360d51bed4b3566eee438b587fa231315d0a5a…

MySQL数据库复习——事务

目录 一、什么是事务?为什么需要事务 二、事务的四大特性(ACID) 三、事务的使用 四、并发带来的问题 1、脏读问题 2、不可重复读 3、幻读 五、MySQL的隔离级别 一、什么是事务?为什么需要事务 事务的概念: 事务…

深度解析Linux内核—中断

中断 中断是外围设备通知处理器的一种机制。 1. 中断控制器 外围设备不是把中断请求直接发送给处理器,而是发给中断控制器,由中断控制器转发给处理器。 不同种类的中断控制器的访问方法存在差异,为了屏蔽差异,内核定义了中断控…

model.eval 至关重要!!!!model.eval()是否开启 BN 和 Dropout 的不同

之前写过一个项目,eval的时候很正常,但是一infer就有问题,多次排查发现,原来就是只缺一个 model.eval()哇,重大教训,我debug好久,在小姑娘面前翻车… 🤣🤣🤣…

样本与抽样分布(2)-基本分布

本节介绍在数理统计中常用的几个基本分布。为此,先引进分位数定义。 定义1. 2. 1 设X为随机变量,则称满足 的为X的上侧分位数,简称为(上侧)分位数. 1 标准正态分布 标准正态分布N (0,1)是构造其他分布的基础,其密度函数为 它的图形关于y轴…

【毕业设计】深度学习卫星遥感图像检测与识别系统(目标检测)

文章目录0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后0 前言 🔥 Hi,大家好,这里是丹成学长的毕设系列文章! 🔥 对毕设有任何疑问都可以问学长哦! 这两年开始,各个学校对毕设的要求越来…

LeetCode-44-通配符匹配

1、递归 具体思路同LeetCode-剑指19-正则表达式匹配,但在本题中由于字符串长度过长会导致超时。 在这里插入代码片class Solution { public:bool isMatch(string s, string p) {if (p.empty()) return s.empty();bool first_match !s.empty() && (s[0] …

Gradle修改镜像库 ,初始启动配置 init.gradle

目录 ■前言 ■代码放置位置 ■具体代码 代码建议: ■Gradle 的 更多知识(私密) ■前言 默认镜像库太慢了,在【初始启动配置(init.d)】中,添加xxx.gradle (init.gradle) 文件,指…

网络自动化运维(NetDevOps)创作者推荐

前言: 随着NetDevOps技术登上了历史舞台,越来越多的从业者开始利用NetDevOps简化网络的运维,并进行了技术分享,将蛋糕越做越大。在这里,仅代表个人对这些无私奉献的网络、运维工程师们表达由衷的敬意。 此外&#xff…

用户身份验证的令牌—Token教程

一、什么是Token? 1、Token的引入:Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应…

学习二十大奋进新征程线上知识答题小程序登录技术点分析与实现

学习二十大奋进新征程线上知识答题小程序登录技术点分析与实现 在最新搭建的知识答题小程序,遇到了微信授权登录上的技术难点,所以对于以往的那套登录框架不能使用了,需要搭建一套新的注册登录流程框架。 不得不做出调整,为此&a…

json交叉编译并移植到嵌入式开发板

1、解压:tar -xvf json-c-0.9.tar.gz 默认解压在当前目录 2、进入解压后的目录:$ cd cd json-c-0.9/ 3、执行: sudo ./configure CCaarch64-linux-gnu-gcc --hostarm-linux --prefix/opt/json-c-0.9/ 说明:CC赋值为嵌入式开发环…

Java之线程详解(二)——线程安全概述、synchronized锁

一、线程安全概述 什么是线程安全问题? 当多个线程共享同一个全局变量,做写的操作时(即修改该全局变量),可能会受到其他的线程干扰,发生线程安全问题。 eg: public class Thread01 implemen…

丝裂原活化蛋白激酶TaMPK3抑制植物对ABA的反应

文章信息 题目:Mitogen-activated protein kinase TaMPK3 suppresses ABA response by destabilising TaPYL4 receptor in wheat 刊名:New Phytologist 作者:Ying Liu,You-Zhi Ma, Zhao-Shi Xu et al. 单位:Instit…

【Linux】如何在Linux下提交代码到gittee

文章目录使用 git 命令行创建项目三板斧第一招: git add三板斧第二招: git commit三板斧第三招: git push其他几个重要的命令git pull(将远端同步到本地)git rm(删除)git log(查看提交日志)使用 git 命令行…

GPT语言模型

GPT:GPT采用了大量的无监督的数据进行预训练(Pre-training),并在有监督的数据上进行微调(Fine-tuning)来做具体的NLP的任务。结构:GPT使用了12层12头,单向transformer的decoder部分&…