南京邮电大学操作系统实验三:虚拟内存页面置换算法
实验内容
使用数组存储一组页面请求,页面请求的数量要50个以上,访问的页面号可以用随机数生成(0~20):
(1)设置为分配给进程的页框数(假定是5),使用LRU算法,模拟完成全部的页面请求,最后输出总共发生了多少次缺页;重新设置页框为10,模拟过程,完成输出,观察页框数量对缺页中断率的影响;
(2)在相同页框的情况下,使用FIFO算法模拟全部的页面请求,以此来比对FIFO和LRU之间的差别。
FIFO算法:先进先出算法,优先淘汰最早进入内存的页面,亦即在内存中驻留时间最久的页面。
LRU算法:最近最少使用页面替换算法,利用局部性原理,根据一个作业在执行过程中过去的页面访问历史来推测未来的行为。它认为过去一段时间里不曾被访问过的页面,在最近的将来可能也不会再被访问。所以,这种算法的实质是:当需要淘汰一个页面时,总是选择在最近一段时间内最久不用的页面予以淘汰。
具体代码如下:
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<iomanip>
using namespace std;
int GetDistance(int currentPageID,int page);//按照页面编号获取在物理块内的页面最久未使用的时间
class BLOCK
{
public:int blockNum; //物理块总数int pageNum; //物理块中的页面数量 int *pageID; //页面号(大小为blockNum)int *stayTime; //页面在物理块中的停留时间(与物理块ID对应)BLOCK(int num){int i;pageNum=0;blockNum=num;pageID=new int[num];stayTime=new int[num];for(i=0;i<num;i++){pageID[i]=-1; //初始化每个物理块中没有放置,页面号表示为-1stayTime[i]=0; //初始化停留时间为0}}void Init(){int i;int num=blockNum;pageNum=0;pageID=new int[num];stayTime=new int[num];for(i=0;i<num;i++){pageID[i]=-1; //初始化每个物理块中没有放置,页面号表示为-1stayTime[i]=0; //初始化停留时间为0}}void ShowPage(){int i;for(i=0;i<blockNum;i++)cout<<"Page["<<i<<"]: "<<pageID[i]<<endl;}void ShowStayTime(){int i;for(i=0;i<blockNum;i++)cout<<"Stay["<<i<<"]: "<<stayTime[i]<<endl;}int GetLongestStay() //获取在物理块中停留时间最长的页面所在物理块号 {int i;int max_pos=0;for(i=0;i<pageNum;i++)if(stayTime[max_pos]<stayTime[i])max_pos=i;return max_pos;}int GetRencentNotUse(int currentPageID) //获取在物理块中最近最久未使用的页面编号 {//默认currentPageID一定大于等于BLOCKNUMint i;int DestID=0;for(i=0;i<blockNum;i++){if(GetDistance(currentPageID,pageID[i])>GetDistance(currentPageID,pageID[DestID]))DestID=i;}return DestID;}
}; //物理块数据结构定义//-----------------------全局变量-------------------------
int BLOCKNUM; //物理块数
int *PVS; //PageVisitSequence页面访问序列
int PVS_NUM; //页面访问序列长度
int **replaceTable; //页面置换表格(维度:BLOCKNUM*PVS_NUM)
int *replaceArray; //页面置换标志数组(大小为访问页面的次数,存储每次访问是否进行页面置换)
int *lackArray; //缺页中断标志数组(大小为访问页面的次数,存储每次访问是否存在缺页中断)
//-----------------------函数声明-------------------------
void showMenu(); //菜单显示
int InputAndInit(); //数据输入和变量初始化
void ReplaceFIFO(BLOCK block); //FIFO页面置换算法
int FindPage(int pageID,BLOCK block); //页面查找(按照页面编号在物理块中查找页面是否存在)
void ShowReplaceTable(); //置换表格输出
void ReplaceLRU(BLOCK block); //LRU页面置换算法
void InfoDisplay(); //初始化信息显示
int GetReplaceTimes(); //获取页面置换总次数
int GetLackTimes(); //获取缺页中断总次数
//-----------------------函数定义-------------------------
int main()
{int select;int i;cout<<"------请按提示输入算法模拟需要的数据------"<<endl;InputAndInit();BLOCK block(BLOCKNUM); //定义物理块 cout<<"信息初始化完成!"<<endl<<endl;showMenu();cout<<"------请输入要进行的操作------"<<endl;cin>>select;while(1){switch(select){case 1:InfoDisplay();cout<<endl;break;case 2:ReplaceFIFO(block);cout<<"|==> FIFO页面调度算法正在执行"<<endl;ShowReplaceTable();cout<<"页面置换次数为:"<<GetReplaceTimes()<<endl;cout<<"缺页中断次数为:"<<GetLackTimes()<<endl;cout<<"缺页率为:" << double(GetLackTimes()) / 50 * 100.00 << "%" << endl;cout<<endl;cout<<endl;break;case 3:ReplaceLRU(block);cout<<"|==> LRU页面调度算法正在执行"<<endl;ShowReplaceTable();cout<<"页面置换次数为:"<<GetReplaceTimes()<<endl;cout<<"缺页中断次数为:"<<GetLackTimes()<<endl;cout<<"缺页率为:" << double(GetLackTimes()) / 50 * 100.00 << "%" << endl;cout<<endl;cout<<endl;break;case 0:cout<<"欢迎下次使用"<<endl;return 0;default:cout<<"输入有误,请重新输入!"<<endl;cout<<endl;break; }//------防止页面置换和缺页次数计算错误------------- for(i=0;i<PVS_NUM;i++){replaceArray[i]=0; //页面置换标志数组初始化为0 lackArray[i]=0; //缺页中断标志数组初始化为0 } showMenu();cout<<"请输入要进行的操作(退出请输入0):"<<endl;cin>>select;}delete[] PVS;delete[] replaceArray;delete[] lackArray;for(i=0;i<BLOCKNUM;i++)delete[] replaceTable[i];delete[] replaceTable;return 0;
}
//----------------------FIFO页面置换算法--------------------------
void ReplaceFIFO(BLOCK block) //FIFO页面置换算法
{int i,j;for(i=0;i<BLOCKNUM;i++)for(j=0;j<PVS_NUM;j++)replaceTable[i][j]=0;block.Init();int replacePosition; //待置换位置 for(i=0;i<PVS_NUM;i++) //依次对页面访问序列的每一个页面PVS[i]进行操作{for(j=0;j<block.pageNum;j++)block.stayTime[j]++; //每循环一次,物理块(0~pageNum)停留时间自增 if(block.pageNum<block.blockNum){if(!FindPage(PVS[i],block)) //若页面PVS[i]不存在{lackArray[i]=1; //由于访问页面不存在造成页面中断 block.pageID[block.pageNum]=PVS[i];block.pageNum++;}}else //FIFO算法(置换停留时间最长的页面所在物理块位置) {if(!FindPage(PVS[i],block)) //若页面PVS[i]不存在{replaceArray[i]=1; //由于访问页面不存在且无空闲物理块造成页面置换lackArray[i]=1; //由于访问页面不存在造成页面中断 replacePosition=block.GetLongestStay();block.pageID[replacePosition]=PVS[i]; //选择停留时间最长的页面置换block.stayTime[replacePosition]=0; //置换后,该页面所在物理位置停留时间清零 }}for(j=0;j<BLOCKNUM;j++)replaceTable[j][i]=block.pageID[j]; //将访问一次页面后的结果存入数组中(replaceTable)}
}
int FindPage(int pageID,BLOCK block) //页面查找(按照页面编号在以存放页面的物理块(长度为pageNum)中查找页面是否存在)
{int i=0;for(i=0;i<block.pageNum;i++)if(block.pageID[i]==pageID)break;return !(i==block.pageNum); //若页面存在,则返回1,否则返回0
}
//----------------------LRU页面置换算法--------------------------
void ReplaceLRU(BLOCK block) //LRU页面置换算法
{int i,j;for(i=0;i<BLOCKNUM;i++)for(j=0;j<PVS_NUM;j++)replaceTable[i][j]=0;block.Init();int replacePosition; //待置换位置 for(i=0;i<PVS_NUM;i++) //依次对页面访问序列的每一个页面PVS[i]进行操作{for(j=0;j<block.pageNum;j++)block.stayTime[j]++; //每循环一次,物理块(0~pageNum)停留时间自增 if(block.pageNum<block.blockNum){if(!FindPage(PVS[i],block)) //若页面PVS[i]不存在{lackArray[i]=1; //由于访问页面不存在造成页面中断 block.pageID[block.pageNum]=PVS[i];block.pageNum++;}}else //FIFO算法(置换停留时间最长的页面所在物理块位置) {
// TODO:若页面已存在的情况(上述三条语句应该是页面不存在的情况,应加上if(页面在物理块中不存在)的判断) By_2018.06.15_16:11if(!FindPage(PVS[i],block)) //若页面PVS[i]不存在{replaceArray[i]=1; //由于访问页面不存在且无空闲物理块造成页面置换lackArray[i]=1; //由于访问页面不存在造成页面中断 replacePosition=block.GetRencentNotUse(i);block.pageID[replacePosition]=PVS[i]; //选择停留时间最长的页面置换block.stayTime[replacePosition]=0; //置换后,该页面所在物理位置停留时间清零 }}for(j=0;j<BLOCKNUM;j++)replaceTable[j][i]=block.pageID[j]; //将访问一次页面后的结果存入数组中(replaceTable)}
}
//----------------------OTHRES--------------------------
void showMenu() //菜单显示
{cout<<"\t\t|----------------------------MENU-------------------------------|"<<endl;cout<<"\t\t| 1. 初始化信息显示 |"<<endl;cout<<"\t\t| 2. FIFO页面置换算法 |"<<endl;cout<<"\t\t| 3. LRU页面置换算法 |"<<endl;cout<<"\t\t| 0. 退出程序 |"<<endl;cout<<"\t\t|---------------------------------------------------------------|"<<endl;
}
int InputAndInit() //数据输入和变量初始化
{int i=0;int j=0;int count = 0;int PVS_char[100];cout << "调入的页面按如下顺序(以0为结束标志):"<<endl;for(i=0;i<50;i++){PVS_char[i]=rand()%20+1;cout<<PVS_char[i]<<" ";count++;}cin>>PVS_char[50];getchar();cout<<endl;cout<<"请输入物理块数:";cin>>BLOCKNUM;while(PVS_char[50]!=0){i++;cin>>PVS_char[i];getchar();}PVS_NUM=i;PVS=new int[PVS_NUM];for(i=0;i<PVS_NUM;i++)PVS[i]=PVS_char[i];replaceArray=new int[PVS_NUM];lackArray=new int[PVS_NUM];for(i=0;i<PVS_NUM;i++){replaceArray[i]=0; //页面置换标志数组初始化为0 lackArray[i]=0; //缺页中断标志数组初始化为0 } replaceTable=new int*[BLOCKNUM]; //页面置换表初始化for(i=0;i<BLOCKNUM;i++)replaceTable[i]=new int[PVS_NUM];return count;
}
void ShowReplaceTable() //置换表格输出
{int i,j;cout<<"页面置换过程如下图所示"<<endl<<endl;cout<<"页面置换过程 "<<endl;for(i=0;i<BLOCKNUM;i++){for(j=0;j<PVS_NUM;j++){if(replaceTable[i][j]!=-1)cout<<"|"<<setw(2)<<replaceTable[i][j];else cout<<"|"<<setw(2)<<" "; //-1时代表该物理块无页面,不输出}cout<<"|"<<endl;}cout<<"页面置换标志 "<<endl;for(i=0;i<PVS_NUM;i++)cout<<" "<<setw(2)<<replaceArray[i];cout<<endl;cout<<"页面中断标志 "<<endl;cout.fill(' ');for(i=0;i<PVS_NUM;i++)cout<<" "<<setw(2)<<lackArray[i];cout<<endl<<endl;
}
int GetDistance(int currentPageID,int page) //按照页面编号获取在物理块内的页面最久未使用的时间(
{int distance=0;int i;for(i=currentPageID-1;i>=0;i--)if(PVS[i]!=page)distance++;else break;return distance;
}
void InfoDisplay() //初始化信息显示
{int i;cout<<"本页面置换模拟算法中: "<<endl;cout<<"物理块数为: "<<BLOCKNUM<<endl;cout<<"页面访问序列为:";for(i=0;i<PVS_NUM;i++)cout<<PVS[i]<<" ";cout<<endl;
}
int GetReplaceTimes() //获取页面置换总次数
{int sum=0;int i;for(i=0;i<PVS_NUM;i++)sum+=replaceArray[i];return sum;
}
int GetLackTimes() //获取页面中断总次数
{int sum=0;int i;for(i=0;i<PVS_NUM;i++)sum+=lackArray[i];return sum;
}
运行结果如下:
页框数为5时,FIFO算法缺页率为72%,LRU算法缺页率为76%
页框为3,FIFO算法缺页率为88%,LRU算法缺页率为88%。
页框为4 FIFO算法缺页率为82%,LRU算法缺页率为86%。
页框为6, FIFO算法缺页率为72%,LRU算法缺页率为76%。
页框数为9, FIFO算法缺页率为66%,LRU算法缺页率为62%。
页框数为10,FIFO算法缺页率为56%,LRU算法缺页率为52%。
根据上述结果可知,影响缺页中断率的因素有:①分配给作业的主存块数;②页面大小;③程序编制方法;④页面调度算法选用的不同。
南京邮电大学操作系统实验三:虚拟内存页面置换算法相关推荐
- 南京邮电大学操作系统——实验三:页面置换算法
文章目录 实验内容 实验源码 实验结果 结果分析 实验内容 理解请求分页式虚拟存储管理方案中的页面置换算法,理解缺页中断率的概念并可以进行正确地统计.具体要求如下: 使用数组存储一组页面请求,页面请求 ...
- 【操作系统实验】FIFO页面置换算法
一.实验描述 二.实验程序 #include<stdio.h> void main() {int i,j,k=0;char cc[13];//Y表示发生缺页中断,N表示未发生int a[1 ...
- 操作系统课设之虚拟内存页面置换算法的模拟与实现
前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...
- 操作系统实验八:页面置换模拟程序设计
一.实验目的 1.通过软件模拟页面置换过程,加深对请求页式存储管理实现原理的理解 2.理解和掌握OPT.FIFO和LRU三种页面置换算法,深入分析三者之间的优缺点. 二.实验环境 硬件环境:计算机一台 ...
- 南京邮电大学c语言实验报告3v2,南京邮电大学操作系统实验报告
<南京邮电大学操作系统实验报告>由会员分享,可在线阅读,更多相关<南京邮电大学操作系统实验报告(20页珍藏版)>请在人人文库网上搜索. 1.通信与信息工程学院2015 / 20 ...
- C++实现虚拟内存页面置换算法(FIFO, OPT, LRU)
虚拟内存页面置换算法(FIFO, OPT, LRU) 0x01 FIFO 置换策略:置换掉先来的页面(FIFO队列首元素) 优点: 简单易理解且易实现 缺点: 性能不理想,会发生Belady异常(页框 ...
- 操作系统原理:全局页面置换算法、工作集页置换、常驻集页置换、抖动问题
程序在运行过程中具有阶段性,可能刚开始的时候需要访问的内存很多,之后访问的内存可能会很少.如果操作系统给每个程序分配固定的物理页那么就显得不灵活,有没有办法动态地给程序分配页帧呢,在需要访问很多内存的 ...
- 三种页面置换算法(详解)
地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断.当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间.而 ...
- 【操作系统】FIFO先进先出页面置换算法(C语言实现)
FIFO页面置换算法,计算缺页率,文末附代码,及例题解析 1.内容 在地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断.当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系 ...
最新文章
- Linux下清空用户登录记录和命令历史的方法
- 【开发环境】Windows 安装 PyCharm 开发环境 ( 下载 PyCharm | 安装 PyCharm | 在 PyCharm 中创建 Python 工程 )
- 手机做条码扫描传给电脑_有线和无线扫描枪常用测试工具和软件你知道哪些?...
- python 基于UDP协议的socket 报错:WinError 10022 提供了一个无效的参数(原因:服务端没有绑定ip)
- HDU5196--DZY Loves Inversions 树状数组 逆序数
- 华为摄像机搜索软件_别人的终点华为的起点!用普惠AI守护城市安全
- 【Java】设计模式在Gourmet咖啡系统中的应用
- flex的enter_frame事件详解
- [20150913]文件检查点_热备份.txt
- Cost Function of Support Vector Machine
- 手机app测试流程和要点
- C# WPF仿360安全卫士11
- HDU6441 Find Integer(2018CCPC网络赛,费马大定理)
- 解决h5兼容ios手机浏览器下载本地文件直接打开问题。
- 八块腹肌是如何练成的?入门减脂训练加饮食计划
- QEMU-KVM 安装方法
- 中高级Java开发应该要了解!我用2个月的时间破茧成蝶,醍醐灌顶!
- XJTU第十三周大计基编程作业
- python模拟输入文本内容(打破复制粘贴限制)
- JAVA生成九宫格图片 微信群头像(不限制张数)拿走即可用
热门文章
- “任务管理器已被管理员禁用”解决方案
- 国产数据库技术发展的探索与思考
- vb.net 解压缩(文件/文件夹解压缩,zip文件浏览,单文件解压,分卷压缩)
- 王道考研——操作系统(第二章 进程管理)(进程的同步,进程的互斥,管程)
- android url格式校验,Android URL Scheme的学习和使用
- 为什么IE浏览器的反应总感觉比其他内核浏览器的要迟钝一些
- 分享66个ASP贺卡图片源码,总有一款适合您
- Matlab医学图像分割区域生长
- canvas绘制星座(黄道十二宫)
- CF 546 div.2 D. Nastya Is Buying Lunch(思维+贪心)