1、 / 输入数据的函数void DataOutput(); / 输出数据的函数void FIFO(); / FIFO 函数void Optimal(); / Optimal函数void LRU(); / LRU函数int main(int argc, char* argv) DataInput(); int menu; while(true) printf(n* 菜单选择 *n);*n* 1-Optimal *n* 2-FIFO *n* 3-LRU *n* 4-返回上一级 *n* 0-EXIT *n printf( scanf(%d,&menu); switch(menu) case 1: Op
2、timal(); break; case 2: FIFO(); case 3: LRU(); case 0: exit(0); case 4: system(cls DataInput(); if(menu != 1 & menu != 2 &= 3 &= 0 &=4) system(n请输入0 - 4之间的整数!n continue; return 0;void DataInput() int i,choice; printf(请输入最小物理块数: scanf(M); / 输入最小物理块数大于数据个数 while(M BlockNum)物理块数超过预定值,请重新输入: 请输入页面的个数:N)
3、; / 输入页面的个数大于数据个数 while(N DataMax)页面个数超过预定值,请重新输入:请选择产生页面访问序列的方式(1.随机 2.输入):choice); switch(choice) case 1: / 产生随机访问序列 for(i = 0;i N;i+) Datai = (int)(float) rand() / 32767) * 10); / 随机数大小在0 - 9之间 system( / 显示随机产生的访问序列n随机产生的访问序列为:%d ,Datai); break; case 2: / 输入访问序列请输入页面访问序列: scanf(Datai); / 显示输入的访问序
4、列n输入的访问序列为: default: while(choice ! choice != 2)请输入1或2选择相应方式:void DataOutput() int i,j; / 对所有数据操作 for(i = 0; for(j = 0;j M;j+) / 对所有数据操作 if( DataShowEnableji ) printf(,DataShowji); else 缺页次数: %dn,ChangeTimes);缺页率: %d %n,ChangeTimes * 100 / N);/ 最佳置换算法void Optimal() int i,j,k; bool find; int point; i
5、nt temp; / 临时变量,比较离的最远的时候用 int m = 1,n; ChangeTimes = 0; for(i=0; DataShowEnableji = false; / 初始化为false,表示没有要显示的数据 counti = 0 ; / 初始化计数器 / 确定当前页面是否在物理块中,在继续,不在置换 / Block0 = Data0; for(i = 1;m int flag = 1; for(n = 0; n m;n+) if(Datai = Blockn) flag = 0; if(flag = 0) continue; Blockm = Datai; m+; / /
6、 对所有数据进行操作 for(i=0; / 表示块中有没有该数据 find = false; for(j = 0; if( Blockj = Datai ) find = true; if( find ) continue; / 块中有该数据,判断下一个数据 / 块中没有该数据,最优算法 ChangeTimes+; / 缺页次数+ / 找到下一个值的位置 find = false; for( k = i;k M ) /获得要替换的块指针 temp = 0; for(j = 0; if( temp countj ) temp = countj; point = j; / 获得离的最远的指针 el
7、se point = i; / 替换 Blockpoint = Datai; / 保存要显示的数据 DataShowji = Blockj; DataShowEnablei M ? (j n DataOutput();/ 先进先出置换算法void FIFO() / 临时变量 counti = 0; / 大于等于BlockNum,表示块中没有数据,或需被替换掉 / 所以经这样初始化(3 2 1),每次替换=3的块,替换后计数值置1, / 同时其它的块计数值加1 ,成了(1 3 2 ),见下面先进先出程序段 / 对有所数据操作 / 增加count countj+; / 表示块中有没有该数据 / 块中有该数据,判断下一个数据 / 块中没有该数据 ChangeTimes+; / 缺页次数+ / 因为i是从0开始记,而M指的是个数,从1开始,所以i+1 countj ) countpoint = 0; / 更新计数值nFIFO =/ 最近最久未使用置换算法void LRU() countj = 0; / 块中没有该数据 for(j=0;jM;(j 实验结果截图:程序运行:输入相应数据:选择相应算法:最佳置换算法:先进先出算法:最近最久未使用算法:
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2