先进先出(FIFO)淘汰算法
#include <stdio.h> /*页表长度,实际上是由系统按照作业的长度决定的*/ #define N 64 #define LENGTH 10 typedef struct { int lnumber;/*页号*/ int flag;/*是否在主存中,1表示在,0表示不在*/ int pnumber;/*所在主存块的块号*/ int write;/*是否修改过,1表示修改过,0表示没修改过*/ int dnumber;/*磁盘块号*/ } Page; /*页表定义*/ Page page[N]; int m; int page_length; int p[LENGTH]; int head; void Page_interrupt(int lnumber) { int j; printf("发生缺页中断%d\n",lnumber); j=p[head]; p[head]=lnumber; head=(head+1)%m; if(page[j].write==1) { printf("将页%d写回磁盘第%d块\n",j,page[j].dnumber); } page[j].flag=0; page[lnumber].flag=1; page[lnumber].write=0; page[lnumber].pnumber=page[j].pnumber; printf("淘汰主存块%2d中的页%2d,从磁盘第%d块中调入页%2d\n",page[j].pnumber,j,page[lnumber].dnumber,lnumber); return; } void Command(unsigned laddress,int write) { unsigned paddress,ad,pnumber,lnumber; kk: lnumber=laddress>>10; ad=laddress&0x03ff; if(lnumber>=page_length) { printf("\t输出:不存在该页\n"); Page_interrupt(lnumber); } if(page[lnumber].flag==1) { pnumber=page[lnumber].pnumber; paddress=pnumber<<10|ad; /*物理地址*/ printf("输出:逻辑地址是:%x对应的物理地址是:%x\n",laddress,paddress); if(write==1) { page[lnumber].write=1; } } else { Page_interrupt(lnumber); goto kk; } return; } int main() { //freopen("IO","r",stdin); int lnumber,pnumber,write,dnumber; unsigned laddress; int i=0; printf("输入页表的信息,创建页表(若页号为-1,则结束输入)\n"); printf("输入页号和辅存地址:\n"); scanf("%d",&lnumber); while(lnumber!=-1) { scanf("%d",&dnumber); page[i].lnumber=lnumber; page[i].flag=page[i].write=0; page[i++].dnumber=dnumber; printf("输入页号和辅存地址:\n"); scanf("%d",&lnumber); } page_length=i; printf("输入主存块号,主存块数要不大于%d,(以-1结束):\n",i); scanf("%d",&pnumber); m=head=0; while(pnumber!=-1) { if(m<=i) { page[m].pnumber=pnumber; page[m].flag=1; p[m]=m; ++m; } scanf("%d",&pnumber); } printf("输入指令性质(1-修改,0-不需要,其他-结束程序运行)和逻辑地址:\n"); scanf("%d %x",&write,&laddress); while(write==0||write==1) { Command(laddress,write); printf("输入指令性质(1-修改,0-不需要,其他-结束程序运行)和逻辑地址:\n"); scanf("%d %x",&write,&laddress); } printf("程序结束,按任意键返回!\n"); return 0; } /* IO: 2 7 4 9 8 8 3 5 -1 6 8 5 3 -1 0 78 1 64 0 785 1 abc 0 1000 1 1acb 0 1453 1 2010 2 */