存储管理
1.运行环境 Dev5.6.1
2.实验要求
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
/*
**指令结构体,
** int 指令号 [1-320];
** int 页号;
*/
typedef struct Order
{
int OrderNum;
int PageNum;
}Order;
/*
**地址流
*/
Order Command[321];
/*
**初始化地址流。
*/
void InitAdd()
{
int m1,m2;
for(int i=0;i<320;)
{
m1=rand()%317;//m1 最大只能为 316.
Command[i++].OrderNum=m1+1;// 1-317;
m2=rand()%(m1+2);//2-318
Command[i++].OrderNum=m2+1;//319;
Command[i++].OrderNum=(rand()%(318-m2))+m2+2;
}
}
/*
**初始化页号
*/
void BuildPageNum()
{
for(int i=0;i<320;i++)
{
Command[i].PageNum=Command[i].OrderNum/10;
}
}
/*
**输入算法号
*/
void InPutChoiceNum(int *ChoiceNum)
{
printf("There are algorithms in the program:\n");
printf("\t1、Optimization algorithm\n");
printf("\t2、Least recently used algorithm\n");
printf("\t3、First in first out algorithm\n");
printf("\t4、Least frequently used algorithm\n");
printf("Select an algorithm number, please.\n");
int temp;
scanf("%d",&temp);
while(temp<1||temp>4)
{
printf("there is not the algorithm int the program\n");
printf("There are algorithms in the program:\n");
printf("\t1、Optimization algorithm***********************\n");
printf("\t2、Least recently used algorithm\n");
printf("\t3、First in first out algorithm\n");
printf("\t4、Least frequently used algorithm**************\n");
printf("Select an algorithm number, please.\n");
scanf("%d",&temp);
}
*ChoiceNum=temp;
}
void FIFO();
void LRU();
/*
**模拟函数
*/
void simulation(int ChoiceNum)
{
switch(ChoiceNum)
{
case 1:
{
//OPT();
break;
}
case 2:
{
LRU();
break;
}
case 3:
{
FIFO();
break;
}
case 4:
{
// LFU();
break;
}
default:
{
printf("wrong\n");
}
}
}
/*
**最佳置换算法。
*/
/*
void OPT()
{
int msize;
int Msize=32;
for(msize=2;msize<=Msize;msize++)
{
int queue[33];
int NowVisit=0;
int NowSize=0;
int LackPageTimes=0;
double HitRate=0.0;
queue[NowSize++]=Command[NowVisit++].PageNum;
while(NowVisit<320)
{
bool m=false;
for(int i=0;i<NowSize;i++)
{
if(queue[i]==Command[NowVisit].PageNum)
{
m=true;
NowVisit++;
break;
}
}
if(m==false)
{
LackPageTimes++;
if(NowSize<msize)
{
queue[NowSize++]=Command[NowVisit].PageNum;
}
else
{
int book[msize];
memset(book,0,sizeof(book));
int temp=NowVisit;
int cout=1;
int pos=-1;
int flag=0;
for(int j=temp;j<320;j++)
{
for(int k=0;k<msize;k++)
{
if(Command[j].Page==queue[k])
{
book[k]++;
if(book[k]==1)
{
cout++;
if(cout>=msize)
{
break;
}
}
}
}
if(cout>=msize)
{
break;
}
}
if(cout<msize)
{
for(int i=0;i<NowSize-1;i++)
{
}
}
for(int i=0;i<msize;i++)
{
if(book[i]==0)
{
pos=i;
break;
}
}
queue[pos]=Command[NowVisit].PageNum;
}
NowVisit++;
}
}
HitRate=LackPageTimes/320.00;
printf("LRU : 物理块为%4d时,缺页率为:%6.2lf\n",msize,HitRate);
}
} */
/*
**最近最少使用算法
*/
void LRU()
{
int msize;
int Msize=32;
for(msize=2;msize<=Msize;msize++)
{
int queue[33];
int NowVisit=0;
int NowSize=0;
int LackPageTimes=0;
double HitRate=0.0;
queue[NowSize++]=Command[NowVisit++].PageNum;
while(NowVisit<320)
{
bool m=false;
for(int i=0;i<NowSize;i++)
{
if(queue[i]==Command[NowVisit].PageNum)
{
m=true;
NowVisit++;
break;
}
}
if(m==false)
{
LackPageTimes++;
if(NowSize<msize)
{
queue[NowSize++]=Command[NowVisit].PageNum;
}
else
{
int min=NowVisit;//要置换的位置。找到最小的就是。
int temp=9999999;
for(int j=0;j<msize;j++)
{
for(int k=NowVisit-1;k>=0;k--)
{
if(queue[j]==Command[k].PageNum)
{
temp=k;
break;
}
}
if(temp<min)
{
min=temp;
}
}
int pos=NowVisit;
for(int j=0;j<msize;j++)
{
if(queue[j]==Command[min].PageNum)
{
pos=j;
}
}
queue[pos]=Command[NowVisit].PageNum;
}
NowVisit++;
}
}
HitRate=LackPageTimes/320.00;
printf("LRU : 物理块为%4d时,缺页率为:%6.2lf\n",msize,HitRate);
}
}
/*
**先进先出算法
*/
void FIFO()
{
int msize;
int Msize=32;
for(msize=2;msize<=Msize;msize++)
{
int queue[321];
int head=0,tail=0;
int NowVisit=0;
int LackPageTimes=0;
double HitRate=0.0;
queue[tail]=Command[NowVisit++].PageNum;
tail++;
while(NowVisit<320)
{
bool m=false;
for(int i=head;i<tail;i++)
{
if(queue[i]==Command[NowVisit].PageNum)
{
m=true;
NowVisit++;
break;
}
}
if(m==false)
{
LackPageTimes++;
if(tail-head<msize)
{
queue[tail++]=Command[NowVisit].PageNum;
}
else
{
head++;
queue[tail++]=Command[NowVisit].PageNum;
}
NowVisit++;
}
}
HitRate=LackPageTimes/320.00;
printf("FIFO: 物理块为%4d时,缺页率为:%6.2lf\n",msize,HitRate);
}
}
/*
**主函数。
*/
int main()
{
printf("Start memory management.\n");
printf("Producing address flow, wait for while, please.\n");
srand(time(NULL));
InitAdd();//生成地址流
BuildPageNum();//生成页号。
int ChoiceNum;
int next=1;
char ch;
while(next)
{
InPutChoiceNum(&ChoiceNum);
simulation(ChoiceNum);
printf("do you try again with anther algorithm(y/n)\n");
fflush(stdin);
ch=getchar();
if(ch=='y'||ch=='Y')
{
next=1;
}
else if(ch=='n'||ch=='N')
{
next=0;
}
else
{
printf("input wrong (y/n).\n");
next=0;
}
}
return 0;
}