设计四.docx
- 文档编号:26411024
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:20
- 大小:305.22KB
设计四.docx
《设计四.docx》由会员分享,可在线阅读,更多相关《设计四.docx(20页珍藏版)》请在冰豆网上搜索。
设计四
设计四:
设计任务:
请求页式管理是一种常用的虚拟存储管理技术。
本设计通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式管理的页面置换算法。
通过随机数产生一个指令序列,共320条指令。
指令的地址按下述原则生成:
①50%的指令是顺序执行的;
②25%的指令是均匀分布在前地址部分;
③25%的指令是均匀分布在后地址部分。
具体的实施方法是:
①在[0,319]的指令地址之间随机选取一起点m;
②顺序执行一条指令;
③在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m′;
④顺序执行一条指令,其地址为m′+1;
⑤在后地址[m′+2,319]中随机选取一条指令并执行;
⑥重复上述步骤②~⑤,直到执行320次指令。
将指令序列变换成为页地址流
设:
①页面大小为1K;
②用户内存容量为4页到32页;
③用户虚存容量为32K。
在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:
第0条~第9条指令为第0页(对应虚存地址为[0,9]);
第10条~第19条指令为第1页(对应虚存地址为[10,19]);
┇
┇
第310条~第319条指令为第31页(对应虚存地址为[310,319])。
按以上方式,用户指令可组成32页。
计算并输出下述各种算法在不同内存容量下的命中率。
先进先出的算法(FIFO);
最近最少使用算法(LRR);
最少访问页面算法(LFR);
最近最不经常使用算法(NUR)。
一程序清单
attemper.cpp
列出四个页面置换算法的函数
voidfifo(intindex)//先进先出
{
inti;
for(i=0;i<=page_used1-1;i++)
{
if((index/10)==page1[i])//计算所在页面,并查询是否击中
break;
}
cout<<"\t\t"< if(i<=page_used1-1)//击中 { hit1++; cout<<"\t\thit"; } else{//不击中 cout<<"\t\t"; if(page_used1 { page_used1++;//使用的物理页面数加1 } else{//物理页面已满 for(i=0;i { page1[i]=page1[i+1]; } } page1[page_used1-1]=index/10;//加入最新页面 } } voidlrr(intindex)//最近最少使用 { inti; inttemp; for(i=0;i<=page_used2-1;i++) { if((index/10)==page2[i])//计算所在页面,并查询是否击中 break; } if(i<=page_used2-1)//击中 { hit2++; cout<<"\thit"; temp=page2[i];//记下这一次访问的页面 for(intj=i;j { page2[j]=page2[j+1]; } page2[page_used2-1]=temp; } else{//不击中 cout<<"\t"; if(page_used2 { page_used2++;//使用的物理页面数加1 } else{ //弹出最尾的页面即page[0]记录的页面 for(i=0;i { page2[i]=page2[i+1]; } } page2[page_used2-1]=index/10;//加入最新该次需要调入的页面 } } //每次替换页面时,找到访问次数最少的页面所在的物理页面,写入新的页面号 voidlfr(intindex) { inti; for(i=0;i<=page_used3-1;i++) { if((index/10)==page3[i].page)//计算所在页面,并查询是否击中 break; } if(i<=page_used3-1)//击中 { hit3++; cout<<"\thit"; page3[i].r++;//击中页面的访问次数加1 if(i==min_page)//刚好击中最少访问页面 { min++; //遍历使用的物理页面,找出新的最少访问次数和页面所在 for(intj=0;j<=page_used3-1;j++) { if(page3[j].r<=min) { min=page3[j].r;//记录最新的最少访问次数 min_page=j;//记录最新的最少访问次数的页面所在的物理页面 } } } } else{//nothit cout<<"\t"; if(page_used3 { page_used3++; page3[page_used3-1].page=index/10; page3[page_used3-1].r=1; if(min>1)//如果之前的最少访问次数大于1 { min_page=page_used3-1;//修改最少访问页面号 } } else{//min_page不变,因为调入的新页访问次数为1,一定是最少的 page3[min_page].page=index/10; page3[min_page].r=1; } min=1;//最少访问次数改为1 } } voidnru(intindex)//最近最不经常使用算法,只考虑R位,因为执行指令是一个访问页面过程 { inti; if((count+1)%dida==0)//每条指令就对所有物理页面存的虚拟页面的R位清0 { for(i=0;i<=page_used4-1;i++) { page4[i].r=0; } } for(i=0;i<=page_used4-1;i++)//是否击中 { if((index/10)==page4[i].page) break; } if(i<=page_used4-1)//击中 { hit4++; cout<<"\thit"; page4[i].r=1; } else{//不击中 cout<<"\t"; if(page_used4 { page_used4++; page4[page_used4-1].page=index/10; page4[page_used4-1].r=1; } else{ for(intj=0;j { if(page4[j].r==0)//找到第一个R位为0的页面 { break; } } if(j<=page_used4-1)//在找到的第一个R位为0所在的物理页面写入新的虚拟页面,R位重置为1 { page4[j].page=index/10; page4[j].r=1; } else{//如果没有R位为0的页面,则置换最尾的页面 page4[0].page=index/10; page4[0].r=1; } } } cout< } 二数据定义 //forlfr,andnru //作为LFR算法时r表示页面访问的次数,在NRU算法中r表示R位,即最近一个滴答是否有访问 typedefstruct{ intpage;//虚拟页面号 intr; }Page; staticintdic[320];//320条指令 staticintcount=0;//执行的指令条数 intpage_used1=0;//记录第一种算法中已经使用的物理页面 intpage_used2=0;//记录第二种算法中已经使用的物理页面 intpage_used3=0;//记录第三种算法中已经使用的物理页面 intpage_used4=0;//记录第四种算法中已经使用的物理页面 inthit1=0;//采用第一种算法是击中的次数 inthit2=0;//采用第二种算法是击中的次数 inthit3=0;//采用第三种算法是击中的次数 inthit4=0;//采用第四种算法是击中的次数 //pagei指针储存物理页面里存放的虚拟页面号,大小为用户的物理页面数 int*page1; int*page2; Page*page3; intmin_page=0;//最少访问次数的页面所在的物理页面 intmin=1;//最少访问次数 Page*page4; 三程序流程 1主流程 2FIFO算法流程 3lrr(最近最少使用)算法 4lfr(访问次数最少)算法 5nru(最近最不经常使用)算法 三运行结果 注: index表示指令的索引,即这是第几条指令; Op表示指令的内容,即该指令执行什么操作,用随机数模拟; Page表示指令所在的页面; 各页面置换算法下hit表示该次指令击中。 1页面为4 2页面为8 3页面为16 4页面为32 实验两次,结果如下 四心得体会 对请求页面管理技术有了深一步理解。 通过对页面调度算法的模拟,认识了页面调度算法的执行过程,并通过实验数据了解到各种算法有不同物理页面下的击中率。 体验到用算法来模拟真实系统的直观,当然只有对真实的布面调度算法有正确的理解才能得出正确的模拟算法。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计