实验内容

使用数组存储一组页面请求,页面请求的数量要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%。

根据上述结果可知,影响缺页中断率的因素有:①分配给作业的主存块数;②页面大小;③程序编制方法;④页面调度算法选用的不同。

南京邮电大学操作系统实验三:虚拟内存页面置换算法相关推荐

  1. 南京邮电大学操作系统——实验三:页面置换算法

    文章目录 实验内容 实验源码 实验结果 结果分析 实验内容 理解请求分页式虚拟存储管理方案中的页面置换算法,理解缺页中断率的概念并可以进行正确地统计.具体要求如下: 使用数组存储一组页面请求,页面请求 ...

  2. 【操作系统实验】FIFO页面置换算法

    一.实验描述 二.实验程序 #include<stdio.h> void main() {int i,j,k=0;char cc[13];//Y表示发生缺页中断,N表示未发生int a[1 ...

  3. 操作系统课设之虚拟内存页面置换算法的模拟与实现

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

  4. 操作系统实验八:页面置换模拟程序设计

    一.实验目的 1.通过软件模拟页面置换过程,加深对请求页式存储管理实现原理的理解 2.理解和掌握OPT.FIFO和LRU三种页面置换算法,深入分析三者之间的优缺点. 二.实验环境 硬件环境:计算机一台 ...

  5. 南京邮电大学c语言实验报告3v2,南京邮电大学操作系统实验报告

    <南京邮电大学操作系统实验报告>由会员分享,可在线阅读,更多相关<南京邮电大学操作系统实验报告(20页珍藏版)>请在人人文库网上搜索. 1.通信与信息工程学院2015 / 20 ...

  6. C++实现虚拟内存页面置换算法(FIFO, OPT, LRU)

    虚拟内存页面置换算法(FIFO, OPT, LRU) 0x01 FIFO 置换策略:置换掉先来的页面(FIFO队列首元素) 优点: 简单易理解且易实现 缺点: 性能不理想,会发生Belady异常(页框 ...

  7. 操作系统原理:全局页面置换算法、工作集页置换、常驻集页置换、抖动问题

    程序在运行过程中具有阶段性,可能刚开始的时候需要访问的内存很多,之后访问的内存可能会很少.如果操作系统给每个程序分配固定的物理页那么就显得不灵活,有没有办法动态地给程序分配页帧呢,在需要访问很多内存的 ...

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

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

  9. 【操作系统】FIFO先进先出页面置换算法(C语言实现)

    FIFO页面置换算法,计算缺页率,文末附代码,及例题解析 1.内容 在地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断.当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系 ...

最新文章

  1. Linux下清空用户登录记录和命令历史的方法
  2. 【开发环境】Windows 安装 PyCharm 开发环境 ( 下载 PyCharm | 安装 PyCharm | 在 PyCharm 中创建 Python 工程 )
  3. 手机做条码扫描传给电脑_有线和无线扫描枪常用测试工具和软件你知道哪些?...
  4. python 基于UDP协议的socket 报错:WinError 10022 提供了一个无效的参数(原因:服务端没有绑定ip)
  5. HDU5196--DZY Loves Inversions 树状数组 逆序数
  6. 华为摄像机搜索软件_别人的终点华为的起点!用普惠AI守护城市安全
  7. 【Java】设计模式在Gourmet咖啡系统中的应用
  8. flex的enter_frame事件详解
  9. [20150913]文件检查点_热备份.txt
  10. Cost Function of Support Vector Machine
  11. 手机app测试流程和要点
  12. C# WPF仿360安全卫士11
  13. HDU6441 Find Integer(2018CCPC网络赛,费马大定理)
  14. 解决h5兼容ios手机浏览器下载本地文件直接打开问题。
  15. 八块腹肌是如何练成的?入门减脂训练加饮食计划
  16. QEMU-KVM 安装方法
  17. 中高级Java开发应该要了解!我用2个月的时间破茧成蝶,醍醐灌顶!
  18. XJTU第十三周大计基编程作业
  19. python模拟输入文本内容(打破复制粘贴限制)
  20. JAVA生成九宫格图片 微信群头像(不限制张数)拿走即可用

热门文章

  1. “任务管理器已被管理员禁用”解决方案
  2. 国产数据库技术发展的探索与思考
  3. vb.net 解压缩(文件/文件夹解压缩,zip文件浏览,单文件解压,分卷压缩)
  4. 王道考研——操作系统(第二章 进程管理)(进程的同步,进程的互斥,管程)
  5. android url格式校验,Android URL Scheme的学习和使用
  6. 为什么IE浏览器的反应总感觉比其他内核浏览器的要迟钝一些
  7. 分享66个ASP贺卡图片源码,总有一款适合您
  8. Matlab医学图像分割区域生长
  9. canvas绘制星座(黄道十二宫)
  10. CF 546 div.2 D. Nastya Is Buying Lunch(思维+贪心)