页面置换算法实验报告_页面替换算法实验报告
页面置换算法实验报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“页面替换算法实验报告”。
计算机体系结构
实验报告
班级:计科姓名:张华敏学号:
0902班
0909090814
FIFU算法
一,实验内容:
编写一段程序来模拟页面置换算法中的FIFU算法的实现 二,算法设计:
设置一个产生随机数的函数rand()产生随机数来模拟程序所需访问的页面的标号,如果页面需要被访问则把页面中的一个标志位设为in表示他已经被调入内存,如果再次需要访问此页面是只需检查此页面的标志位是否为in就可判断它是否已经存在在内存中了,如果已经存在则可直接使用,如果不存在则需调入,在调入新页面是先检查内存空间是否已满,如果未满则直接调入,如果已经满了则需选择一个页面将其调出,调出时就把页面的标志位设为out。选择页面的规则是:将进入内存时间最久的页面调出去,为了达到这一目的,在页面中设置一个计数器,每当有新页面调入内存时则将内存中已经存在的页面计数器自动加一,调出页面时就选择那个计数器最大值的页面,调出后重新将计数器设为零。三,遇到的问题及解决方案:
在做此实验时遇到了一些小问题,如在C语言中函数名定义为export()则会报错。在调用有返回值的函数是如果直接int s=use(pag)则会运行出错,要先分开写如:int s,s=use(pag).四,源代码 头文件.cpp #include #include
int t;//全局变量,用来盛放rand()函数产生的随机数
enum boolean{in,out};//定义一个枚举类型 /////////如果把in,out换成 true,false则会处错误
typedef struct { int num;//页面编号 char content;//页面内容
enum boolean flog;//判断此页面是否页调入,调入为true,否则为false;int count;//页面计数器
int usebit;//使用位,被使用过值为1,否则为0 }page;
FIFU.cpp #include #include #include #include“头文件.cpp”
int capacity=3;//设置内存最多可以容纳的页面数
void initialize(page p[])//初始化页面函数 { for(int i=0;i
int use(page p[]){ t=rand()%5;//产生一个0-5的随机数,if(p[t].flog==in){ printf(“tt%d页面命中n”,t);//for(int i=0;i
void import(page p[])//调入页面的函数 { /* int t=rand()%5;//产生一个0-5的随机数,if(p[t].flog==in)printf(“tt%d页面命中n”,t);*/ // if(p[t].flog==out)//如果此页面未被调入内存则立即调入 p[t].flog=in;capacity--;//调入后内存空间减少一叶
for(int i=0;i
void port(page p[])//调出页面的函数,,,,,,,,,,,如果函数名定义为export则处错误 { int x=0,y;//x用来暂时存放计数器 中的最大值,y存放此页面的页面号 for(int i=0;ix){ x=p[i].count;y=i;} }
p[y].flog=out;//修改调入符号 p[y].count=0;capacity++;//调入后内存空间增加一叶 printf(“ttt页面%d被调出内存n”,y);}
main(){ int s;long t3,t1,t2;page pag[5];//定义五个页面,,,,,,,,,,,如果这个定义在子函数之前那么不用通过参数 子函数便可以直接访问 t3=time(NULL);initialize(pag);do { t1=time(NULL);s=use(pag);//,,,,,,,,,,,,,,如果这里写成int s=use(pag)则会运行出错
//printf(“s=%d capacity=%dn”,s,capacity);if(capacity>0&&s==0)import(pag);else { if(capacity==0&&s==0){ port(pag);import(pag);} } t2=time(NULL);while(t2-t1
五,测试结果:
LFU算法
一,实验内容:
编写一段程序来模拟页面置换算法中的LFU算法的实现 二,算法设计:
设置一个产生随机数的函数rand()产生随机数来模拟程序所需访问的页面的标号,如果页面需要被访问则把页面中的一个标志位设为in表示他已经被调入内存,如果再次需要访问此页面是只需检查此页面的标志位是否为in就可判断它是否已经存在在内存中了,如果已经存在则可直接使用,如果不存在则需调入,在调入新页面是先检查内存空间是否已满,如果未满则直接调入,如果已经满了则需选择一个页面将其调出,调出时就把页面的标志位设为out。选择页面的规则是:将最近一段时间未被访问过的页面调出。为了达到这一目的在页面中设置一个标志位,如果页面在近期只要被访问过则将该标志位设置为1(默认为0),在选择调出页面时只需将标志位为0的页面调出即可。三,遇到的问题及解决方案: 未遇到什么问题
四,实验感悟:
遇到问题后上网查资料和有效,及时查不到自己想要的但是也可从相关结果中获得启发给自己灵感来想到解决问题的方法.四,源代码
FLU.cpp #include #include #include #include“头文件.cpp”
int capacity=3;
//设置内存最多可以容纳的页面数
void initialize(page p[])
//初始化页面函数
{
for(int i=0;i
//初始化页面,页面内容分别为小写字母 abcde,计数器全部为0
{p[i].num=i;
p[i].content=i+97;
p[i].flog=out;
p[i].count=0;
p[i].usebit=0;
}
}
int use(page p[]){
t=rand()%5;
//产生一个0-5的随机数,if(p[t].flog==in)
{
printf(“tt%d页面命中n”,t);
p[t].usebit=1;
//for(int i=0;i
//
{
//
if(p[i].flog==in)
//
p[i].count++;
//
}
return(1);
}
else
return(0);
}
void import(page p[])//调入页面的函数
{
int t=rand()%5;
//产生一个0-5的随机数,//if(p[t].flog==in)
// {
//
printf(“tt%d页面命中n”,t);
//
p[t].usebit=1;
// }
// if(p[t].flog==out)
//如果此页面未被调入内存则立即调入
p[t].flog=in;
capacity--;
//调入后内存空间减少一叶
for(int i=0;i
{
if(p[i].flog==in&&p[i].num!=t)
p[i].count++;
}
printf(“页面%d被调入内存n”,t);
}
void port(page p[])
//调出页面的函数
////////////////////////////////如果函数名定义为export则处错误
{
int x=0,y;//x用来暂时存放计数器 中的最大值,y存放此页面的页面号
int z=-1;
//用来判断近期是否有未被访问过的页面
int g=0;
for(int i=0;i
{
if(p[i].count>x)
{
x=p[i].count;
y=i;
}
}
for(int i=0;i
{
if(p[i].flog==in&&p[i].usebit==0)
{
z=i;
g++;
}
}
if(z==-1||g==3)//如果所有页面均为1则按照FIFO算法置换页面 //如果g=3则表明页面使用位全为零,此时也按照FIFO算法置换页面
{
p[y].flog=out;//修改调入符号
p[y].count=0;
capacity++;
//调入后内存空间增加一叶
p[y].usebit=0;
for(int i=0;i
p[i].usebit=0;
printf(“ttt页面%d被调出内存n”,y);
}
else
//如果有页面为0则将此页面置换出来
{
p[z].flog=out;//修改调入符号
p[z].count=0;
capacity++;
//调入后内存空间增加一叶
printf(“ttt页面%d被调出内存n”,z);
}
}
main(){
int s;
long t3,t1,t2;
page pag[5];//定义五个页面
///////////////////如果这个定义在子函数之前那么不用通过参数 子函数便可以直接访问
t3=time(NULL);
initialize(pag);
do
{
t1=time(NULL);
s=use(pag);
if(capacity>0&&s==0)
import(pag);
else
{
if(capacity==0&&s==0)
{
port(pag);
import(pag);
}
}
t2=time(NULL);
while(t2-t1
{
t2=time(NULL);
}
}while(t2-t3
system(“pause”);}
六,实验结果
总结
通过本次试验我对各种页面置换算法有了更深入的了解,也使得自己认识到平常学习到某些东西觉得懂了会了可是一旦实际动手操作起来就会发现总会存在这样或者那样的错误,只有多动手实际操作才会发现不足发现错误并且改正。查漏补缺提高自己的实际动手能力。