操作系统课程第七次实验报告
姓名
学号
系
计算机
任课教师
指导教师
评阅教师
实验地点
综合楼B102
实验时间
2012-9-26
实验课表现
出勤和个人表现Q1(15+15(组长评分)=30分)
得分:
实验
总分
(Q1+Q2+Q3+Q4)
实验完成情况Q2(45分(组长与教师评分的加权平均))
得分:
实验编号与实验名称:
实验七、常用页面置换算法模拟实验
实验目的:
通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。
实验内容及要求(详见实验讲义与实验指导书):
要求:
1)要求用你熟悉的程序设计语言编写和调试一个页面置换模拟程序;要求在主函数中测试。
2)实验报告中必须包括:设计思想、数据定义(包括详细说明)、处理流程(详细算法描述和算法流程图)、源代码、运行结果、体会等部分。
3)必须模拟本实验内容中提到的算法中的至少2种页面置换算法。
4)
比较不同页面置换算法的效率
内容:编写一个程序,使用以下页面置换算法中的某2种分别模拟一个分页系统,并统计同一个页面访问序列情况下不同页面置换算法引发的缺页中断次数。
1、第二次机会算法(Second
Chance)
2、最近最少使用算法(Least
Recently
Used,LRU)
3、最不常用算法(Not
Frequently
Used,NFU)
4、最近未使用算法(Not
Recently
Used,NRU)
5、时钟页面置换算法
6、老化算法(aging)
页框的数量固定为4,虚拟页面数为8。实验输入为访问页面序列,比如0,1,3,2,7,1
实验用到的软件(:)
DevC++,Visio
实验内容及关键步骤(代码)Q3(15分)
得分:
流程图:输入页面访问序列
取访问的页号
查页表
是否缺页?
是
置缺页标志flag为’*’
按算法不同淘汰一页面
调入所访问的页面
否
FIFO算法流程图
LRU算法流程图:
函数关系解释图:
实现结果:
图1
图2
代码:
#include
#include
#define
MEMORY_SIZE
/*物理块数*/
#define
PROESS_SIZE
/*页面号引用串个数*/#include
#include
/*全局变量*/
int
mSIZE=4;
int
pSIZE=8;
static
int
memery[4]={0};
/*物理块中的页号*/
static
int
page[8]={0};
/*页面号引用串*/
static
int
temp[8][4]={0};
/*辅助数组*/
/*置换算法函数*/
void
FIFO();
void
LRU();
void
OPT();
void
designBy();
/*辅助函数*/
void
print(unsigned
int
t);
/*主函数*/
int
main()
{
int
i,k,code;
designBy();
system(“color
0A“);
puts(“请依次输入页面号(8个):“);
for(i=0;i
scanf(“%1d“,&page[i]);
system(“cls“);
system(“color
0E“);
do{
puts(“输入的页面号引用串为:“);
for(k=0;k<=(pSIZE-1)/20;k++)
{
for(i=20*k;(i
{
if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1)))
printf(“%d\n“,page[i]);
else
printf(“%d
“,page[i]);
}
}
printf(“*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*\n“);
printf(“*
请选择页面置换算法:\t\t\t
*\n“);
printf(“*
-----------------------------------------
*\n“);
printf(“*
1.先进先出(FIFO)
2.最近最久未使用(LRU)
*\n“);
printf(“*
3.退出
*\n“);
printf(“*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*\n“);
printf(“请选择操作:[
]\b\b“);
scanf(“%d“,&code);
switch(code)
{
case
1:
FIFO();
break;
case
2:
LRU();
break;
case
3:
system(“cls“);
system(“color
0A“);
exit(0);
default:
printf(“输入错误,请重新输入:“);
}
printf(“按任意键重新选择置换算法:>>>“);
getch();
system(“cls“);
}while
(code!=3);
getch();
}
void
print(unsigned
int
t)
{
int
i,j,k,l;
int
flag;
for(k=0;k<=(pSIZE-1)/20;k++)
{
for(i=20*k;(i
{
if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1)))
printf(“%d\n“,page[i]);
else
printf(“%d
“,page[i]);
}
for(j=0;j { for(i=20*k;(i if(i>=j) printf(“ |%d|“,temp[i][j]); else printf(“ | |“); } for(i=mSIZE+20*k;(i { for(flag=0,l=0;l if(temp[i][l]==temp[i-1][l]) flag++; if(flag==mSIZE)/*页面在物理块中*/ printf(“ “); else printf(“ |%d|“,temp[i][j]); } /*每行显示20个*/ if(i%20==0) continue; printf(“\n“); } } printf(“----------------------------------------\n“); printf(“缺页次数:%d\t\t“,t+mSIZE); printf(“缺页率:%d/%d\n“,t+mSIZE,pSIZE); printf(“置换次数:%d\t\t“,t); printf(“访问命中率:%d%%\n“,(pSIZE-(t+mSIZE))*100/pSIZE); printf(“----------------------------------------\n“); } /*先进先出页面置换算法*/ void FIFO() { int memery[10]={0}; int time[10]={0}; /*记录进入物理块的时间*/ int i,j,k,m; int max=0; /*记录换出页*/ int count=0; /*记录置换次数*/ /*前mSIZE个数直接放入*/ for(i=0;i { memery[i]=page[i]; time[i]=i; for(j=0;j temp[i][j]=memery[j]; } for(i=mSIZE;i { /*判断新页面号是否在物理块中*/ for(j=0,k=0;j { if(memery[j]!=page[i]) k++; } if(k==mSIZE) /*如果不在物理块中*/ { count++; /*计算换出页*/ max=time[0]