#define TRUE 1 #define FALSE 0 #define INVALID -1 #define NULL 0 #define total_instruction 320 /* 指令流长*/ #define total_vp 32 /* 虚页长*/ #define clear_period 50 /* 清0周期*/ typedef struct /* 页面结构*/ { int pn,pfn,counter,time; }pl_type; pl_type pl[total_vp]; /* 页面结构数组*/ struct pfc_struct{ /* 页面控制结构*/ int pn,pfn; struct pfc_struct *next; }; typedef struct pfc_struct pfc_type; pfc_type pfc[total_vp],*freepf_head,*busypf_head,*busypf_tail; int diseffect, a[total_instruction]; int page[total_instruction], offset[total_instruction]; int initialize(int); int FIFO(int); int LRU(int); int OPT(int); int main( ) { int s,i,j; srand(10*getpid()); /* 由于每次运行时进程号不同,故可用来作为初始化随机数队列的“种子”*/ s=(float)319*rand( )/32767/32767/2+1; // for(i=0;i319) { printf("When i==%d,Error,s==%d\n",i,s); exit(0); } a[i]=s; /* 任选一指令访问点m*/ a[i+1]=a[i]+1; /* 顺序执行一条指令*/ a[i+2]=(float)a[i]*rand( )/32767/32767/2; /* 执行前地址指令m' */ a[i+3]=a[i+2]+1; /* 顺序执行一条指令*/ s=(float)(318-a[i+2])*rand( )/32767/32767/2+a[i+2]+2; if((a[i+2]>318)||(s>319)) printf("a[%d+2],a number which is :%d and s==%d\n",i,a[i+2],s); } for (i=0;inext; pl[busypf_head->pn].pfn=INVALID; freepf_head=busypf_head; /* 释放忙页面队列的第一个页面*/ freepf_head->next=NULL; busypf_head=p; } p=freepf_head->next; /* 按FIFO方式调新页面入内存页面*/ freepf_head->next=NULL; freepf_head->pn=page[i]; pl[page[i]].pfn=freepf_head->pfn; if(busypf_tail==NULL) busypf_head=busypf_tail=freepf_head; else { busypf_tail->next=freepf_head; /*free 页面减少一个*/ busypf_tail=freepf_head; } freepf_head=p; } } printf("FIFO:%6.4f\n",1-(float)diseffect/320); return 0; } int LRU (total_pf) /* 最近最久未使用算法*/ int total_pf; { int min,minj,i,j,present_time; initialize(total_pf); present_time=0; for(i=0;ipl[j].time&&pl[j].pfn!=INVALID) { min=pl[j].time; minj=j; } freepf_head=&pfc[pl[minj].pfn]; // 腾出一个单元 pl[minj].pfn=INVALID; pl[minj].time=-1; freepf_head->next=NULL; } pl[page[i]].pfn=freepf_head->pfn; // 有空闲页面,改为有效 pl[page[i]].time=present_time; freepf_head=freepf_head->next; // 减少一个free 页面 } else pl[page[i]].time=present_time; // 命中则增加该单元的访问次数 present_time++; } printf("LRU:%6.4f\n",1-(float)diseffect/320); return 0; } int OPT(total_pf) /* 最佳置换算法*/ int total_pf; { int i,j, max,maxpage,d,dist[total_vp]; pfc_type *t; initialize(total_pf); for(i=0;inext=NULL; pl[maxpage].pfn=INVALID; } pl[page[i]].pfn=freepf_head->pfn; freepf_head=freepf_head->next; } } printf("OPT:%6.4f\n",1-(float)diseffect/320); return 0; }