页面调度算法的实现和分析源码
发布网友
发布时间:2022-05-03 00:41
我来回答
共1个回答
热心网友
时间:2023-10-10 04:37
dev c++
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct mem
{
int num;
int v;
}meme;
static int process[1024],L,M;
void LRU();
void FIFO();
void get();
int menu();
int main()
{
menu();
system("pause");
}
int menu()
{
int x;
while(1)
{
printf("************************************************\n\n");
printf("*************1.输入页面地址流长度***************\n");
printf("*************2.输入存储块数目 ***************\n");
printf("*************3.获得页面地址流 ***************\n");
printf("*************4.FIFO算法 ***************\n");
printf("*************5.LRU算法 ***************\n");
printf("*************6.退出 ***************\n\n");
printf("************************************************\n\n");
printf("请选择:");
scanf("%d",&x);
switch(x)
{
case 1:printf("\n请输入页面地址流长度L(10<L<100):");scanf("%d",&L);break;
case 2:printf("\n请输入输入存储块数目M(3<=M<=5):");scanf("%d",&M);break;
case 3:printf("\n获得页面地址流为:");get();break;
case 4:printf("\n算法:FIFO L=%d M=%d",L,M);FIFO();break;
case 5:printf("\n算法:LRU L=%d M=%d",L,M);LRU();break;
case 6:exit(0);break;
default:printf("\n输入错误!");break;
}
printf("\n\n");
}
}
void get()
{
srand((unsigned)time(NULL));
for(int i=0;i<L;i++)
{
process[i]=rand()%10;
printf("%d ",process[i]);
}
}
void FIFO()
{
int i = 0, j = 0,k=0,x,y;
int replace,count=0;
meme memery[M];
printf("\n页号");
for(k=0;k<M;k++){printf("\t块%d",k+1);memery[k].num=-1;}
printf("\t淘汰\t缺页统计");
for(i = 0; i<L; i++) //对输入序列进行循环
{
x=0;y=0; //置x,y初值为0
for(j = 0; j <M; j++) //对三个内存块进行循环,先查找有没有与即将访问页号相同的
if(memery[j].num == process[i])
{ x=1;//有相同的则置x为1
replace=-2;
break;//跳出此次内存块循环
}
if(x==0)//没有与即将访问页号相同的内存块
{
for(j = 0; j <M; j++)//对内存块循环,查找有没有空内存块
if(memery[j].num==-1)
{
y=1;//有则置y为1
replace=-1;count++;
memery[j].num=process[i];// 置此内存块为访问页号
if(j!=0) memery[j-1].v=0;//置上一个访问块v为0
memery[j].v=1;//置此块v为1
break;//跳出此次内存块循环
}
}
if(x==0&&y==0)//既没有与即将访问页号相同的内存块也没有空内存块
{
for(j=0;j<M;j++)//对内存块循环,查找出v=1的内存块
{
if(memery[j].v==1)
{
memery[j].v=0;//置此块v为0
count++;
if(j!=M-1)
{
replace=memery[j+1].num;
memery[j+1].num=process[i]; //置下个内存块为访问页号块
memery[j+1].v=1;//置下个内存块v为1
}
else
{
replace=memery[0].num;
memery[0].num=process[i]; //置下个内存块为访问页号块
memery[0].v=1;//置下个内存块v为1
}
break;
}
}
}
printf("\n%d",process[i]);
for(j = 0 ;j <M; j++) //打印每次访问后的情况
printf("\t%d",memery[j].num);
if(replace!=-2)
printf("\t%d",replace);
else printf("\t");
printf("\t%d",count);
}
}
void LRU()
{
int i = 0, j = 0,k=0,x,y;
int replace,count=0;
meme memery[M];
printf("\n页号");
for(k=0;k<M;k++){printf("\t块%d",k+1);memery[k].num=-1;}
printf("\t淘汰\t缺页统计");
for(i = 0; i<L; i++) //对输入序列进行循环
{
x=0;y=0; //置x,y初值为0
for(j = 0; j<M; j++) //对三个内存块进行循环,先查找有没有与即将访问页号相同的
if(memery[j].num == process[i])
{ x=1;//有相同的则置x为1
replace=-2;
memery[j].v=0;//置此块v为0
for(k=0;k<M;k++)
if(k!=j&&memery[k].num!=-1)memery[k].v++;//其他不为-1页v++
break;//跳出此次内存块循环
}
if(x==0)//没有与即将访问页号相同的内存块
{
for(j = 0; j <M; j++)//对内存块循环,查找有没有空内存块
if(memery[j].num==-1)
{
y=1;//有则置y为1
replace=-1; count++;
memery[j].num=process[i];// 置此内存块为访问页号
memery[j].v=0;//置此块v为0
for(k=0;k<M;k++)
if(k!=j&&memery[k].num!=-1)memery[k].v++;//其他不为-1页v++
break;//跳出此次内存块循环
}
}
if(x==0&&y==0)//既没有与即将访问页号相同的内存块也没有空内存块
{
int m=memery[0].v;
for(j = 0; j < M; j++)
{
if(memery[j].v>m)
m=memery[j].v;
}//查找出v最大的内存块m
for(j=0;j<M;j++)//对内存块循环,v=m的内存块
{
if(memery[j].v==m)
{
replace=memery[j].num;
count++;
memery[j].num=process[i]; //置此内存块为访问页号块
memery[j].v=0;//置此块v为0
}
else memery[j].v++;//其他块v++
}
}
printf("\n%d",process[i]);
for(j = 0 ;j <M; j++) //打印每次访问后的情况
printf("\t%d",memery[j].num);
if(replace!=-2)
printf("\t%d",replace);
else printf("\t");
printf("\t%d",count);
}
}