虚存管理页面置换算法 — FIFO和RUL算法模拟实现
本篇博文为追忆以前写过的算法系列第一篇(20081021)
温故知新
目的: 为了解决内存容量有限与多作业执行的冲突。运用了虚拟存储技术。能从逻辑上对内存进行扩充,达到扩充内存的效果。分页存储管理是实现虚拟存储的一种方案。通过模拟算法的实验。加深理解,虚拟存储器的基本原理和方法。
要求: 1.请求分页的置换算法(FIFO
&& RUL算法实现);2.按给定的顺序列,输出页面调度过程包含命中
/ 缺页,调入/调出;3.计算缺页率,频率。
说明:
vp_list[N] //訪问序列
bs[M] //内存块表,M为内存块大小
struct pt{
int pno; //页号
int bno; //块号
int flag; //状态位,为0时在不内存。为1时在内存
int order; //优先序号
};
算法流程:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3VqaW5qaW5zZXU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" />
程序:
/* gujinjin 08/10/20 */
/* 程序名称:fifo &&LRU */
/* 程序目的:页面置换算法的FIFO编程实现 */
#include<iostream>
using namespace std;
#define N 20 //訪问序列数组大小
#define M 10 //内存块表数组大小
struct pt{
int pno; //页号
int bno; //块号
int flag; //状态位,为0时在不内存,为1时在内存
int order; //优先序列
};
/*------------------------------------------*/
/*输入函数*/
/*------------------------------------------*/
void input(int *a,int n)
{
for(int i=0;i<n;i++){cin>>*a;a++;}
}
/*------------------------------------------*/
/*输出函数*/
/*------------------------------------------*/
void output(int *a,int n)
{
for(int i=0;i<n;i++){cout<<*a<<'\t';a++;}
cout<<'\n';
}
/*------------------------------------------*/
/*算法fifo && LRU函数*/
/*------------------------------------------*/
void fifo(int*vp_list,int*bs,int n,int m)
{
pt ptlist[N];//定义结构数组
int k=0,flag,cn=0,i,j;//cn——统计缺页数
for(j=0;j<m;j++)//赋初值
{
bs[j]=0;
}
for(i=0;i<n;i++)// 訪问序列循环
{
flag=0;
for(j=0;j<m;j++)
if(vp_list[i]==bs[j]){flag=1;break;}
if(flag==1)//命中
{
ptlist[i].bno =j+1;
ptlist[i].flag =1;
ptlist[i].pno =vp_list[i];
}
else{
ptlist[i].flag =0;
ptlist[i].pno =vp_list[i];
bs[k]=vp_list[i];
ptlist[i].bno =k+1;
k=(k+1)%m;//取模——循环队列
cn++;
}
}
cout<<"FIFO算法:\n";
cout<<"----------------------------------**\n";
cout<<"缺页率为:"<<'\t'<<(float)cn/n<<'\n';
cout<<"-------------------------------------------------------------------**\n";
cout<<"序列号\n";
cout<<"-------------------------------------------------------------------**\n";
for(i=0;i<m;i++)
{
cout<<vp_list[i]<<"\t缺页!\t"<<"直接存入内存块!\n";
cout<<"-------------------------------------------------------------------**\n";
}
for(i=m;i<n;i++)
{
if(ptlist[i].flag ==0)
cout<<vp_list[i]<<"\t缺页!\t"<<"调出------块号为"<<ptlist[i].bno <<"--页号为"<<ptlist[i].pno <<'\n';
else cout<<vp_list[i]<<"\t命中!"<<"\t位置------块号为"<<ptlist[i].bno <<"--页号为"<<ptlist[i].pno <<'\n';;
cout<<"-------------------------------------------------------------------**\n";
}
}
void LRU(int*vp_list,int*bs,int n,int m)
{
//----------------------------------------------------------------------------------------------**
pt ptlist_LRU[N];
int k=0,flag,cn=0,i,j;//cn——统计缺页数
int com;
for(j=0;j<m;j++)//赋初值
{
bs[j]=0;
}
for(j=0;j<n;j++)ptlist_LRU[j].order =0;
for(i=0;i<n;i++)// 訪问序列循环
{
flag=0;
for(j=0;j<m;j++)
if(vp_list[i]==bs[j]){flag=1;break;}
if(flag==1)//命中
{
ptlist_LRU[i].bno =j+1;
ptlist_LRU[i].flag =1;
ptlist_LRU[i].pno =vp_list[i];
ptlist_LRU[i].order--;
com=ptlist_LRU[i].order;
for(j=0;j<m;j++)
if(ptlist_LRU[j].order <com)
{com=ptlist_LRU[j].order;k=ptlist_LRU[j].bno ;}
}
else{
ptlist_LRU[i].flag =0;
ptlist_LRU[i].pno =vp_list[i];
bs[k]=vp_list[i];
ptlist_LRU[i].bno =k+1;
if(i<m)k=(k+1)%m;
cn++;
}
}
cout<<"LRU*算法:\n";
cout<<"----------------------------------**\n";
cout<<"缺页率为:"<<'\t'<<(float)cn/n<<'\n';
cout<<"-------------------------------------------------------------------**\n";
cout<<"序列号\n";
cout<<"-------------------------------------------------------------------**\n";
for(i=0;i<m;i++)
{
cout<<vp_list[i]<<"\t缺页!\t"<<"直接存入内存块!\n";
cout<<"-------------------------------------------------------------------**\n";
}
for(i=m;i<n;i++)
{
if(ptlist_LRU[i].flag ==0)
cout<<vp_list[i]<<"\t缺页!\t"<<"调出------块号为"<<ptlist_LRU[i].bno <<"--页号为"<<ptlist_LRU[i].pno <<'\n';
else cout<<vp_list[i]<<"\t命中!"<<"\t位置------块号为"<<ptlist_LRU[i].bno <<"--页号为"<<ptlist_LRU[i].pno <<'\n';;
cout<<"-------------------------------------------------------------------**\n";
}
}
/*------------------------------------------*/
/*主函数*/
/*------------------------------------------*/
void main()
{
int vp_list[N],bs[M];//定义訪问序列数组和内存块表数组
int n,m,choose;
cout<<"输入序列个数:\n";
cin>>n;
cout<<"输入内存块大小:\n";
cin>>m;
cout<<"请输入訪问序列:\n";
input(vp_list,n);
cout<<"选FIFO算法输入1,选LRU*算法输入2:";
cin>>choose;
cout<<"訪问序列:"<<endl;
output(vp_list,n);
cout<<"**----------------------------------------**";
cout<<'\n';
if(choose==1)
fifo(vp_list,bs,n,m);//调用fifo函数
if(choose==2)
LRU(vp_list,bs,n,m);
}
结果演示:
虚存管理页面置换算法 — FIFO和RUL算法模拟实现的更多相关文章
- c模拟 页式管理页面置换算法之FIFO
写的操作系统作业.... 放上来给需要的小伙伴 需要注意的地方: 1.该算法只涉及单进程 2.只是用c模拟FIFO的思想 FIFO思想:选择在内存中存活时间最久的页面淘汰 关于该算法我的理解: 一个进 ...
- 页面置换算 - FIFO、LFU、LRU
缓存算法(页面置换算法)-FIFO.LFU.LRU 在前一篇文章中通过leetcode的一道题目了解了LRU算法的具体设计思路,下面继续来探讨一下另外两种常见的Cache算法:FIFO.LFU 1 ...
- vmstat---有关进程、虚存、页面交换空间及 CPU信息
虚拟内存运行原理 在系统中运行的每个进程都需要使用到内存,但不是每个进程都需要每时每刻使用系统分配的内存空间.当系统运行所需内存超过实际的物理内存,内核会释放某些进程所占用但未使用的部分或所有物理内存 ...
- Linux 虚存的性能问题
虚存子系统是所有 UNIX 系统的核心组件.下面讨论虚存系统的实现及其对操作系统中几乎其他所有子系统的作用和影响.首先详细说明一些基本的内存管理问题:然后具体分析 Linux 操作系统如何实施虚存管理 ...
- 先进先出算法(FIFO)——页面置换
原创 最近操作系统实习,写了先进先出算法(FIFO)的代码来实现页面置换. 题目阐述如下: 设计四:页面置换 设计目的: 加深对请求页式存储管理实现原理的理解,掌握页面置换算法. 设计内容: 设计一个 ...
- (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)
目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...
- 页面置换算法 - FIFO、LFU、LRU
缓存算法(页面置换算法)-FIFO. LFU. LRU 在前一篇文章中通过leetcode的一道题目了解了LRU算法的具体设计思路,下面继续来探讨一下另外两种常见的Cache算法:FIFO. LFU ...
- 操作系统的页面置换C++算法:OPT FIFO LRU CLOCK 计算缺页率
暴力直接上代码,主要是用了vector来实现,有些方法比較费时,不太好,请各位大神斧正.这是个人的作业, 这是代码下载页http://download.csdn.net/detail/l631068 ...
- 操作系统页面置换算法(opt,lru,fifo,clock)实现
选择调出页面的算法就称为页面置换算法.好的页面置换算法应有较低的页面更换频率,也就是说,应将以后不会再访问或者以后较长时间内不会再访问的页面先调出. 常见的置换算法有以下四种(以下来自操作系统课本). ...
随机推荐
- oracle查看锁表进程,杀掉锁表进程[转载]
select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, ...
- Web文件上传方法总结大全
1. 表单上传 这是传统的form表单上传,使用form表单的input[type=”file”]控件,可以打开系统的文件选择对话框,从而达到选择文件并上传的目的,它的好处是多浏览器兼容,它是web开 ...
- php info
http://www.cnblogs.com/xiaochaohuashengmi/archive/2010/08/12/1797753.html php pdo 相关 http://blog.cs ...
- css - Grid网格布局
.wrapper{ display: grid; grid-template-columns: 100px 100px 100px; grid-template-rows: 100px 100px 1 ...
- GDI+绘制五星红旗
五星红旗是由红色背景,加5个黄色五角星组成.绘制一个五星红旗的思路,就是先定义一个五角星的自定义控件,然后通过设置五角星的大小.位置.旋转角度等属性,组合成一个五星红旗. 五角星自定义控件代码: pu ...
- ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套
这是ElasticSearch 2.4 版本系列的第六篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...
- N!
求N! Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N ...
- 今天看到的一些js的用法
以下是今天学习到的一些js语法,特整理出来. 1. (10)["toString"]() === "10" // true 2.如何优雅的取整 var a = ...
- System.InvalidOperationException: 此实现不是 Windows 平台 FIPS 验证的加密算法的一部分。
x 昨天还好好地,然后清理一下电脑垃圾,就突然报这个错误了; 网上搜索了一下:找到解决方案了,但是由于底层知识的功力不够,至今未知具体怎么导致的... 解决方案↓ 进注册表 按Win+R运行reged ...
- {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器
Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...