资源描述
在内存划出一块区域,并进行页面划分;设计请求页表;模拟页面分配;分别模拟“先进先出页面淘汰算法FIFO”、“最近最少使用页面淘汰算法LRU”和“理想型淘汰算法OPT”
本程序随机产生请求序列,分别模拟FIFO,LRU,OPT三种算法。将结果保存在FIFO.txt,LRU.txt,OPT.txt三个文件中。
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 20
#define P 3
struct DuLNode{
ﻩint data;
struct DuLNode *prior;
ﻩstruct DuLNode *next;
};
int pageFIFO[N+1];
int front=0,rear=0;
int pageing[N+1],pmem[P+1];
int memcount=1;
void init(int a[],int T)
{
ﻩint i;
ﻩfor(i=0;i<=T;i++)
ﻩ a[i]=-2;
}
int insert_item(int item,int queue[],int T)
{ﻩ
ﻩif((rear+1)%(T+1)==front)
ﻩﻩreturn 1;
ﻩqueue[rear]=item;
ﻩrear=(rear+1)%(T+1);
ﻩreturn 0;
}
int remove_item(int *item,int queue[],int T)
{
ﻩif(front == rear)
ﻩreturn 1;
ﻩ*item=queue[front];
ﻩfront=(front+1) % (T+1);
ﻩreturn 0;
}
int findif(int a[],int b,int T)
{
ﻩint i;
ﻩfor(i=1;i<=T;i++)
ﻩ{
ﻩﻩif(a[i]==b)
ﻩﻩﻩreturn i;
ﻩ}
ﻩreturn -1;
}
void insertintomem(int a[],int b,int n)
{
ﻩif(memcount<=P)
ﻩ{
ﻩ a[memcount]=b;
ﻩﻩmemcount++;
ﻩ}
ﻩelse
ﻩﻩa[n]=b;
}
void initpage(int page[])
{
ﻩint temp,i;
ﻩsrand((unsigned)time(0));
ﻩfor(i=1;i<=N;i++)
ﻩ{
ﻩﻩtemp=rand()%10;
ﻩﻩpage[i]=temp;
ﻩ}
}
void addtoLink(struct DuLNode *p,int e)
{
ﻩstruct DuLNode *add;
ﻩadd=malloc(sizeof(struct DuLNode));
ﻩadd->data=e;
ﻩadd->prior=p->prior;
ﻩp->prior->next=add;
ﻩadd->next=p;
ﻩp->prior=add;
}
int getI(struct DuLNode *p,int e)
{
ﻩint i;
ﻩstruct DuLNode *cd=p;
ﻩfor(i=1;;i++)
ﻩ{
ﻩﻩcd=cd->next;
ﻩﻩif(cd->data==e)
ﻩﻩﻩreturn i;
ﻩﻩif(cd==p)
ﻩﻩﻩreturn -1;
}
}
void deleLink(struct DuLNode *p,int i,int *e)
{
ﻩint n;
ﻩstruct DuLNode *cd=p;
ﻩfor(n=1;n<=i;n++)
ﻩﻩcd=cd->next;
ﻩ*e=cd->data;
ﻩcd->prior->next=cd->next;
ﻩcd->next->prior=cd->prior;
ﻩfree(cd);
}
void removebottom(struct DuLNode *p,int *e)
{
ﻩstruct DuLNode *cd=p->next;
ﻩ*e=cd->data;
ﻩcd->next->prior=p;
ﻩp->next=cd->next;
ﻩfree(cd);
}
int getcount(int a[],int b,int n,int T)
{
ﻩint i;
ﻩfor(i=n;i<=T;i++)
ﻩ{
ﻩﻩif(a[i]==b)
ﻩﻩreturn (i-n);
ﻩ}
ﻩreturn -1;
}
void getreplacepage(int a[],int b[],int i,int *e)
{
ﻩint t,c[P+1],temp,T,count=0,error[P+1];
ﻩfor(t=1;t<=P;t++)
ﻩ{
ﻩﻩif(getcount(a,b[t],i,N)!=-1)
ﻩﻩﻩc[t]=getcount(a,b[t],i,N);
ﻩﻩelse
ﻩﻩ{
ﻩﻩﻩerror[++count]=b[t];
ﻩﻩ}
ﻩ}
if(count==0)
ﻩ{
ﻩﻩtemp=c[1];
ﻩﻩT=b[1];
ﻩﻩfor(t=1;t<=P;t++)
ﻩ{
ﻩﻩﻩif(c[t]>temp)
ﻩﻩﻩ{ﻩ
ﻩﻩﻩﻩtemp=c[t];
ﻩﻩﻩﻩT=b[t];
ﻩﻩﻩ}
ﻩﻩ}
ﻩﻩ*e=T;
ﻩ}
ﻩelse
ﻩ{
ﻩﻩfor(t=1;t<=count;t++)
ﻩﻩ{
ﻩﻩﻩc[t]=findif(a,error[t],N);
ﻩﻩ}
ﻩﻩtemp=c[1];
ﻩﻩT=error[1];
ﻩﻩfor(t=1;t<=count;t++)
ﻩﻩ{
ﻩﻩﻩif(c[t]<temp)
ﻩﻩﻩ{ﻩ
ﻩﻩﻩﻩtemp=c[t];
ﻩﻩﻩﻩT=error[t];
ﻩﻩﻩ}
ﻩﻩ}
ﻩ *e=T;
ﻩ}
}
void main()
{
ﻩint i,temp,temp1,error=0,ErrorC[P];
ﻩFILE *fp1,*fp2,*fp3;
ﻩstruct DuLNode *p;
ﻩp=(struct DuLNode *)malloc(sizeof(struct DuLNode));
ﻩp->prior=p->next=p;
ﻩinitpage(pageing);
ﻩinit(pmem,P);
ﻩif((fp1=fopen("FIFO.txt","a"))==NULL)
ﻩ{
ﻩﻩprintf("不能打开文件!\n");
ﻩﻩexit(1);
ﻩ}
ﻩfor(i=1;i<=N;i++)
ﻩ{
ﻩﻩfprintf(fp1," %d ",pageing[i]);
ﻩ}
ﻩfprintf(fp1,"\n");
ﻩfor(i=1;i<=N;i++)
ﻩ{
ﻩﻩif(memcount>P&&findif(pmem,pageing[i],P)==-1)
ﻩﻩ{
ﻩﻩ remove_item(&temp,pageFIFO,N);
ﻩﻩﻩinsertintomem(pmem,pageing[i],findif(pmem,temp,P));
ﻩﻩﻩinsert_item(pageing[i],pageFIFO,N);
ﻩﻩﻩfprintf(fp1,"%d被引用,%d被替换->出现第 %d 次错误!\n",pageing[i],temp,++error);
ﻩﻩ}
ﻩﻩelse
ﻩ{
ﻩﻩﻩif(memcount<=P&&findif(pmem,pageing[i],P)==-1)
ﻩﻩﻩ{
ﻩﻩﻩﻩinsertintomem(pmem,pageing[i],memcount);
ﻩﻩﻩﻩinsert_item(pageing[i],pageFIFO,N);
ﻩﻩﻩﻩfprintf(fp1,"页中未满。%d被引用->出现第 %d 次错误!\n",pageing[i],++error);
ﻩﻩﻩ}
ﻩﻩ else
ﻩﻩﻩﻩfprintf(fp1,"%d已在页中->未出现错误。\n",pageing[i]);
ﻩ}ﻩ
ﻩ}
ﻩfclose(fp1);
ﻩErrorC[0]=error;
ﻩmemcount=1;
ﻩerror=0;
init(pmem,P);
ﻩif((fp2=fopen("LRU.txt","a"))==NULL)
ﻩ{
ﻩﻩprintf("不能打开文件!\n");
ﻩﻩexit(1);
ﻩ}
ﻩfor(i=1;i<=N;i++)
ﻩ{
ﻩﻩfprintf(fp2," %d ",pageing[i]);
ﻩ}
fprintf(fp2,"\n");
ﻩfor(i=1;i<=N;i++)
ﻩ{
ﻩﻩif(memcount>P&&findif(pmem,pageing[i],P)==-1)
ﻩﻩ{
ﻩ ﻩremovebottom(p,&temp);
ﻩﻩﻩinsertintomem(pmem,pageing[i],findif(pmem,temp,P));
ﻩﻩﻩif(getI(p,pageing[i])!=-1)
ﻩﻩﻩ{
ﻩﻩﻩﻩdeleLink(p,getI(p,pageing[i]),&temp1);
ﻩﻩﻩ}
ﻩ ﻩ addtoLink(p,pageing[i]);
ﻩ ﻩfprintf(fp2,"%d被引用,%d被替换->出现第 %d 次错误!\n",pageing[i],temp,++error);
ﻩ}
ﻩﻩelse
ﻩﻩ{
ﻩﻩif(memcount<=P&&findif(pmem,pageing[i],P)==-1)
ﻩﻩﻩ{
ﻩﻩﻩinsertintomem(pmem,pageing[i],memcount);
ﻩﻩﻩﻩaddtoLink(p,pageing[i]);
ﻩﻩ ﻩfprintf(fp2,"页中未满。%d被引用->出现第 %d 次错误!\n",p->prior->data,++error);
ﻩﻩﻩ}
ﻩ ﻩelse
ﻩﻩﻩ{
ﻩﻩﻩﻩdeleLink(p,getI(p,pageing[i]),&temp1);
ﻩﻩ addtoLink(p,pageing[i]);
ﻩﻩﻩﻩfprintf(fp2,"%d已在页中->未出现错误。\n",pageing[i]);
ﻩﻩﻩ}
ﻩﻩ}ﻩ
ﻩ}
ﻩfclose(fp2);
ﻩErrorC[1]=error;
ﻩmemcount=1;
ﻩerror=0;
ﻩinit(pmem,P);
ﻩif((fp3=fopen("OPT.txt","a"))==NULL)
ﻩ{
ﻩﻩprintf("不能打开文件!\n");
ﻩﻩexit(1);
ﻩ}
ﻩfor(i=1;i<=N;i++)
ﻩ{
ﻩﻩfprintf(fp3," %d ",pageing[i]);
ﻩ}
ﻩfprintf(fp3,"\n");
ﻩfor(i=1;i<=N;i++)
ﻩ{
ﻩﻩif(memcount>P&&findif(pmem,pageing[i],P)==-1)
ﻩﻩ{
ﻩﻩﻩgetreplacepage(pageing,pmem,i,&temp);
ﻩﻩﻩinsertintomem(pmem,pageing[i],findif(pmem,temp,P));
ﻩﻩﻩfprintf(fp3,"%d被引用,%d被替换->出现第 %d 次错误!\n",pageing[i],temp,++error);
ﻩﻩ}
ﻩelse
ﻩﻩ{
ﻩﻩif(memcount<=P&&findif(pmem,pageing[i],P)==-1)
ﻩﻩﻩ{
ﻩﻩinsertintomem(pmem,pageing[i],memcount);
ﻩﻩﻩﻩfprintf(fp3,"页中未满。%d被引用->出现第 %d 次错误!\n",pageing[i],++error);
ﻩﻩ}
ﻩﻩﻩelse
ﻩﻩﻩﻩfprintf(fp3,"%d已在页中->未出现错误。\n",pageing[i]);
ﻩﻩ}ﻩ
ﻩ}
ﻩErrorC[2]=error;
ﻩprintf("对于引用串序列:");
ﻩfor(i=1;i<=N;i++)
ﻩ{
ﻩﻩprintf(" %d ",pageing[i]);
ﻩ}
ﻩprintf("\nFIFO算法出现 %d 次错误。\n",ErrorC[0]);
ﻩprintf("LRU算法出现 %d 次错误。\n",ErrorC[1]);
ﻩprintf("OPT算法出现 %d 次错误。\n",ErrorC[2]);
}
展开阅读全文