【操作系统】页面置换算法

页面置换算法

在进程运行过程中,若需要访问的物理块不在内存中,就需要通过一定的方式来将页面载入内存,而此时内存很可能已无空闲空间,因此就需要一定的算法来选择内存中要被置换的页面,这种算法就被称为页面置换算法。页面置换算法的好坏,将直接影响系统的性能。

一个好的页面置换算法,应做到减少页面置换的频率。尽量将以后不会用到的或较长时间不会使用的页面给置换出。

下面介绍几种常用的页面置换算法。


1. 最佳置换算法

该算法是一种理想化的算法,具有非常好的性能,但是由于目前无法预知未来,因此难以实现。

该算法选择淘汰的页面是:未来永远不会再使用的页面 or 未来最长时间不再被访问的页面。该算法保证了可以获得最低缺页率,但无法预知未来页面的使用情况,因此目前无法实现,但通常用来评价其他算法。

例:假定系统为某进程分配了三个物理块,并考虑有以下的页面号引用串:
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
进程运行时,先将 7,0,1 三个页面装入内存。以后,当进程要访问页面 2 时,将会产生缺页中断。此时 OS 根据最佳置换算法,将选择页面 7 予以淘汰。这是因为页面 0 将作为第 5 个被访问的页面,页面 1 是第 14 个被访问的页面,而页面 7 则要在第 18 次页面访问时才需调入。下次访问页面 0 时,因它已在内存而不必产生缺页中断。当进程访问页面 3时,又将引起页面 1 被淘汰;因为,它在现有的 1,2,0 三个页面中,将是以后最晚才被访问的。图 4-26 示出了采用最佳置换算法时的置换图。由图可看出,采用最佳置换算法发生了 6 次页面置换。

1


2. 先进先出(FIFO)页面置换算法

该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。

例:同上。当进程第一次访问页面 2 时,将把第 7 页换出,因为它是最先被调入内存的;在第一次访问页面 3 时,又将把第 0 页换出, 因为它在现有的 2, 0, 1 三个页面中是最老的页。 由图 4-27 可以看出,利用 FIFO 算法时进行了 12 次页面置换,比最佳置换算法正好多一倍。
2


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

该算法以过去预测未来,选择之前最长时间未使用的页面置换。但是由于利用“过去”作为“未来”的近似这一做法并非完全可靠,因此有时会造成缺页率非常高,导致效率会非常低。

例:同上。当进程第一次对页面 2 进行访问时,由于页面 7 是最近最久未被访问的,故将它置换出去。当进程第一次对页面 3进行访问时,第 1 页成为最近最久未使用的页,将它换出。由图可以看出,前 5 个时间的图像与最佳置换算法时的相同,但这并非是必然的结果。因为,最佳置换算法是从“向后看”的观点出发的,即它是依据以后各页的使用情况;而 LRU 算法则“向前看”的,即根据各页以前的使用情况来判断,而页面过去和未来的走向之间并无必然的联系。

3


4. 代码实现

该部分代码使用vector来实现,未使用链表。

/*************************************************************************> 测试数据> 20> 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1> 3************************************************************************/#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;class PageReplacement {
private:vector<int> page;int page_num;  //物理内存块数
public:PageReplacement() : page_num(0) {}void create();void print();void physical_block_print( const vector<int>& );bool isfind( const vector<int>&, int );  //查找是否已在内存物理块中void FIFO();  //FIFO页面置换算法void LRU();  //LRU页面置换算法void OPT(); //OPT页面置换算法
};void PageReplacement::create() {cout << "请输入页面个数: ";int n, t;cin >> n;cout << "请输入页面串:\n";while( n-- ) {cin >> t;page.push_back( t );}cout << "请输入内存物理块数: ";cin >> page_num;
}void PageReplacement::print() {int n = page.size();cout << "页面串:\n";for( int i = 0; i < n; i++ ) {cout << page[i] << ' ';}cout << endl;
}void PageReplacement::physical_block_print( const vector<int>& t ) {int n = t.size();for( int i = 0; i < n; i++ ) {cout << t[i] << ' ';}cout << endl;
}bool PageReplacement::isfind( const vector<int> & block, int t ) {if ( find( block.begin(), block.end(), t ) != block.end() ) {return true;}return false;
}/* FIFO页面置换算法 */
void PageReplacement::FIFO() {vector<int> physical_block( page_num, -1 );int n = page.size(), cur = 0;int not_found = 0;cout << "FIFO页面置换情况:\n";for( int i = 0; i < n; i++ ) {if( !isfind( physical_block, page[i] ) ) {physical_block[cur] = page[i];  //页面置换cur = (cur+1)%page_num;not_found++;}physical_block_print( physical_block );  //输出每个物理块信息}cout << "缺页次数:"<< not_found << endl;
}/* LRU页面置换算法 */
void PageReplacement::LRU() {vector<int> physical_block( page_num, -1 );map<int, int> page_time;int n = page.size();int not_found = 0;for( int i = 0; i < n; i++ ) {if ( !isfind( physical_block, page[i] ) ) {  //当前页不在为物理块中if ( page_time.size() < page_num ) { //物理块未放满physical_block[i] = page[i];page_time[page[i]] = i;} else {  //物理块放满,进行页面置换map<int, int>::iterator it = page_time.begin(), t = it;for( it++; it != page_time.end(); it++ ) {if ( t->second > it->second ) {t = it;}}int index;for( index = 0; index < page_num && physical_block[index]!=t->first; index++ );physical_block[index] = page[i];page_time.erase( t );page_time[page[i]] = i;}not_found++;} else {  //在物理块中,更新页面最后使用时间page_time[page[i]] = i;}physical_block_print( physical_block );}cout << "缺页次数:"<< not_found << endl;
}/* OPT页面置换算法 */
void PageReplacement::OPT() {vector<int> physical_block( page_num, -1 );int n = page.size();int not_found = 0;for( int i = 0; i < n; i++ ) {if( !isfind( physical_block, page[i] ) ) {  //当前页不在物理块中if( i < page_num ) {  //物理块未放满physical_block[i] = page[i];} else {  //物理块放满,进行页面置换map<int, int> page_time;int k, j;/* 获取物理块中页面此后的最先使用时间 */for( j = 0; j < page_num; j++ ) { //遍历physical_blockfor( k = i+1; k < n; k++ ) {  //遍历pageif( physical_block[j] == page[k] ) {page_time[page[k]] = k;break;}}if( k == n ) {page_time[physical_block[j]] = k;}}/* 寻找可以置换的页面 */map<int, int>::iterator it = page_time.begin(), t = it;for( ; it != page_time.end(); it++ ) {if ( t->second < it->second ) {t = it;}}/* 获取被置换页面在物理块的下标 */int index = 0;for( ; index < page_num && physical_block[index] != t->first; index++ );physical_block[index] = page[i];}not_found++;}physical_block_print( physical_block );}cout << "缺页次数:"<< not_found << endl;
}int main() {PageReplacement t;t.create();// t.FIFO();t.LRU();// t.OPT();return 0;
}

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

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

相关文章

ubuntu18.04安装、配置dosbox

1 安装dosbox&#xff1a;打开终端&#xff0c;输入&#xff1a; sudo apt install dosbox 2 安装完成后&#xff0c;启动dosbox&#xff0c;在终端输入&#xff1a; dosbox 3 设置自动挂载 退出dosbox&#xff0c;在终端中输入&#xff1a; vim .dosbox/dosbox-0.74.con…

关于 SENDKEYS 的代码

sendkeys 的用法&#xff08;MSDN&#xff09;&#xff1a; SendKeys 语句 将一个或多个按键消息发送到活动窗口&#xff0c;就如同在键盘上进行输入一样。 语法 SendKeys string[, wait] SendKeys 语句的语法具有以下几个命名参数&#xff1a; 部分描述string必需的。字符串表…

【计算机网络】TCP IP通信处理过程

1.数据包首部 每个分层中都会对所发送的数据附加一个首部&#xff0c;其中包含了该层必要的信息&#xff0c;如发送端地址、接收端地址以及协议等相关信息。 2.发送数据包 1&#xff09;应用程序处理 进行编码处理&#xff08;相当于表示层功能&#xff09;&#xff0c;管…

【计算机网络】数据链路相关技术

1.MAC地址 MAC地址长48字节。在使用网卡的情况下&#xff0c;一般会将MAC地址烧入到ROM中&#xff0c;任何一个网卡的MAC地址都是唯一的。例如 00:10:5A:70:33:61 MAC地址的3~24位表示厂商识别码&#xff0c;每个NIC厂商都有特定唯一的识别数字。25~48位是厂商内部为识别每个…

【计算机网络】IP地址

IP地址的基础知识 在TCP/IP通信中&#xff0c;IP地址用于识别主机和路由器。 1.IP地址的定义 IPv4地址为32位&#xff0c;IPv6地址为128位。&#xff08;以下以IPv4为例&#xff09; 将32位的IP地址分为4组&#xff0c;每组8位&#xff0c;每组间用“.”隔开&#xff0c;再…

天空的颜色和大气散射

天空的颜色采用"A Practical Analytic Model for Daylight"建造的模型计算。地形颜色的大气散射采用"Rendering Outdoor Lght Scattering in real Time"介绍的方法计算。A Practical Analytic Model for Daylight中的模型通过太阳的方位&#xff0c;Zenith…

hexo本地博客的转移

1. 复制配置文件 将原来的配置文件进行备份&#xff0c;只需要将文件夹 source、themes和配置文件_config.yml备份即可。 2. 安装Node.js sudo apt-get install nodejs sudo apt-get install npm 3. 安装hexo sudo npm install -g hexo 4. 新建文件夹&#xff0c;cd进入 …

K8S 外部访问配置、 Ingress、NodePort

将K8S部署应用提供给外部访问一般有三种方式&#xff1a; NodePort 暴露端口到节点&#xff0c;提供了集群外部访问的入口LoadBalancer 需要负载均衡器&#xff08;通常都需要云服务商提供&#xff0c;裸机可以安装 METALLB 测试&#xff09;Ingress 统一管理 svc的外部访问&am…

ubuntu18重装笔记

再次重装了系统&#xff0c;为方便以后再次重装&#xff0c;&#xff0c;&#xff0c;因此将主要步骤记录下来。 1. 更新源 sudo gedit /etc/apt/sources.list # 阿里源deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb http://mirro…

Flex2.0实现文件上传功能(服务器为ASP.NET)

简介&#xff1a;新的Flex2.0类库里提供了文件类&#xff0c;方便了上传/下载文件。下面的程序demo演示了Flex2.0生成flash来访问本地文件&#xff0c;在flash里上传用户选择的文件到服务器&#xff0c;flash客户端可以处理文件上传进度等多个事件&#xff0c;服务器端是C#写的…

【高性能定时器】 时间轮

时间轮 简述 顾名思义&#xff0c;时间轮就像一个轮子&#xff0c;在转动的时候外界会指向轮子不同的区域&#xff0c;该区域就可以被使用。因此只要将不同时间的定时器按照一定的方法散列到时间轮的不同槽&#xff08;即时间轮划分的区域&#xff09;之中&#xff0c;就可以实…

【安利】程序猿作图神器 - Graphviz

还在为在linux下画二叉树等图苦恼吗&#xff0c;现在就安利一波linux程序猿的作图神器——Graphviz。&#xff08;本来在写其他东西&#xff0c;刚好要绘图&#xff0c;强行插入一篇blog&#xff09; Graphviz (Graph Visualization Software) 是一个由AT&T实验室启动的开源…

仿ISQL功能的实现,可以实现批处理功能

具体请见下载文件&#xff1a;/Files/bigmouthz/DNet写的数据库isql执行程序&#xff08;含源码&#xff09;.rar部分代码如下&#xff1a; DBCore.DataBaseVisitor.AbsDBHelper dbhelper null ; private void bt_DBLink_Click(object sender, System.EventArgs e) { try …

【高性能定时器】时间堆(最小堆)

最小堆及其应用&#xff1a;时间堆 最小堆及其应用&#xff1a;时间堆 一、 堆1. 概念2. 最小堆的实现3. 性质4. 代码 二、时间堆1. 概念简述2. 实现细节3. 代码 一、 堆 1. 概念 堆是一种经过排序的完全二叉树&#xff0c;其中任一非终端节点的数据值均不大于&#xff08;或…

【操作系统】生产者消费者问题

生产者消费者模型 文章目录生产者消费者模型 [toc]一、 生产者消费者问题二、 问题分析三、 伪代码实现四、代码实现&#xff08;C&#xff09;五、 互斥锁与条件变量的使用比较一、 生产者消费者问题 生产者消费者问题&#xff08;英语&#xff1a;Producer-consumer problem&…

【计算机网络】三次握手与四次挥手

三次握手与四次挥手 通过TCP/IP协议的学习&#xff0c;我们可以知道TCP协议是一种面向连接的、可靠的传输协议。其中&#xff0c;为了保证客户端与服务器连接的有效性&#xff0c;就有了本篇文章所要介绍的“三次挥手”&#xff1b;而“四次挥手”则是为了保证连接的正确断开。…

小叔叔又飞走了

小叔叔在飞走之前&#xff0c;昨天晚上&#xff0c;给我们看了&#xff0c;他回老家拍下的&#xff0c;家里每个人的视频&#xff0c;&#xff08;前面这半句话说得好累&#xff0c;不过应该不是病句&#xff09;让我们看了动情又亲切&#xff0c;至少我是这么觉得。一个大家庭…

系统调用中断(EINTR)与SIGCHLD信号的处理

一、被中断的系统调用(EINTR)的理解1. 慢系统调用是&#xff1f;2. 慢系统调用的类别3. EINTR产生的原因5. 一般处理方法 二、SIGCHLD信号的处理1. SIGCHLD信号的产生2. SIGCHLD信号的处理3. 不处理SIGCHLD的后果 三、示例代码 一、被中断的系统调用(EINTR)的理解 1. 慢系…

SMO写的查看数据库信息的代码

要分析一个比较大的数据库&#xff0c;里面的表太多了&#xff0c;虽然是中文命名&#xff0c;但在2005的Management Studio中查看还是比较麻烦&#xff0c;比如&#xff0c;我想查看具有相同字段名称的表的情况就不好办。于是用SMO写了这个东东。代码比较乱&#xff0c;没有进…

win10宽带连接断网自动重连

文章目录1. 断开网络连接&#xff0c;重命名网络连接2. bat代码&#xff1a;检测到断线自动重连3. 设置开机自动执行3.1 方式一&#xff1a;任务计划程序3.2 方式二&#xff1a;用vbs代码开机运行bat1. 断开网络连接&#xff0c;重命名网络连接 中文名字可能出现远程访问错误 …