1 #include <stdio.h> 2 #include <stdlib.h> 3 4 /*全局变量*/ 5 int mSIZE; /*物理块数*/ 6 int pSIZE; /*页面号引用串个数*/ 7 static int memery[10]={0}; /*物理块中的页号*/ 8 static int page[100]={0}; /*页面号引用串*/ 9 static int temp[100][10]={0}; /*辅助数组*/ 10 11 /*置换算法函数*/ 12 void FIFO(); 13 void LRU(); 14 void OPT(); 15 16 /*辅助函数*/ 17 void print(unsigned int t); 18 void designBy(); 19 void download(); 20 void mDelay(unsigned int Delay); 21 22 /*主函数*/ 23 int main() 24 { 25 int i,k,code; 26 // system("color 0E"); 27 designBy(); 28 printf("按任意键开启功能"); 29 // printf(" >>>"); 30 getchar(); 31 system("cls"); 32 // system("color 0E"); 33 34 35 printf("请输入引用串的个数(M<=10):"); 36 scanf("%d",&pSIZE); 37 printf("请输入物理块的个数(M<=10):"); 38 scanf("%d",&mSIZE); 39 puts("请依次输入页面号引用串(连续输入,无需隔开):"); 40 for(i=0;i<pSIZE;i++) 41 scanf("%1d",&page[i]); 42 download(); 43 system("cls"); 44 // system("color 0E"); 45 do{ 46 puts("输入的页面号引用串为:"); 47 for(k=0;k<=(pSIZE-1)/20;k++) 48 { 49 for(i=20*k;(i<pSIZE)&&(i<20*(k+1));i++) 50 { 51 if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1))) 52 printf("%d ",page[i]); 53 else 54 printf("%d ",page[i]); 55 } 56 } 57 printf("* * * * * * * * * * * * * * * * * * * * * * * "); 58 printf("* 请选择页面置换算法: * "); 59 printf("* ----------------------------------------- * "); 60 printf("* 1.先进先出(FIFO) 2.最近最久未使用(LRU) * "); 61 printf("* 3.最佳(OPT) 4.退出 * "); 62 printf("* * * * * * * * * * * * * * * * * * * * * * * "); 63 printf("请选择操作:[ ]"); 64 scanf("%d",&code); 65 switch(code) 66 { 67 case 1: 68 FIFO(); 69 break; 70 case 2: 71 LRU(); 72 break; 73 case 3: 74 OPT(); 75 break; 76 case 4: 77 system("cls"); 78 // system("color 0C"); 79 designBy(); /*显示设计者信息后退出*/ 80 printf("谢谢使用页面置换算法演示器! "); 81 exit(0); 82 default: 83 printf("输入错误,请重新输入:"); 84 } 85 printf("按任意键重新选择置换算法:>>>"); 86 getchar(); 87 system("cls"); 88 }while (code!=4); 89 getchar(); 90 } 91 92 /*载入数据*/ 93 void download() 94 { 95 int i; 96 system("color 0B"); 97 printf("正在载入数据,请稍候 !!! "); 98 printf("Loading... "); 99 printf(" O"); 100 for(i=0;i<51;i++) 101 printf(""); 102 for(i=0;i<50;i++) 103 { 104 mDelay((pSIZE+mSIZE)/2); 105 printf(">"); 106 } 107 printf(" Finish. 载入成功,按任意键进入置换算法选择界面:>>>"); 108 getchar(); 109 } 110 111 /*设置延迟*/ 112 void mDelay(unsigned int Delay) 113 { 114 unsigned int i; 115 for(;Delay>0;Delay--) 116 { 117 for(i=0;i<124;i++) 118 { 119 printf(" "); 120 } 121 } 122 } 123 124 /*显示设计者信息*/ 125 void designBy() 126 { 127 128 printf(" 课题:页面置换算法的模拟实现 "); 129 printf(" 学号:1610704202 "); 130 printf(" 姓名:xxx "); 131 } 132 133 134 void print(unsigned int t) 135 { 136 int i,j,k,l; 137 int flag; 138 for(k=0;k<=(pSIZE-1)/20;k++) 139 { 140 for(i=20*k;(i<pSIZE)&&(i<20*(k+1));i++) 141 { 142 if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1))) 143 printf("%d ",page[i]); 144 else 145 printf("%d ",page[i]); 146 } 147 for(j=0;j<mSIZE;j++) 148 { 149 for(i=20*k;(i<mSIZE+20*k)&&(i<pSIZE);i++) 150 { 151 if(i>=j) 152 printf(" |%d|",temp[i][j]); 153 else 154 printf(" | |"); 155 } 156 for(i=mSIZE+20*k;(i<pSIZE)&&(i<20*(k+1));i++) 157 { 158 for(flag=0,l=0;l<mSIZE;l++) 159 if(temp[i][l]==temp[i-1][l]) 160 flag++; 161 if(flag==mSIZE)/*页面在物理块中*/ 162 printf(" "); 163 else 164 printf(" |%d|",temp[i][j]); 165 }/*每行显示20个*/ 166 if(i%20==0) 167 continue; 168 printf(" "); 169 } 170 } 171 172 printf("---------------------------------------- "); 173 printf("缺页次数:%d ",t+mSIZE); 174 printf("缺页率:%d/%d ",t+mSIZE,pSIZE); 175 printf("置换次数:%d ",t); 176 printf("访问命中率:%d%% ",(pSIZE-(t+mSIZE))*100/pSIZE); 177 printf("---------------------------------------- "); 178 } 179 180 /*计算过程延迟*/ 181 void compute() 182 { 183 int i; 184 printf("正在进行相关计算,请稍候"); 185 for(i=1;i<20;i++) 186 { 187 mDelay(15); 188 if(i%4==0) 189 printf(" "); 190 else 191 printf("Θ"); 192 } 193 for(i=0;i++<30;printf("")); 194 for(i=0;i++<30;printf(" ")); 195 for(i=0;i++<30;printf("")); 196 } 197 /*先进先出页面置换算法*/ 198 void FIFO() 199 { 200 int memery[10]={0}; 201 int time[10]={0}; /*记录进入物理块的时间*/ 202 int i,j,k,m; 203 int max=0; /*记录换出页*/ 204 int count=0; /*记录置换次数*/ 205 /*前mSIZE个数直接放入*/ 206 for(i=0;i<mSIZE;i++) 207 { 208 memery[i]=page[i]; 209 time[i]=i; 210 for(j=0;j<mSIZE;j++) 211 temp[i][j]=memery[j]; 212 } 213 for(i=mSIZE;i<pSIZE;i++) 214 { 215 /*判断新页面号是否在物理块中*/ 216 for(j=0,k=0;j<mSIZE;j++) 217 { 218 if(memery[j]!=page[i]) 219 k++; 220 } 221 if(k==mSIZE) /*如果不在物理块中*/ 222 { 223 count++;/*计算换出页*/ 224 max=time[0]<time[1]?0:1; 225 for(m=2;m<mSIZE;m++) 226 if(time[m]<time[max]) 227 max=m; 228 memery[max]=page[i]; 229 time[max]=i; /*记录该页进入物理块的时间*/ 230 for(j=0;j<mSIZE;j++) 231 temp[i][j]=memery[j]; 232 } 233 else 234 { 235 for(j=0;j<mSIZE;j++) 236 temp[i][j]=memery[j]; 237 } 238 } 239 compute(); 240 print(count); 241 getchar(); 242 } 243 /*最近最久未使用置换算法*/ 244 void LRU() 245 { 246 int memery[10]={0}; 247 int flag[10]={0}; /*记录页面的访问时间*/ 248 int i,j,k,m; 249 int max=0; /*记录换出页*/ 250 int count=0; /*记录置换次数*/ 251 /*前mSIZE个数直接放入*/ 252 for(i=0;i<mSIZE;i++) 253 { 254 memery[i]=page[i]; 255 flag[i]=i; 256 for(j=0;j<mSIZE;j++) 257 temp[i][j]=memery[j]; 258 } 259 for(i=mSIZE;i<pSIZE;i++) 260 { 261 /*判断新页面号是否在物理块中*/ 262 for(j=0,k=0;j<mSIZE;j++) 263 { 264 if(memery[j]!=page[i]) 265 k++; 266 else 267 flag[j]=i; /*刷新该页的访问时间*/ 268 } 269 if(k==mSIZE) /*如果不在物理块中*/ 270 { 271 count++; 272 /*计算换出页*/ 273 max=flag[0]<flag[1]?0:1; 274 for(m=2;m<mSIZE;m++) 275 if(flag[m]<flag[max]) 276 max=m; 277 memery[max]=page[i]; 278 flag[max]=i; /*记录该页的访问时间*/ 279 for(j=0;j<mSIZE;j++) 280 temp[i][j]=memery[j]; 281 } 282 else 283 { 284 for(j=0;j<mSIZE;j++) 285 temp[i][j]=memery[j]; 286 } 287 } 288 compute(); 289 print(count); 290 getchar(); 291 } 292 /*最佳置换算法*/ 293 void OPT() 294 { 295 int memery[10]={0}; 296 int next[10]={0}; /*记录下一次访问时间*/ 297 int i,j,k,l,m; 298 int max; /*记录换出页*/ 299 int count=0; /*记录置换次数*/ 300 /*前mSIZE个数直接放入*/ 301 for(i=0;i<mSIZE;i++) 302 { 303 memery[i]=page[i]; 304 for(j=0;j<mSIZE;j++) 305 temp[i][j]=memery[j]; 306 } 307 for(i=mSIZE;i<pSIZE;i++) 308 { 309 /*判断新页面号是否在物理块中*/ 310 for(j=0,k=0;j<mSIZE;j++) 311 { 312 if(memery[j]!=page[i]) 313 k++; 314 } 315 if(k==mSIZE) /*如果不在物理块中*/ 316 { 317 count++; 318 /*得到物理快中各页下一次访问时间*/ 319 for(m=0;m<mSIZE;m++) 320 { 321 for(l=i+1;l<pSIZE;l++) 322 if(memery[m]==page[l]) 323 break; 324 next[m]=l; 325 } 326 /*计算换出页*/ 327 max=next[0]>=next[1]?0:1; 328 for(m=2;m<mSIZE;m++) 329 if(next[m]>next[max]) 330 max=m; 331 /*下一次访问时间都为pSIZE,则置换物理块中第一个*/ 332 memery[max]=page[i]; 333 for(j=0;j<mSIZE;j++) 334 temp[i][j]=memery[j]; 335 } 336 else { 337 for(j=0;j<mSIZE;j++) 338 temp[i][j]=memery[j]; 339 } 340 } 341 compute(); 342 print(count); 343 getchar(); 344 }