OS之页面置换算法

article/2025/10/8 8:38:01

之前几篇博客记录了OS内存管理的一些知识和技术,接下来将继续深入,介绍一些页面置换算法,这里包括一些我们大家都略有耳闻的算法。

置换算法

当出现缺页故障时,需要从外存调入新的页面到内存中去,而如果此时内存已满,于是就要按照一定策略置换一些物理页帧出来,这就是置换算法的目的。而置换算法的目标就是尽量减少页面的调入调出次数

页面置换算法主要可分为两大类:

  1. 局部页面置换算法

置换页面的选择范围仅限于当前进程占用的物理页面内。比较有代表性的算法有最优置换算法FIFO算法最近最久未使用算法时钟算法最不常用算法

  1. 全局页面置换算法

全局页面置换算法的选择范围是所有可换出的物理页,比较有代表性的算法有工作集算法缺页率算法

1. 局部页面置换算法

所谓局部页面置换,就是说,如果OS给一个程序固定分配了5个物理页帧,当这些页帧满了后,如何进行页面置换。


最优置换算法(opt算法)

思路就是,当产生缺页时,计算每个逻辑页面的下一次访问时间,选择未来最长时间不访问的页面进行置换。

比如现在内存里面有a、b、c三个物理页帧,现在来了一个d页面,又知道a在未来的第3个页面后又会重新需要访问、b在未来的第2个页面后又会重新需要访问,c则是未来的第5个时间。那么这样的话,按照opt算法,我们就将c物理页面换出,将d页面放置在原来c页面的位置即可。

细心的筒子可以发现一个问题,我这里说在未来的第几个页面又会重新需要,那真的运行一个程序的时候,OS哪里可能知道未来那个页面会被重新使用 ?所以说,这是一个纯理想的算法,无法实现,只能作为置换算法的一个性能评估依据。

再举个栗子,大家可以自己在脑子里模拟一下执行过程,这里假设在0时刻,abcd四个页都已经在内存中了。紫色的圈表示在该时刻出现了缺页异常,红色的箭头表示置换的是哪个页。
在这里插入图片描述

FIFO算法

FIFO即First-In-First-out,先入先出算法,思想就是将那个在内存中驻留时间最长的页面进行置换。这里实现的方法可以是通过维护一个链表,按照页面的到来顺序,依次插入链表尾部,每次要置换页的时候,就对链首继续置换,新页插入到链表尾。

但是,这个算法的性能比较差,因为它不知道未来页面的到来情况(毕竟它只看到的是已经驻留的页面),有可能频繁的将一些再次会用到的页进行置换。此外,FIFO还有可能出现belady现象(变成女人??? exm??? 开个玩笑。。 )这个现象阐述的是这样一种情况,若OS给进程分配的物理页面数量增加,缺页次数并不一定因为物理页面数量的增加而减少,反而会更多。

所以,总的来说,FIFOF很少单独使用,会配合一些其他算法使用,例如后面会讲到的时钟算法。

FIFO也来个栗子,假设在0时刻之前,abcd四个页面的到来顺序为abcd,可见,出现页面置换的次数较多。
在这里插入图片描述
值得注意的是,在FIFO算法中,会存在Belady现象,这个现象就是说,随着OS给每一个进程所分配的物理页数量增加,出现缺页异常的次数非但没有减少,反而增加了。

注意:这里并不是说,一直增加物理页面数量,缺页异常一直增加,这显然是不对的,假设一个进程被分配到的物理页面数量无穷大,那缺页异常肯定是0. Belady现象只是说在某一小段区间内,出现缺页异常的次数随着分配的物理页面增多而增多。

在这里插入图片描述
在这里插入图片描述

最近最久未使用算法 (Least Recently Used, LRU)

这个算法从英文的字面意思上就可以理解它在干什么了。其实还是一个模拟未来页面到来情况的思想,算是对OPT算法的一个近似,LRU算法认为,最近那个最近一直没被使用的页,在未来也最有可能不会被使用,所以将它置换出去(实际上,这也是基于我们程序有较好局部性的特征基础之上的)。

缺页时,计算内存中每个逻辑页面的上一次访问时间,置换上一次访问时间距离现在最远的那个页面(即时间最小) 。

栗子如下,假设在0时刻abcd四个页面已经驻留在内存中了。
在这里插入图片描述

LRU的实现方法大致有两种:

  1. 基于链表的实现

OS维护一个按最近一次访问时间排序的页面链表,其中,链表首节点是最近刚刚使用过的页面,而链表尾结点是最久未使用的页面,按照上图所示例子的话,在t=5时刻之前,链表的状态如下:

在这里插入图片描述
每次缺页的适合,就将链表尾部的页面进行置换,并把它移到链表的首部去。t=5时刻置换页动作完成后,链表的状态如下:
在这里插入图片描述
2. 基于栈的实现

思路和链表的实现差不多,如下图:
在这里插入图片描述

时钟算法(clock)

像上面的LRU算法,性能其实是不错的,唯一的缺点就是维护链表或栈相对来说要麻烦一些,于是出现了时钟算法,它的思路是对页面的访做大致的统计,不一定是完全严格按照LRU的思路,比如,在t=1时刻的页面a和t=2时刻的页面b,时钟算法有可能第一个换页面b而不是a。

时钟算法采用了一种特殊的数据结构——环形列表,且在页表项中增加了一个访问位(还记得吗?之前的博客虚存管理中提到过,当时说这个位是为了页面置换时用的),环形列表的指针指向最先调入的页面。

算法的思想是,访问页面时,在页表项纪录页面的访问情况,缺页时,从指针出开始顺序地、循环地查找未被访问的页面进行置换。时钟算法其实是LRU和FIFO的折中。
在这里插入图片描述
算法实现的pseudo code如下:

while(目标页面不存在)
{if(当前指针所指的页表项的访问位为0){替换当前页;赋值当前页表项的访问位为1;}else{赋值当前指针所指的页表项的访问位为1;}指针下移一位;
}

例子如下,假设在0时刻,时钟算法的当前指针指向第一项,蓝色的那一项就是当前指针所指项:
在这里插入图片描述
在上图中,需要注意的是,如果存在页表项,只是其对应的访问位为0的时候,在访问该页时,只会将访问位置为1。而出现页面置换时,操作完后,指针要下移一位。

关于clock算法,还有其改进算法,称为二次机会法,由于笔者表达能力有限,这里给个视频讲解链接。 >>二次机会算法<<,其思路和clock算法是很相似的。

最不常用算法(Least Frequently Used,LFU)

最不常用算法并不是说这个算法不常用。。。

其实,这也是对未来将出现的页面的另一种模拟。该算法认为,当前访问次数较少的页面,在未来也有较大概率不会被访问,于是,每次出现缺页异常时,选择访问次数最少的那个页面,并将之淘汰。

举例如下,上标表示该页的访问次数:
在这里插入图片描述

2. 全局页面置换算法

所谓全局页面置换算法,就是指OS基于多个进程之间的考虑(即全局的思想),为进程分配可变数目的物理页帧。最终目的还是为了减少出现缺页异常的数量。


在这里插入图片描述
下面介绍几个概念:

工作集(working set)

工作集指的是一个进程当前正在使用的逻辑页面的集合,可表示为一个二元函数 W ( t , △ ) W(t,\triangle) W(t,),其中 t t t是进程当前执行的时刻, △ \triangle 称为工作集窗口(working-set window),即一个定长的页面访问时间窗口。

则:
W ( t , △ ) W(t,\triangle) W(t,)是指当前时刻t前的 △ \triangle 时间窗口中的所有访问页面组成的集合。
∣ W ( t , △ ) ∣ |W(t,\triangle)| W(t,)是指工作集大学,即页面数量。
在这里插入图片描述
一般来说,进程的初始阶段,随着访问新页面的逐步建立,工作集的数量会增加,然后进程中间阶段会比较平稳,一旦又有新的页访问,工作集会产生一定波动,然后再保持平稳,整体呈以下图示状态:
在这里插入图片描述

常驻集

常驻集指的是在当前某个时刻,进程实际驻留在内存当中的页面集合。

常驻集和工作集的区别是,前者指在内存中的物理页,而工作集是指逻辑页。

工作集置换算法

该算法的思路是,在访存时,换出不在工作集中的页面;而在缺页时,换入缺失的页面。
在这里插入图片描述
如上图所示,稍加解释一下。在t=1时刻,由于缺页C,于是将之换入,在t=2时刻,由于C页面已经存在,是一次访存操作,因为工作集的窗口大小为4,所以当前的工作集为 { d , a , c } \{d,a,c\} {d,a,c},于是需要将页面e替换出去,后面的操作同理。

缺页率置换算法(page fault frequency,PFF)

该算法中,需要记录两个时间 t c u r r e n t 和 t l a s t t_{current}和t_{last} tcurrenttlast,分别表示当前缺页时间和上一次产生缺页异常的时间。算法思路是:

如果 t c u r r e n t − t l a s t &gt; T t_{current}-t_{last}&gt;T tcurrenttlast>T,则置换所有在 [ t l a s t , t c u r r e n t ] [t_{last},t_{current}] [tlast,tcurrent]间没有被访问过的页

如果 t c u r r e n t − t l a s t ≤ T t_{current}-t_{last} \le T tcurrenttlastT,则增加缺失的页到工作集中。

这里的T指的是窗口大小。

直观的一个理解是,当 t c u r r e n t − t l a s t &gt; T t_{current}-t_{last}&gt;T tcurrenttlast>T,这说明距离上一次产生缺页异常的时间较远,即在较长一段时间内没有发生缺页异常,于是将一些自上一次发生缺页异常以来,存在于工作集中又从未被访问过的页置换出去(因为它们很有可能不再会被访问了);而当 t c u r r e n t − t l a s t ≤ T t_{current}-t_{last} \le T tcurrenttlastT时,这说明距离上一次产生缺页异常的时间较近,,需要把缺失的页放进来。
在这里插入图片描述


http://chatgpt.dhexx.cn/article/KM1lVoFH.shtml

相关文章

os 页面置换算法

在进程运行过程中&#xff0c;若其所要访问的页面不在内存&#xff0c;而需把它们调入内存&#xff0c;但内部无空闲空间时&#xff0c;为了保证该进程能正常运行&#xff0c;系统必须从内存中调出一页程序或数据送到磁盘的对换区中。但应将哪个页面调出&#xff0c;须根据一定…

内存页面置换算法

前面我们说过了进程的调度算法&#xff0c;今天我们继续来盘内存页面的置换算法&#xff0c;给你整的明明白白的&#x1f92a;&#x1f92a;&#x1f92a;。 内存页面置换算法主要有下面这么几种&#xff1a; 最佳页面置换算法&#xff08;OPT&#xff09;先进先出置换算法&a…

三种页面置换算法(详解)

地址映射过程中&#xff0c;若在页面中发现所要访问的页面不在内存中&#xff0c;则产生缺页中断。当发生缺页中断时&#xff0c;如果操作系统内存中没有空闲页面&#xff0c;则操作系统必须在内存选择一个页面将其移出内存&#xff0c;以便为即将调入的页面让出空间。而用来选…

计算机操作系统——页面置换算法

声明&#xff1a;本篇博客参考书籍《计算机操作系统》&#xff08;西安电子科技大学出版社&#xff09; 文章目录 一、最佳页面置换算法1、基本知识2、算法思想 二、先进先出&#xff08;FIFO&#xff09;页面置换算法1、基本知识2、算法思想 三、最近最久未使用&#xff08;L…

页面置换算法

文章目录 一、什么是页面置换算法&#xff1f;二、常用的页面置换算法1. FIFO(先进先出算法)2. OPT(最佳置换算法)3. LRU(最近最少使用算法)4. Clock(时钟置换算法)5. LFU(最不常用算法)6. MFU(最常使用算法) 三、程序设计 一、什么是页面置换算法&#xff1f; 进程运行时&…

一文讲懂页面置换算法,带例题详解

目录 ​什么是页面置换算法&#xff1f; ​缺页中断次数和页面置换次数 ​啥子是缺页&#xff1f; ​啥子是中断&#xff1f; ​啥子是缺页中断&#xff1f; ​缺页中断次数 ​最佳置换算法OPT和先进先出置换算法FIFO ​最佳置换算法OPT ​算法思想 ​算法优点 ​算…

回声状态网络ESN(原理)

回声状态网络ESN(原理) 结构特点 网络有3层&#xff1a;输入层 - 隐含层 - 输出层

基于回声状态网络(ESN)的时间序列预测

基于回声状态网络(ESN)的时间序列预测 matlab代码 ID:69100644585791395

【回声状态网络ESN预测】基于粒子群优化回声状态网络ESN实现数据预测附matlab代码

1 简介 由于结构简单,收敛速度快等优点,回声状态网络(Echo State Network, ESN)已被广泛的用于时间序列的预测.针对回声状态网络中随机生成权值矩阵带来的不适用于特定时间序列的问题,本文提出利用粒子群优化算法来优化回声状态网络部分随机权值..实验结果表明,本文提出的方法…

第二十九课.回声状态网络ESN

目录 Echo State NetworkESN的训练与预测关于ESN工作原理的理解 基于Numpy的ESN Echo State Network ESN的训练与预测 回声状态网络&#xff08;Echo State Network&#xff09;又称为库计算&#xff0c;即Reservoir Computing&#xff0c;被视为是一种神经网络的扩展。 Res…

【无人机】回波状态网络(ESN)在固定翼无人机非线性控制中的应用(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【MLPs+ESN】利用多层感知机MLPs对经典ESN(回声状态网络)的输出权值计算进行优化的MATLAB仿真

单独的ESN仿真&#xff1a; ESN的运行结果如下所示&#xff1a; 这个部分的误差为&#xff1a; 0.0435 ESN部分就不多做介绍了&#xff0c;你应该了解的&#xff0c;下面我们对ESN和BP改进和极限学习改进分别进行修改和说明&#xff0c;并进行仿真。 ESNBP的仿真&#xff1a; …

回声状态网络(ESN)实现手写数字识别(MNIST)

文章目录 回声状态网络状态方程输出方程分类问题 加载 MNIST 数据集标签 onehot 编码转化成时间序列训练 ESN储备池状态的时空分布测试结果 回声状态网络 状态方程 输出方程 分类问题 加载 MNIST 数据集 from torchvision.datasets import mnist train_set mnist.MNIST(./da…

回声状态网络(ESN)的公式推导及代码实现

1. ESN的任务 给定一段信号&#xff1a; u ( 0 ) &#xff0c; u ( 1 ) &#xff0c; ⋅ ⋅ ⋅ &#xff0c; u ( N t − 1 ) u(0)&#xff0c;u(1)&#xff0c;&#xff0c;u(N_t-1) u(0)&#xff0c;u(1)&#xff0c;⋅⋅⋅&#xff0c;u(Nt​−1) 和目标值&#xff1a; v (…

matlab 回声状态网络ESN的时间序列预测

1、内容简介 略 537-可以交流、咨询、答疑 2、内容说明 ESN是Jaeger于2001年提出一种新型递归神经网络&#xff0c;ESN一经提出便成为学术界的热点&#xff0c;并被大量地应用到各种不同的领域中&#xff0c;包括动态模式分类、机器人控制、对象跟踪核运动目标检测、事件监测…

手机esn不可用怎么解决_什么是ESN,为什么我不担心它是否干净?

手机esn不可用怎么解决 If you’re in the market for a cellphone, especially a used one, you’ll hear a lot of talk about ESNs with an emphasis on whether or not the phone is “clean”. What exactly does acronym stand for and what does it mean if the phone i…

回声状态网络(ESN)教程

回声状态网络(ESN)教程 基础概念 回声状态网络(Echo State Network)提出于2001年&#xff0c;曾经是研究的热点&#xff0c;但近年来随着RNN&#xff0c;LSTM与其它一些变种的网络的出现&#xff0c;现在研究比较少了&#xff0c;但是其在时间序列预测上还有着很不错的应用。…

Deep Learning之带你详细了解回声状态网络(ESN)

Abstract 首先呢写本篇博客的灵感来源于我在学习RNN&#xff08;循环神经网络&#xff09;时对于如何解决其循环结构&#xff0c;参数共享带来的长期依赖问题&#xff0c;我将在&#xff08;一&#xff09;中简要叙述RNN引出本文主角ESN&#xff08;回声状态网络&#xff09;。…

回声状态网络(echo state network,ESN)概述

一、提出 循环神经网络&#xff08;Recurrent Neural Networks,RNNs&#xff09;的训练是通过反向对权值直接优化来实现的&#xff0c;这种方式容易产生两个问题&#xff1a;收敛速度慢和易陷入局部最优。回声状态网络( echo state network&#xff0c;ESN) 由 Jaeger于2001年…

回声状态网络(ESN)原理详解(附源码实现)

最近在看回声状态网络(Echo State Network)的内容&#xff0c;因为很少搜到关于Echo State Network的快速入门讲解&#xff0c;所以打算写一下ESN的基本原理。 1、概念 回声状态网络作为一种新型的递归神经网络(如上图)&#xff0c;也由输入层、隐藏层(即储备池)、输出层组成…