整理页面置换算法OPT+FIFO+LRU+clock.docx
- 文档编号:6766825
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:12
- 大小:17.46KB
整理页面置换算法OPT+FIFO+LRU+clock.docx
《整理页面置换算法OPT+FIFO+LRU+clock.docx》由会员分享,可在线阅读,更多相关《整理页面置换算法OPT+FIFO+LRU+clock.docx(12页珍藏版)》请在冰豆网上搜索。
整理页面置换算法OPT+FIFO+LRU+clock
页面置换算法OPT+FIFO+LRU+clock
编辑整理:
尊敬的读者朋友们:
这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(页面置换算法OPT+FIFO+LRU+clock)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为页面置换算法OPT+FIFO+LRU+clock的全部内容。
#include
#include〈fstream〉
usingnamespacestd;
#defineBlockSize10
#definePageSize100
intpage[PageSize];//页面数组存放页面
intblock[BlockSize];//物理块数组
intresult[PageSize][BlockSize];//存放页面和物理块二维数组
intpSize=0;//用户使用页面数
intbSize=0;//用户使用物理块数
intblockFlag[BlockSize];//用于LRU与最佳置换算法中,辅助判断该换出的页面
intnoPageCount=0;//缺页次数
//输入数据
voidinputData()
{
cout〈〈endl〈〈"请输入物理块数(1<=bSize<=”< cin>>bSize; cout<〈"请输入页面数(1〈=pSize<="〈 cin〉〉pSize; while(bSize<=0||bSize〉BlockSize||pSize<=0||pSize〉PageSize){//判断用户输入是否在范围内 cout<〈"输入范围错误,请重新输入: ”〈 cout〈〈”请输入物理块数(1〈=F〈="〈 cin>>bSize; cout< cin>>pSize; } cout〈〈”请输入页面走向"〈 for(inti=0;i〈pSize;i++) cin〉>page[i]; } //初始化page数组 voidinitPage() { for(inti=0;i〈PageSize;i++) page[i]=-1; } //初始化block与result数组 voidinitBlockResult() { inti=0; for(i=0;i block[i]=-1; for(i=0;i〈PageSize;i++) for(intj=0;j〈BlockSize;j++) result[i][j]=-1; } //查找物理块中是否存在要调用的页面 intExist(inti) { for(intj=0;j〈bSize;j++) if(block[j]==i) returnj; return—1; } //显示结果 voiddisplay(intnoPageCount) { for(inti=0;i〈pSize;i++) { cout〈〈”"< for(intj=0;j〈bSize;j++) { if(result[i][j]==—1)break; elsecout〈〈'[’〈 } cout〈〈endl; } cout〈〈"____________________________________"〈 cout〈 "<〈noPageCount< cout<<”缺页率: ”<<((double)noPageCount/pSize)*100<<’%’〈〈endl; cout<<"===================================="< } //最佳置换算法OPT voidOPT() { inti=0,j=0; intposition=0,noPageCount=0; intpageFlag=0,resultFlag=0;//页面标记(下标)指向下一个页面,结果标记表示结果的行,即result数组的行标 for(i=0;i〈BlockSize;i++) blockFlag[i]=0; while(pageFlag { if(Exist(page[pageFlag])! =—1)//判断页面是否已经存在 resultFlag++; else { if(position {//若有则将页面放入空闲块 block[position]=page[pageFlag]; position++; noPageCount++; for(i=0;i〈position;i++) result[resultFlag][i]=block[i]; resultFlag++; } else{ for(i=0;i { for(j=pageFlag+1;j { if(block[i]==page[j]) { blockFlag[i]=j; break; } } if(j==pSize)blockFlag[i]=999; } intoptPos=0,max=blockFlag[0]; for(inti=0;i if(max { max=blockFlag[i]; optPos=i; } block[optPos]=page[pageFlag]; noPageCount++; for(i=0;i〈bSize;i++) result[resultFlag][i]=block[i]; resultFlag++; } } pageFlag++; } cout〈〈endl<<"最佳置换算法: "<〈endl; display(noPageCount); return; } //先进先出页面置换算法FIFO voidFIFO() { intblockFlag=0,pageFlag=0,resultFlag=0;//物理块标记,确定该换出的物理块下标 inti=0,j=0,noPageCount=0; intposition=0;//指示物理块,查找有无空闲 while(pageFlag〈pSize) { if(Exist(page[pageFlag])! =-1) resultFlag++; else { if(position { block[position]=page[pageFlag]; position++; noPageCount++; for(i=0;i<=position;i++) result[resultFlag][i]=block[i]; resultFlag++; } else { block[blockFlag]=page[pageFlag];//blockFlag指示要换出的页面 noPageCount++; for(i=0;i〈bSize;i++) result[resultFlag][i]=block[i]; resultFlag++; blockFlag++; blockFlag=blockFlag%bSize; } } pageFlag++; } cout〈〈endl〈<”先进先出页面置换算法FIFO: ”<〈endl; display(noPageCount); return; } //最近最久未用算法LRU voidLRU() { inti=0,noPageCount=0; intpageFlag=0,resultFlag=0,position=0; for(i=0;i〈BlockSize;i++)//初始化时间记录数组 blockFlag[i]=0; while(pageFlag { if(Exist(page[pageFlag])! =-1) {//判断页面是否已经在主存中 resultFlag++; blockFlag[Exist(page[pageFlag])]=0;//若在则将时间记录数组对应位置为0 } else { if(position〈bSize) { block[position]=page[pageFlag]; blockFlag[position]=0; position++; noPageCount++; for(i=0;i〈=position;i++) result[resultFlag][i]=block[i]; resultFlag++; } else { intlast=0,min=blockFlag[0]; for(inti=0;i〈bSize;i++) if(min { min=blockFlag[i]; last=i; } block[last]=page[pageFlag];//置换最久未用页面 blockFlag[last]=0; noPageCount++; for(i=0;i result[resultFlag][i]=block[i]; resultFlag++; } } for(i=0;i blockFlag[i]++; pageFlag++; } cout<〈endl<<"最近最久未用算法LRU: ”<〈endl; display(noPageCount); return; } //时钟(clock)置换算法 voidclock() { inti=0,position=0,noPageCount=0; boolboolBlockFlag[BlockSize]; intflag=0;//访问位循环标记 intpageFlag=0,resultFlag=0; while(pageFlag { if(Exist(page[pageFlag])! =-1) { resultFlag++; boolBlockFlag[Exist(page[pageFlag])]=true; } else { if(position { block[position]=page[pageFlag]; noPageCount++; boolBlockFlag[position]=true; position++; for(i=0;i〈position;i++) result[resultFlag][i]=block[i]; resultFlag++; } else { while(true) {//无限循环,找出访问位为false的页面 if(boolBlockFlag[flag]==false)break; boolBlockFlag[flag]=false;//若为true,置为false flag++; flag=flag%bSize; } block[flag]=page[pageFlag]; boolBlockFlag[flag]=true; flag++; flag=flag%bSize; noPageCount++; for(i=0;i result[resultFlag][i]=block[i]; resultFlag++; } } pageFlag++; } cout< ”〈 display(noPageCount); return; } intmain() { initPage(); intfunc; while(func! =5) { cout〈<”请选择所需要的功能: ”< cout<〈"0。 输入数据”〈 cout〈<"1。 最佳(optimal)置换算法"〈 cout<〈"2。 先进先出(FIFO)置换算法"< cout<<”3.最近最久未用(LRU)置换算法"〈 cout<<"4。 时钟(clock)置换算法"<〈endl; cout〈〈”5.退出”<〈endl; switch(func) { case0: inputData(); break; case1: initBlockResult(); OPT(); break; case2: initBlockResult(); FIFO(); break; case3: initBlockResult(); LRU(); break; case4: initBlockResult(); clock(); break; case5: break; } cout〈〈"请选择功能: "; cin>〉func; system("cls”); } return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 整理 页面 置换 算法 OPT FIFO LRU clock