常用页面置换算法模拟实验.docx
《常用页面置换算法模拟实验.docx》由会员分享,可在线阅读,更多相关《常用页面置换算法模拟实验.docx(13页珍藏版)》请在冰豆网上搜索。
常用页面置换算法模拟实验
操作系统课程实验报告
实验地点
实验时间
实验课表现
出勤和个人表现Q1(15+15(组长评分)=30分)
得分:
实验
总分
(Q1+Q2+Q3+Q4)
实验完成情况Q2(45分(组长与教师评分的加权平均))
得分:
实验编号与实验名称:
第7次实验常用页面置换算法模拟实验
实验目的:
1.实验目的
通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。
实验内容及要求(详见实验讲义与实验指导书):
2.实验要求:
1)要求用你熟悉的程序设计语言编写和调试一个页面置换模拟程序;要求在主函数中测试。
2)实验报告中必须包括:
设计思想、数据定义(包括详细说明)、处理流程(详细算法描述和算法流程图)、源代码、运行结果、体会等部分。
3)必须模拟本实验内容中提到的算法中的至少2种页面置换算法。
4)比较不同页面置换算法的效率
3.实验内容
编写一个程序,使用以下页面置换算法中的某2种分别模拟一个分页系统,并统计同一个页面访问序列情况下不同页面置换算法引发的缺页中断次数。
1、第二次机会算法(SecondChance)
2、最近最少使用算法(LeastRecentlyUsed,LRU)
3、最不常用算法(NotFrequentlyUsed,NFU)
4、最近未使用算法(NotRecentlyUsed,NRU)
5、时钟页面置换算法
6、老化算法(aging)
页框的数量固定为4,虚拟页面数为8。
实验输入为访问页面序列,比如0,1,3,2,7,1
实验用到的软件(:
)
C-Free5
实验内容及关键步骤(代码)Q3(15分)
得分:
流程图:
代码:
#include
#include
#include
#definepage_frame_number4//页框数
#definevirtual_page_number8//虚拟页面数
intpage_id,counter=0;//输入id和计数器
charalgorithm[20];//算法选择
intpage_interrupt_number=0;
structPage_table{
intpage_id;//页号
intload_time;//装入时间
intlast_visit_time;//最后访问时间
}page_table[page_frame_number];
intcmp(constvoid*p,constvoid*q){
intc=(*(structPage_table*)p).load_time-(*(structPage_table*)q).load_time;
if(c>0)
return1;
else
return-1;
}
intcmp1(constvoid*p,constvoid*q){
intc=(*(structPage_table*)p).last_visit_time-(*(structPage_table*)q).last_visit_time;
if(c>0)
return1;
else
return-1;
}
voidinit(){//初始化
inti;
for(i=0;ipage_table[i].page_id=-1;
page_table[i].load_time=-1;
page_table[i].last_visit_time=-1;
}
}
voidprint(intx){//打印信息
inti,j;
switch(x){
case0:
for(i=0;i<80;i++)
printf("-");
printf("\t\t试验七常用页面置换算法模拟实验\n");
for(i=0;i<80;i++)
printf("-");
printf("\n");
printf("选择算法:
F/L(FIFO算法/LRU算法)\n");break;
case1:
printf("请输入访问页面的顺序,以“-1”结束:
\n");break;
case2:
printf("页表信息:
\n页号页框号装入时间最近访问时间\n");
for(j=0;jprintf("%4d%8d%7d%7d\n",page_table[j].page_id,j,page_table[j].load_time,page_table[j].last_visit_time);
};break;
case3:
for(i=0;i<80;i++)
printf("-");
printf("\t\tFIFO算法模拟过程\n");
for(i=0;i<80;i++)
printf("-");
printf("\n");break;
case4:
for(i=0;i<80;i++)
printf("-");
printf("\t\tLRU算法模拟过程\n");
for(i=0;i<80;i++)
printf("-");
printf("\n");
}
}
intjudge(){
inti;
for(i=0;iif(page_table[i].page_id==-1||page_table[i].page_id==page_id)
returni;
}
return-1;
}
voidfifo(){
intj;
print(3);
print
(1);
while
(1){
scanf("%d",&page_id);
if(page_id==-1)
break;
j=judge();
if(j==-1){
qsort(page_table,page_frame_number,sizeof(structPage_table),cmp);//按照最后访问时间从小到大排序
page_table[0].page_id=page_id;
page_table[0].load_time=counter;
page_table[0].last_visit_time=counter;
page_interrupt_number++;
}
else{
if(page_table[j].page_id==-1){
page_table[j].page_id=page_id;
page_table[j].load_time=counter;
page_table[j].last_visit_time=counter;
page_interrupt_number++;
}
else{
page_table[j].last_visit_time=counter;
}
}
counter++;
print
(2);
}
printf("缺页中断次数:
%d\n",page_interrupt_number);
}
voidlru(){
intj;
print(4);
print
(1);
while
(1){
scanf("%d",&page_id);
if(page_id==-1)
break;
j=judge();
if(j==-1){
qsort(page_table,page_frame_number,sizeof(structPage_table),cmp1);//按照装入时间从小到大排序
page_table[0].page_id=page_id;
page_table[0].load_time=counter;
page_table[0].last_visit_time=counter;
page_interrupt_number++;
}
else{
if(page_table[j].page_id==-1){
page_table[j].page_id=page_id;
page_table[j].load_time=counter;
page_table[j].last_visit_time=counter;
page_interrupt_number++;
}
else{
page_table[j].last_visit_time=counter;
}
}
counter++;
print
(2);
}
printf("缺页中断次数:
%d\n",page_interrupt_number);
}
intmain(){
print(0);
init();
while
(1){
scanf("%s",algorithm);
if(strcmp(algorithm,"F")==0||strcmp(algorithm,"L")==0)
break;
else
printf("输入出错,请重新输入\n");
}
if(strcmp(algorithm,"F")==0){
fifo();
}
else{
lru();
}
system("pause");
return0;
}
FIFO算法运行结果
LRU算法运行结果
实验过程中遇到的问题解决办法与实验体会Q4(需手写,10分)
得分:
这次实验让我了解了内存页面置换的几种算法,通过代码,让我更加深刻了了解了fifo,lru,算法的核心思想。
对于其他页面替换算法,也有初步的学习理解。
评阅教师特殊评语:
评阅教师:
日期: