操作系统课程设计页面置换算法
《操作系统》实验报告
实验题目:
班级: 学号: 姓名: 实验日期: 报告日期: 成绩: 实验内容简要描述
1、实验目的
(1)掌握先进先出页面置换算法;
(2)掌握最近最久未使用页面置换算法;
(3)掌握改进的CLOCK页面置换算法,了解其他页面置换算法;
(4)熟悉C/C++或其他语言编程。
2、实验要求
要求掌握C/C++语言进行编码,掌握页面缺页率的算法和基本思想,理解先进先出,最近最久未使用页面置换算法的,计算并记录缺页率。根据实验数据撰写实验报告
3、实验内容
编写程序,设置不同的页面数,使用不同的页面替换策略算法进行模拟页面替换。先进先出,最近最久未使用页面置换算法等,并计算缺页率。
4、实验环境
1.PC微机
2.Windows 操作系统
3.C/C++或其他语言开发环境
实验体会
通过这次实验我学到了C/C++语言进行编码,以及页面缺页率的算法和基本思想,和页面置换算法的基本知识,发现了自己的一些不足,对今后编写C/C++语言提供了帮助。
附件:源程序[包括截图]
#include<conio.h>
#include<stdio.h>
#include<dos.h>
#include<stdlib.h>
#include<math.h>
操作系统课程设计页面置换算法
#include<time.h>
int add[256],page[256];
int k,j,ram,t;
float rate;
struct s1
{ int page; int free; int tag;
}
fifo[33],opt[33],lru[33];
struct s2
{ int time;
};
int random(int x)
{ return rand() % x;
}
void address();
int random(int x);
float FIFO(int ram);
float OPT(int ram);
float LRU(int ram);
void main()
{ int i,p[256]; address(); srand(time(0));
for(k=1;k<=8;)
{ printf("the size of the page is %d k\n",k);
printf("the page number is ...\n");
for(i=0;i<256;i++)
{ p[i]=add[i]/(k*1024); printf("%d ",p[i]);
}
j=0;
for(i=0;i<256;i++)
{ while(p[i]==p[i+1]) i++; page[j]=p[i]; j++;
}
printf("\nafter connect the same pages the page num is:\n"); for(i=0;i<j;i++)
printf("%d ",page[i]);
printf("\n");
getch();
for(ram=1;ram<=32;ram++)
{ if (ram==10)
getch();
printf("\nblock=%d pages=%d,absent rate:",ram,j); printf("FIFO=%0.2f%%",FIFO(ram));
printf("LRU=%0.2f%%",LRU(ram));
printf("OPT=%0.2f%%",OPT(ram));
}
操作系统课程设计页面置换算法
k=k*2; getch();
}
}
void address()
{ int i; add[0]=1000;
for(i=1;i<=255;i++)
{
int x=random(1024);
if((x>=0)&&(x<512))
add[i]=add[i-1]+1;
if((x>=512)&&(x<768))
add[i]=random(add[i-1]-1)+1;
if((x>=768)&&(x<1024))
add[i]=add[i-1]+random(30*1024-add[i-1]-1)+1; }
}
float FIFO(int ram) /
{ int absent=0,t=0,i,z,l,yn;
for(i=0;i<ram;i++)
{ fifo[i].page=-1; fifo[i].free=1; fifo[i].tag=0;
}
i=0;
while(i<j)
{
yn=0; for(z=0;z<ram;z++)
if(fifo[z].page==page[i])
{yn=1;
for(z=0;z<ram;z++)
if(fifo[z].free==0)
fifo[z].tag+=1;
}
if(yn!=1)
{
absent+=1; l=0;
while((l<ram)&&(fifo[l].free==0))
l++;
if((l<ram)&&(fifo[l].free==1))
{
fifo[l].page=page[i];
fifo[l].free=0;
for(l=0;l<ram;l++)
if(fifo[l].free==0)
fifo[l].tag+=1;
操作系统课程设计页面置换算法
}
else
{
t=0;
for(l=0;l<ram;l++)
if(fifo[l].tag<fifo[t].tag)
t=l;
fifo[t].page=page[i];
fifo[t].free=0;
fifo[t].tag=1;
l=0;
}
}
i++;
}
rate=(float)absent/j*100;
return rate;
}
float LRU(int ram) /
{
int absent=0,yn,t,i,l,z,now=0;
struct s2 P[250];
for(i=0;i<j;i++)
P[i].time=0;
for(i=0;i<ram;i++)
{ lru[i].page=-1; lru[i].free=1;
}
i=0;
while(i<j)
{
for(l=0;z<ram;z++)
yn=0;
for(z=0;z<ram;z++)
{ if(lru[z].page==page[i])
{ now+=1;
P[lru[z].page].time=now;
yn=1;
}
if(yn!=1)
{ absent+=1; now+=1; l=0;
while((l<=ram)&&(lru[l].free==0))
if((l<=ram)&&(lru[l].free==1))
{ l++;
操作系统课程设计页面置换算法
lru[l].page=page[i];
P[lru[l].page].time=now;
lru[l].free=0;
}
else
{
t=0;
for(l=0;l<ram;l++)
if(P[lru[l].page].time<P[lru[t].page].time)
t=1;
lru[t].page=page[i];
P[lru[t].page].time=now;
}
}
}
i++;
}
rate=(float)absent/j*100;
return rate;
}
float OPT(int ram)
{
int yn,t,absent=0,i,l1,k,l;
for (i=0;i<ram;i++)
{
opt[i].page=-1; opt[i].free=1; opt[i].tag=0;
}
i=0;
while(i<j)
{
yn=0;
for (l1=0;l1<ram;l1++)
if (page[i]==opt[l1].page)
{yn=1;
for(k=0;k<ram;k++)
opt[k].tag-=1;
}
if(yn!=1)
{ absent+=1; l=0;
while((l<ram)&&(opt[l].free==0)) l++; if((l<=ram)&&(opt[l].free==1))
{ opt[l].page=page[i]; opt[l].free=0; opt[l].tag=1; for(l=0;l<ram;l++)
操作系统课程设计页面置换算法
{ opt[l].tag-=1;
}
}
else
{
for(l=0;l<ram;l++)
{
t=i;
while(t<j&&opt[l].page!=page[t]) { t++;
opt[l].tag+=1;
}
}
t=0;
for(l=0;l<ram;l++)
if(opt[l].tag>opt[t].tag) t=l; opt[t].page=page[i];
opt[t].tag=1;
}
}
i++;
}
rate=(float)absent/j*100;
return rate;
}
运行结果:
操作系统课程设计页面置换算法

