文档库 最新最全的文档下载
当前位置:文档库 › C语言页面置换算法源代码

C语言页面置换算法源代码

#include
#include

#define Max 5

/*访问串数据结构*/
typedef struct page
{
int num; /*页号*/
struct page *next; /*下一页*/
}pageVis;

/*驻存数据结构*/
typedef struct storage
{
int data;
}pageStor;

pageStor array[Max];

/*初始化驻存数组*/
void initStor()
{
int i;
for(i=0;iarray[i].data=0;
}

/*初始化访问链*/
pageVis *init()
{
pageVis *head;
head=(pageVis *)malloc(sizeof(pageVis));
head->next=NULL;
initStor();
return head;
}

/*创建访问链*/
pageVis *createVis(pageVis *head,int n)
{
int i;
pageVis *p,*q;
q=head;
printf("\n");
for(i=0;i{
p=(pageVis *)malloc(sizeof(pageVis));
printf("\t请输入访问第%d次的页号:",i+1);
scanf("%d",&p->num);
p->next=NULL;
q->next=p;
q=p;
}
printf("\n");
return head;
}

/*输出访问链*/
void showVis(pageVis *head)
{
pageVis *p;
p=head->next;
printf("\n\t-----------------------------------------------------------------\n");
printf("\n\t访问串次序:");
while(p!=NULL)
{
printf("%d ",p->num);
p=p->next;
}
printf("\n");
}

/*FIFO*/
void FIFO(pageVis *head)
{
int number;
int visit;
int flagA; /*驻存块空(0)、满(1)标志*/
int flagB; /*缺页标志不缺(0)、缺(1)*/
int flagC; /*输出标志(0)不输出、(1)输出*/
int first=1; /*首页插入第一驻存块标志*/
double count=0;
pageVis *p;
printf("\t\t---------------------------------------------\n");
printf("\t\t FIFO \n");
printf("\t\t---------------------------------------------\n");
printf("\t\t\t请输入访问页面总数:");
scanf("%d",&visit);
printf("\t\t\t请输入驻存数(1-5):");
scanf("%d",&number);
head=createVis(head,visit); /*创建访问链*/
showVis(head); /*输入访问链*/
printf("\n");

p=head->next;

for(int k=0;k{
/*判断驻存块状态*/
for(int i=0;i{
if(array[i].data==0)
{
flagA=0;
break;
}
else
{
flagA=1;
}
}

/*判断缺页状态*/
for(int j=0;j{
/*不缺页*/
if(array[j].data==p->num)
{
flagB=0;
break;
}
/*缺页*/
else
{
flagB=1;
}
}

/*驻存块为空*/
if(flagA==0)
{
/*不缺页*/
if(flagB==0)
{
flagC=1;
p=p->next;
}
/*缺页*/
else
{
/*首页插入第一个驻存块*/
if(first==1)
{
array[0].data=p->num;
p=p->next;
flagC=1;
count++;
first=0;
}
else
{
for(i=number-1;i>0;i--)
array[i].data=array[i-1].data;
array[i].data=p->num;
flagC=1;
count++;
p=p->next;
}
}
}
/*驻存块不为空*/
else
{

/*不缺页*/
if(flagB==0)
{
flagC=1;
p=p->next;
}
/*缺页*/
else
{
for(i=number-1

;i>0;i--)
array[i].data=array[i-1].data;
array[i].data=p->num;
flagC=1;
count++;
p=p->next;
}
}

/*输出判断*/
if(flagC==1)
{
printf("\t");
printf("第%d次驻存页面号:",k+1);
for(int i=0;array[i].data!=0;i++)
printf("%d ",array[i].data);
printf("\n\n");
flagC=0;
}
}
printf("\n\t缺页数=%d\n",(int)count);
printf("\n\t页面数=%d\n",visit);
printf("\n\t缺页率=%.lf%%\n",(count/(double)visit)*100);
}

/*LRU*/
void LRU(pageVis *head)
{
int number;
int visit;
int flagA; /*驻存块空(0)、满(1)标志*/
int flagB; /*缺页标志不缺(0)、缺(1)*/
int flagC; /*输出标志(0)不输出、(1)输出*/
int first=1; /*首页插入第一驻存块标志*/
int cout=0;
int set;
double count=0;
pageVis *p;
printf("\t\t---------------------------------------------\n");
printf("\t\t LRU \n");
printf("\t\t---------------------------------------------\n");
printf("\t\t\t请输入访问页面总数:");
scanf("%d",&visit);
printf("\t\t\t请输入驻存数(1-5):");
scanf("%d",&number);
head=createVis(head,visit); /*创建访问链*/
showVis(head); /*输入访问链*/
printf("\n");

p=head->next;

for(int k=0;k{
/*判断驻存块状态*/
for(int i=0;i{
if(array[i].data==0)
{
flagA=0;
break;
}
else
{
flagA=1;
}
}

/*判断缺页状态*/
for(int j=0;j{
/*不缺页*/
if(array[j].data==p->num)
{
flagB=0;
set=j;
break;
}
/*缺页*/
else
{
flagB=1;
}
}

/*驻存块为空*/
if(flagA==0)
{
/*不缺页*/
if(flagB==0)
{
for(i=set;i>0;i--)
array[i].data=array[i-1].data;
array[i].data=p->num;
flagC=1;
p=p->next;
}
/*缺页*/
else
{
/*首页插入第一个驻存块*/
if(first==1)
{
array[0].data=p->num;
p=p->next;
flagC=1;
count++;
first=0;
}
else
{
for(int i=0;iif(array[i].data!=0)
cout++;
for(int j=cout;j>0;j--)
array[j].data=array[j-1].data;
array[j].data=p->num;
flagC=1;
count++;
p=p->next;
}
}
}
/*驻存块不为空*/
else
{

/*不缺页*/
if(flagB==0)
{
for(i=set;i>0;i--)
array[i].data=array[i-1].data;
array[i].data=p->num;
flagC=1;
p=p->next;
}
/*缺页*/
else
{
for(i=number-1;i>0;i--)
array[i].data=array[i-1].data;
array[i].data=p->num;
flagC=1;
count++;
p=p->next;
}
}

/*输出判断*/
if(flagC==1)
{
printf("\t");
printf("第%d次驻存页面号:",k+1);
for(int i=0;array[i].data!=0;i++)
printf("%d ",array[i].data);
printf("\n\n");
flagC=0;
}
}
printf("\n\t缺页数=%d\n",

(int)count);
printf("\n\t页面数=%d\n",visit);
printf("\n\t缺页率=%.lf%%\n",(count/(double)visit)*100);
}

int menu()
{
int choice;
while(1)
{
printf("\t\t\t---------------------\n");
printf("\t\t\t| 内存调度模拟算法 |\n");
printf("\t\t\t---------------------\n");
printf("\t\t\t| *1.FIFO |\n");
printf("\t\t\t---------------------\n");
printf("\t\t\t| *2.LRU |\n");
printf("\t\t\t---------------------\n");
printf("\t\t\t| *0.退出 |\n");
printf("\t\t\t---------------------\n");
printf("\t\t\t请选择(0-2):");
scanf("%d",&choice);
if(choice<0||choice>2)
{
printf("\n\t\t\t---------------------\n");
printf("\t\t\t*输入无效,请重新输入!\n");
printf("\t\t\t---------------------\n");
system("PAUSE");
system("CLS");
}
else
break;
}
return choice;
}

void main()
{
pageVis *head;

while(1)
{
switch(menu())
{
case 1:
head=init();
FIFO(head);
system("PAUSE");
system("CLS");
break;
case 2:
head=init();
LRU(head);
system("PAUSE");
system("CLS");
break;
case 0:
printf("\n\t谢谢使用内存调度模拟算法器!\n\n");
exit(1);
break;
}
}
}

相关文档
相关文档 最新文档