1、在内存划出一块区域,并进行页面划分;设计请求页表;模拟页面分配;分别模拟“先进先出页面淘汰算法FIFO”、“最近最少使用页面淘汰算法LRU”和“理想型淘汰算法OPT”
本程序随机产生请求序列,分别模拟FIFO,LRU,OPT三种算法。将结果保存在FIFO.txt,LRU.txt,OPT.txt三个文件中。
程序代码:
#include<stdio.h>
#include
2、rior; ﻩ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]=it
3、em; ﻩ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
4、 -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 DuLNod
5、e *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) ﻩﻩﻩ
6、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) {
7、ﻩ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],
8、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]; ﻩﻩﻩ} ﻩﻩ} ﻩﻩ*
9、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] 10、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(fp 11、1,"\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);
ﻩﻩ}
ﻩﻩels 12、e
ﻩ{
ﻩﻩﻩ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( 13、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) 14、=-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
ﻩﻩ{
15、
ﻩﻩ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]);
ﻩ 16、ﻩﻩﻩ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,"\ 17、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(pme 18、m,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]);
}






