*/
#include<conio.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #define Myprintf printf("|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n") /*表格控制*/ #define wulisize 4 //物理块大小 #define jincsize 16 //进程大小 typedef struct page { int num; /*记录页面号*/ int time; /*记录调入内存时间*/ }Page; /* 页面逻辑结构,结构为方便算法实现设计*/ Page b[wulisize]; /*内存单元数*/ int count = 0; //统计页面缺页次数 int c[wulisize][jincsize]={0}; /*暂保存内存当前的状态:缓冲区*/ int jinc[jincsize]={0}; //进程序列号 int queue[100]={0}; /*记录调入队列*/ int q=0;//记录队列数 /*初始化内存单元、缓冲区*/ void Init() { int i; for(i=0;i<jincsize;i++) { b[i].num=0; b[i].time=0; } } int* build()//随机产生序列号函数 { printf("随机产生一个进程序列号为:\n"); int i = 0; for(i=0; i<jincsize; i++) { jinc[i] = 10*rand()/(RAND_MAX+1)+1; printf("%d ",jinc[i]); } printf("\n"); return(jinc); } int searchjinc(int i)//有无相同进程 { for(int j = 0; j < wulisize; j++) if(b[j].num == jinc[i]) return j; return -1; } int searchwu(){//有无空闲区 for(int j=0; j<wulisize; j++) if(b[j].num == 0) return j; return -1; } int getmax() //获取最大的time号区 { int i; int max=-1; int tag=0; for(i=0;i<wulisize;i++) { if(b[i].time>max) { max=b[i].time; tag=i; } } return tag; } void empty() { Init(); q=0; count=0; //计数器置零 } void LRU() { Init(); int m,n;//n表示有无相同进程在,m表示是否有物理空闲区域 int v;//更换区号 int i; for(i = 0; i<jincsize; i++)//i是进程号 { n=searchjinc(i); if (n != -1)//有相同进程 { b[n].time=1; } else //无相同进程 { m=searchwu(); if (m != -1)//有空闲 { b[m].time=1; b[m].num=jinc[i]; ++count; printf("%d ", m);//更换的位置 } else//无空闲 { v=getmax(); printf("%d ", v);//更换的位置 b[v].time=1; b[v].num=jinc[i]; ++count; } queue[q++]=jinc[i]; } for (int hang = 0; hang < wulisize; ++hang) { c[hang][i]=b[hang].num;//用于输出来查看的 if(b[hang].time != 0)b[hang].time++;//时间+1; } } printf("\n"); //以下是输出 Myprintf; for(int j=0;j<jincsize;j++) printf("|%2d ",jinc[j]); printf("|\n"); Myprintf; for(i=0;i<wulisize;i++) { for(int j=0;j<jincsize;j++) { if(c[i][j]==-1) printf("|%2c ",32); else printf("|%2d ",c[i][j]); } printf("|\n"); } printf("\n调入队列为:"); for(i=0;i<q;i++) printf("%3d",queue[i]); printf("\n缺页次数为:%6d\n缺页率:%16.6f",q,(float)(q)/jincsize); } void main() { int sel ; build(); do{ printf("请输入 0 1,1运行 0退出"); scanf("%d",&sel); switch(sel) { case 0:printf("\t\t\t^-^再见!^-^ \t\t\t\n");system("pause");break; case 1:printf("更换的位置\n");LRU();empty();printf("\n");break; default: printf("请输入正确的选项号!");printf("\n\n");break; } }while(sel!=0); }
原文地址:http://blog.csdn.net/h1023417614/article/details/40148699