#include<stdio.h>
#include<iostream.h>
#include <stdlib.h>
#include<time.h>
#define Stack_size 4
struct aa{ //代表一个物理页的节点
int page; //物理页存放的虚存页号
aa* next; //指向下一物理页
};
typedef struct
{
int elem[Stack_size];
int top;
int top2;
}Seq;
void Soseq(Seq *S)
{S->top=-1;
S->top2=0;
}
void main()
{
srand((unsigned)time(0)); //以当前时间做随机种子
int i,addr,pageN,ii,m,answer,ffalse,count;
double sum;
aa *head,*tail,*temp,*table;
ffalse=0; //页面失效次数(未命中次数)
answer=0;
int pageNums[150]; //存放页地址流
m=4; //4个物理页
table=new(aa); //建立第一个物理页节点
head=table; //链表头指针指向该节点
table->page=-1; //初值-1表示没有放置虚存页
temp=table; //临时指针指向第一个物理页
for(ii=2;ii<=m;ii++) //继续构建m-1个物理页
{ table=new(aa); //新建一个物理页节点
table->page=-1;
temp->next=table; //前一个节点的next指向本节点,形成链表
temp=table; //临时指针指向新建物理页节点
if (ii==m){table->next=NULL; } //最后物理页节点next指针指向空
}
tail=table; //尾指针指向链表尾
count=0;
i=0;
while(i<150) //每次循环,构造地址流的150个地址中的一个地址
{
if (count==0) { addr =(rand()%120+1)%120; pageN = addr /10;}
// count=0表示,在[0,119]的指令地址之间随机选取一起点M,顺序
//执行一条指令(+1),即获得M+1的指令地址;pageNum为地址所在页号。
if (count==1) { addr =rand()%(addr +1); pageN = addr /10;}
// count=1表示,在前地址[0,M+1]中随机选取一条指令并执行,
//该指令的地址为M‘;
if(count==2) { pageN =(( addr +1)%120)/10;}
//顺序执行一条指令,其地址为M‘+1;
if(count==3) { pageN =( rand()%(120- (addr+2)) + addr +2)%120/10;}
//在后地址[M‘+2,119]中随机选取一条指令并执行; //
++count;
pageNums[i]= pageN ;
if (count==4){count=0;} //进入下一个4次循环,再分4步生成4个地址
i++;
}
//输出页地址流
for(i=0;i<150;i++) { cout<< pageNums[i]<<" ";}
cout<<endl;
//----------------------------------------------------------------------------------------
//以下是FIFO最近最少使用算法
Seq *S1;
S1=(Seq *)malloc(sizeof(Seq));
Soseq(S1);
int y=0;
for(int q=0;q<150;q++)
{int x=pageNums[q];
if(S1->top!=Stack_size-1)
{S1->top++;
S1->elem[S1->top]=x;}
else
if(S1->elem[0]!=x&&S1->elem[1]!=x&&S1->elem[2]!=x&&S1->elem[3]!=x)
{S1->elem[S1->top2]=x;
S1->top2++;
y++;
if(S1->top2==3)
{S1->top2=0;}
}
}
sum=1.0-y/120.0;
cout<<"FIFO算法命中率:"<<sum<<endl;
}