1、操作系统实验三页面置换算法实验报告实验三实验报告实验源码:#include stdio.h#include #include #define DataMax 100 / 常量DataMax#define BlockNum 10 / 常量BlockNumint DataShowBlockNumDataMax; / 用于存储要显示的数组bool DataShowEnableBlockNumDataMax; / 用于存储数组中的数据是否需要显示int DataDataMax; / 保存数据int BlockBlockNum; / 物理块int countBlockNum; / 计数器int N; /
2、 页面个数int M; / 最小物理块数int ChangeTimes; / 缺页次数void DataInput(); / 输入数据的函数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); printf(*n); printf(* 1-Optimal *n); printf(* 2-F
3、IFO *n); printf(* 3-LRU *n); printf(* 4-返回上一级 *n); printf(* 0-EXIT *n); printf(*n); scanf(%d,&menu); switch(menu) case 1: Optimal(); break; case 2: FIFO(); break; case 3: LRU(); break; case 0: exit(0); break; case 4: system(cls); DataInput(); break; if(menu != 1 & menu != 2 & menu != 3 & menu != 0 &
4、 menu !=4) system(cls); printf(n请输入0 - 4之间的整数!n); continue; return 0;void DataInput() int i,choice; printf(请输入最小物理块数:); scanf(%d,&M); / 输入最小物理块数大于数据个数 while(M BlockNum) printf(物理块数超过预定值,请重新输入:); scanf(%d,&M); printf(请输入页面的个数:); scanf(%d,&N); / 输入页面的个数大于数据个数 while(N DataMax) printf(页面个数超过预定值,请重新输入:);
5、 scanf(%d,&N); printf(请选择产生页面访问序列的方式(1.随机 2.输入):); scanf(%d,&choice); switch(choice) case 1: / 产生随机访问序列 for(i = 0;i N;i+) Datai = (int)(float) rand() / 32767) * 10); / 随机数大小在0 - 9之间 system(cls); / 显示随机产生的访问序列 printf(n随机产生的访问序列为:); for(i = 0;i N;i+) printf(%d ,Datai); printf(n); break; case 2: / 输入访问
6、序列 printf(请输入页面访问序列:n); for(i = 0;i N;i+) scanf(%d,&Datai); system(cls); / 显示输入的访问序列 printf(n输入的访问序列为:); for(i = 0;i N;i+) printf(%d ,Datai); printf(n); break; default: while(choice != 1 & choice != 2) printf(请输入1或2选择相应方式:); scanf(%d,&choice); break; void DataOutput() int i,j; / 对所有数据操作 for(i = 0;i
7、N;i+) printf(%d ,Datai); printf(n); for(j = 0;j M;j+) / 对所有数据操作 for(i = 0;i N;i+) if( DataShowEnableji ) printf(%d ,DataShowji); else printf( ); printf(n); printf(缺页次数: %dn,ChangeTimes); printf(缺页率: %d %n,ChangeTimes * 100 / N);/ 最佳置换算法void Optimal() int i,j,k; bool find; int point; int temp; / 临时变量
8、,比较离的最远的时候用 int m = 1,n; ChangeTimes = 0; for(j = 0;j M;j+) for(i=0;i N;i+) DataShowEnableji = false; / 初始化为false,表示没有要显示的数据 for(i = 0;i M;i+) counti = 0 ; / 初始化计数器 / 确定当前页面是否在物理块中,在继续,不在置换 / Block0 = Data0; for(i = 1;m M;i+) int flag = 1; for(n = 0; n m;n+) if(Datai = Blockn) flag = 0; if(flag = 0)
9、 continue; Blockm = Datai; m+; / / 对所有数据进行操作 for(i=0;i N;i+) / 表示块中有没有该数据 find = false; for(j = 0;j M;j+) if( Blockj = Datai ) find = true; if( find ) continue; / 块中有该数据,判断下一个数据 / 块中没有该数据,最优算法 ChangeTimes+; / 缺页次数+ for(j = 0;j M;j+) / 找到下一个值的位置 find = false; for( k = i;k M ) /获得要替换的块指针 temp = 0; for
10、(j = 0;j M;j+) if( temp countj ) temp = countj; point = j; / 获得离的最远的指针 else point = i; / 替换 Blockpoint = Datai; / 保存要显示的数据 for(j = 0;j M;j+) DataShowji = Blockj; DataShowEnablei M ? (j n); DataOutput();/ 先进先出置换算法void FIFO() int i,j; bool find; int point; int temp; / 临时变量 int m = 1,n; ChangeTimes = 0
11、; for(j = 0;j M;j+) for(i = 0;i N;i+) DataShowEnableji = false; / 初始化为false,表示没有要显示的数据 for(i = 0;i =3的块,替换后计数值置1, / 同时其它的块计数值加1 ,成了(1 3 2 ),见下面先进先出程序段 / 确定当前页面是否在物理块中,在继续,不在置换 / Block0 = Data0; for(i = 1;m M;i+) int flag = 1; for(n = 0; n m;n+) if(Datai = Blockn) flag = 0; if(flag = 0) continue; Blo
12、ckm = Datai; m+; / / 对有所数据操作 for(i = 0;i N;i+) / 增加count for(j = 0;j M;j+) countj+; find = false; / 表示块中有没有该数据 for(j = 0;j M ) /获得要替换的块指针 temp = 0; for(j = 0;j M;j+) if( temp countj ) temp = countj; point = j; / 获得离的最远的指针 else point = i; / 替换 Blockpoint = Datai; countpoint = 0; / 更新计数值 / 保存要显示的数据 fo
13、r(j = 0;j M;j+) DataShowji = Blockj; DataShowEnablei M ? (j n); DataOutput();/ 最近最久未使用置换算法void LRU() int i,j; bool find; int point; int temp; / 临时变量 int m = 1,n; ChangeTimes = 0; for(j = 0;j M;j+) for(i = 0;i N;i+) DataShowEnableji = false; / 初始化为false,表示没有要显示的数据 for(i = 0;i M;i+) counti = 0 ; / 初始化
14、计数器 / 确定当前页面是否在物理块中,在继续,不在置换 / Block0 = Data0; for(i = 1;m M;i+) int flag = 1; for(n = 0; n m;n+) if(Datai = Blockn) flag = 0; if(flag = 0) continue; Blockm = Datai; m+; / / 对有所数据操作 for(i = 0;i N;i+) / 增加count for(j = 0;j M;j+) countj+; find = false; / 表示块中有没有该数据 for(j = 0;j M ) /获得要替换的块指针 temp = 0; for(j = 0;j M;j+) if( temp countj ) temp = countj; point = j; / 获得离的最远的指针 else point = i; / 替换 Blockpoint = Datai; countpoint = 0; / 保存要显示的数据 for(j=0;jM;j+) DataShowji = Blockj; DataShowEnablei M ?(j n); DataOutput();实验结果截图:程序运行:输入相应数据:选择相应算法:最佳置换算法:先进先出算法:最近最久未使用算法:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1