虚拟内存页面置换算法

article/2025/10/8 8:42:30

虚拟内存页面置换算法

  • 虚拟地址空间
    • 页表
    • 分页式
    • 分段式
    • 段页式
  • 页面置换算法
    • 最优置换算法( OPT)
    • 先进先出算法(FIFO)
    • 最近最久未使用算法(LRU)

虚拟内存是计算机系统内存管理的一种技术。
它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
目前,大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等

虚拟地址空间

在C语言中我们称之为程序地址空间,而Linux下称之为进程虚拟地址空间
在这里插入图片描述

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main()
{pid_t pid = fork();int g_val = 10;if(pid < 0){perror("fork");return 0;}else if(pid == 0){ //child,子进程肯定先跑完,也就是子进程先修改//完成之后,父进程再读取g_val=100;printf("child [%d]: [%d] : [%p]\n", getpid(), g_val, &g_val);}else{ //parentsleep(3);printf("parent [%d]: [%d] : [%p]\n", getpid(), g_val, &g_val);}sleep(1);return 0;
}

运行之后我们发现变量内容不一样,所以父子进程输出的变量绝对不是同一个变量,但他们的地址值是一样的,说明,该地址绝对不是物理地址!

在Linux地址下,这种地址叫做虚拟地址,而我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理,这块就涉及一个写时拷贝的概念。

  • 写时拷贝 : 当数据发生修改的时候,才重新分配一个物理内存,并将页表当中的映射关系改掉
  • 物理内存: 存储数据时需要依靠的介质
  • 逻辑地址: 进程虚拟地址空间,也就是人为规定的,不能存储数据的.

在这里插入图片描述

页表

页表的作用是将虚拟地址映射成物理地址
页表的存储在汇编中就是 段基址 * 16 + 偏移量,段基址是页内偏移,块号是偏移量

分页式

前提:会将虚拟地址分成一页一页的格式,会将物理内存分成一块一块的格式。

分页的原因:假设我们有一个16M大小的存储空间,因为计算机存储的时候,地址都是随机分配的,如果很不凑巧,这段空间的正中间的位置分配一个8M大小的数据,那么之后要是再存储一个5M大小的数据就会出现存不下的问题,这就造成了内存的浪费。
在这里插入图片描述
分页式的存储就和书差不多,把知识点都分成一页一页的,然后每一块知识点都有一个目录,可以通过目录很快的找到这一块的位置,然后在这一页中找知识点,唯一有区别的就是,在计算机中,每一块物理内存的大小都是一样的。

  • 块号: 根据页号在页表中的映射去查找的块的标号
    假设虚拟地址为5000,块的大小是4096,如何计算物理地址?
  • 页号 = 虚拟地址 / 块大小
  • 页内偏移 = 虚拟地址 % 块的大小
  • 块的起始地址 = 块号 * 大小
  • 物理地址 = 块的起始地址 + 页内偏移
页号 : 5000 / 4096 = 1
页内偏移 :5000 % 4096 = 904
块的起始地址 :5 * 4096
物理地址 : 5 * 4096 +904`

在这里插入图片描述

分段式

将虚拟地址映射成物理地址的结构不是页表了,而是段表。它的存储是将一个数据段直接放在物理内存中。
先根据段号从段表中找到对应的段的起始地址,再通过 段内偏移 + 段的起始地址 =物理地址。
在这里插入图片描述

分段式和分页式对比

分页式数据存储效率高,分段式效率低。
分段式对程序很友好,可以通过段表的结构,找到虚拟地址空间当中的一段。

段页式

存储时采取了段表结构和页表结构。

先根据段号来找到段表中页的起始地址,然后找到对应是那一页,再根据页号找到该页表中的块号,最后通过块号算出块的起始地址,块的起始地址 + 页内偏移 = 物理地址
在这里插入图片描述

页面置换算法

源码地址:https://github.com/duchenlong/linux-text/tree/master/page

页面置换算法产生的原因:由于虚拟地址空间中,他本身并不具备存储数据的能力,只是将部分数据存储在外存中,当使用该数据的时候,才将他加载到内存中;

但因为内存空间有限,所以说终究会出现内存已满的情况,这个时候就需要将内存中的部分空间转移到外存中,再将该页面加载到内存

最优置换算法( OPT)

缺页中断发生时,对保存在内存中的每一个逻辑页面,计算在他下一次访问之前还需等待多长时间,从中选择等待时间最长的那个,作为被置换。

这是理想情况,需要预知未来,一般用于其他算法性能评估

#include <list>
#include <vector>
#include <iostream>
#include <unordered_map>
#include <algorithm>
#include <string>using namespace std;class MyOpt{private:vector<int> _vec;list<int>   _list;int         _capacity;unordered_map<int,list<int>::iterator> _hash;public:MyOpt(vector<int>& vec,int num) {_vec = vec;_capacity = num;}bool get(int value);void put(int value,int pos);void show();int find(int value,int pos);
};int MyOpt::find(int value,int pos) {int n = _vec.size();for(int i = pos; i < n; i++) {if(_vec[i] == value) return i;}return -1;
}bool MyOpt::get(int value) {if(_hash.count(value) == 0) return false;return true;
}void MyOpt::put(int value,int pos) {if(get(value))return ;if((int)_hash.size() == _capacity) {// 删除auto it = _list.begin();auto del = it;auto span = _vec.begin() + pos;for(; it != _list.end(); it++) {auto it_e = std::find(_vec.begin() + pos,_vec.end(),*it);if(it_e == _vec.end()) {del = it;break;} else if(it_e > span){span = it_e;del = it;}}_hash.erase(*del);_list.erase(del);}_list.push_back(value);_hash[value] = _list.end()--;
}void MyOpt::show() {for(auto& e : _list)cout << e << " ";cout << endl;
}

先进先出算法(FIFO)

缺页中断发生时,系统选择在内存中驻留时间最长的页面淘汰。通常采用链表记录进入物理内存中的逻辑页面,链首时间最长。

该算法实现简单,但性能较差,调出的页面可能是经常访问的页面,而且进程分配物理页面数增加时,缺页并不一定减少(Belady现象)

#include <list>
#include <iostream>
#include <unordered_map>using namespace std;class MyFifo{private:unordered_map<int,list<int>::iterator> _hash;list<int>   _list;int         _capacity;public:MyFifo(int num){_capacity = num;}bool get(int value);void put(int value);void show();
};bool MyFifo::get(int value){if(_hash.count(value) == 0) return false;return true;
}void MyFifo::put(int value) {if(get(value) == true) return ;if((int)_hash.size() == _capacity) {// 头删auto f = _list.front();_hash.erase(f);_list.pop_front();}_list.push_back(value);_hash[value] = _list.end()--;
}void MyFifo::show() {for(auto& e : _list) {cout << e << " ";}cout << endl;
}

最近最久未使用算法(LRU)

算法思想是缺页发生时,选择最长时间没有被引用的页面进行置换,如某些页面长时间未被访问,则它们在将来还可能会长时间不会访问。

在这里插入图片描述

使用的方法:一个带头结点的双向循环链表

  1. 每次插入数据,都在链表的头部插入,表示近期被使用
  2. 查找数据的时候,把该数据移动到链表的头部,近期被使用
  3. 需要替换的时候,就删除掉链表的尾部数据,他是近期使用次数最少的
#include <list>
#include <unordered_map>
#include <iostream>using namespace std;class MyLRU{private:unordered_map<int,list<int>::iterator> _hash;list<int> _list;int _capacity;public:MyLRU(int num){_capacity = num;}bool get(int value);void put(int value);void show();
};bool MyLRU::get(int value) {if(_hash.count(value) == 0) return false;auto node = _hash[value];_list.erase(node);_list.push_front(value);_hash[value] = _list.begin();return true;
}void MyLRU::put(int value) {if(get(value)) return ;if((int)_hash.size() == _capacity) {// 尾删auto del = _list.back();_hash.erase(del);_list.pop_back();}_list.push_front(value);_hash[value] = _list.begin();
}void MyLRU::show() {for(auto& e : _list) {cout << e << " ";}cout << endl;
}

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

相关文章

OS之页面置换算法

之前几篇博客记录了OS内存管理的一些知识和技术&#xff0c;接下来将继续深入&#xff0c;介绍一些页面置换算法&#xff0c;这里包括一些我们大家都略有耳闻的算法。 置换算法 当出现缺页故障时&#xff0c;需要从外存调入新的页面到内存中去&#xff0c;而如果此时内存已满…

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年…