#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
float num; //缺页数
typedef struct QNode{ //定义队列
int data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
void InitQueue(LinkQueue *Q) //初始化队列
{
Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));
Q->front->data=Q->rear->data=0;
Q->front->next =NULL;
}
void enqueue(LinkQueue *Q) //入队列
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p)
{
printf("创建失败\n");
}
else
{
p->data=0;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
}
}
int QLength(LinkQueue *Q) { //队列的长度(也就是内存驻留空间的大小)
int i = 0;
QueuePtr p;
p=Q->front;
while (p!=NULL) {
i++;
p = p->next;
}
}
void bianli(LinkQueue *Q,int n) //寻找页面是否存在
{
QueuePtr p;QueuePtr q;
p=Q->front->next;
q=Q->front;
while(p){
if(p->data==n) // 如果找到,则放在front后面
{
q->next=p->next;
p->next=Q->front->next;
Q->front->next=p;
break;
}
else //一个接一个的找
{
p=p->next;
q=q->next;
}
}
if(!p) //如果没有找到 ,即p为空
{
p=Q->front->next; //p,q重新指向前面(因为p已经为空),找到最后一个和倒数第二个结点
q=Q->front;
while(p->next)
{
p=p->next;
q=q->next;
}
Q->rear=q; //删掉最后一个结点,并把倒数第二个作为rear
q->next=NULL;
free(p);
QNode *LQNode = (QNode*)malloc(sizeof(QNode)); //新建结点存放页面号
LQNode->data=n;
LQNode->next=Q->front->next;// 新建结点放在front后面
Q->front->next=LQNode;
num++;
}
}
void final(int h)
{
LinkQueue Q;
InitQueue(&Q);
srand((int)time(0));
int m;float w;
for(int i=0;i<h;i++) //建立内存驻留空间大小(可随for的循环范围改变)
{
enqueue(&Q);
}
QLength(&Q);
printf(" %d ",h);
for(int a=0;a<5000;a++) // 遍历5000次1-29页面
{
m=rand()%29+1;
bianli(&Q,m);
}
for(int b=0;b<40000;b++) //遍历40000次30-70页面
{
m=rand()%41+30;
bianli(&Q,m);
}
for(int c=0;c<5000;c++) //遍历5000次71-100页面
{
m=rand()%30+71;
bianli(&Q,m);
}
printf("%.2f ",num);
w=num/50000;
printf("%.5f",w);
}
int main()
{
int size[8]={30,33,35,40,50,60,70,80}; //内存驻留空间大小
printf("---------------------------------------------\n");
printf("内存驻留空间大小 缺页数 缺页率\n");
printf("---------------------------------------------\n");
for(int i=0;i<8;i++)
{
num=0;
final(size[i]); //求缺页数,缺页率
printf("\n") ;
}
printf("---------------------------------------------\n");
}