- 4 -if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1))) printf(\"%d\\n\ else
printf(\"%d \ } }
printf(\"* * * * * * * * * * * * * * * * * * * * * * *\\n\"); printf(\"* 请选择页面置换算法:\\\ *\\n\");
printf(\"* ----------------------------------------- *\\n\"); printf(\"* 1.先进先出(FIFO) 2.最近最久未使用(LRU) *\\n\"); printf(\"* 3.退出 * * * * * * * * *\\n\"); printf(\"* * * * * * * * * * * * * * * * * * * * * * *\\n\"); printf(\"请选择操作:[ ]\\b\\b\"); scanf(\"%d\ switch(code) {
case 1:
FIFO(); break; case 2: LRU(); break; case 3:
system(\"cls\");
system(\"color 0A\");
designBy(); /*显示设计者信息后退出*/
printf(\"┃谢谢使用页面置换算法演示器! ┃\\n\");
printf(\"┗━━━━━━━━━━━━━━━━━━━━━━━━━┛\\n\");
exit(0); default:
printf(\"输入错误,请重新输入:\"); }
printf(\"按任意键重新选择置换算法:>>>>>\"); getch();
system(\"cls\"); }while (code!=4); getch(); }
/*载入数据*/
- 5 -
void download() {
int i;
system(\"color 0D\");
printf(\"╔════════════╗\\n\"); printf(\"║正在载入数据,请稍候 !!!║\\n\"); printf(\"╚════════════╝\\n\"); printf(\"Loading...\\n\");
printf(\" O\"); for(i=0;i<51;i++) printf(\"\\b\"); for(i=0;i<50;i++) {
mDelay((pSIZE+mSIZE)/2); printf(\">\"); }
printf(\"\\nFinish.\\n载入成功,按任意键进入置换算法选择界面:>>>\"); getch(); }
/*设置延迟*/
void mDelay(unsigned int Delay) {
unsigned int i;
for(;Delay>0;Delay--) {
for(i=0;i<124;i++) {
printf(\" \\b\"); } } }
/*显示设计者信息*/ void designBy() {
printf(\"┏━━━━━━━━━━━━━━━━━━━━━━━━━┓\\n\"); printf(\"┃ 实验四:页面置换算法 ┃\\n\"); printf(\"┃ M计算机101 ┃\\n\");
printf(\"┃ 姓名:施利华 ┃\\n\"); printf(\"┣━━━━━━━━━━━━━━━━━━━━━━━━━┫\\n\"); }
- 6 -
void print(unsigned int t) {
int i,j,k,l; int flag;
for(k=0;k<=(pSIZE-1)/20;k++) {
for(i=20*k;(iif(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1))) printf(\"%d\\n\ elseprintf(\"%d \ }
for(j=0;jfor(i=20*k;(iif(i>=j)printf(\" |%d|\ else
printf(\" | |\"); }
for(i=mSIZE+20*k;(ifor(flag=0,l=0;lif(temp[i][l]==temp[i-1][l]) flag++;if(flag==mSIZE)/*页面在物理块中*/ printf(\" \"); else
printf(\" |%d|\ }
/*每行显示20个*/ if(i%20==0) continue; printf(\"\\n\"); } }
printf(\"----------------------------------------\\n\"); printf(\"缺页次数:%d\\\
printf(\"缺页率:%d/%d\\n\
- 7 -
printf(\"置换次数:%d\\\
printf(\"访问命中率:%d%%\\n\ printf(\"----------------------------------------\\n\"); }
/*计算过程延迟*/ void compute() {
int i;
printf(\"正在进行相关计算,请稍候\"); for(i=1;i<20;i++) {
mDelay(15); if(i%4==0)
printf(\"\\b\\b\\b\\b\\b\\b \\b\\b\\b\\b\\b\\b\"); else
printf(\"Θ\"); }
for(i=0;i++<30;printf(\"\\b\")); for(i=0;i++<30;printf(\" \")); for(i=0;i++<30;printf(\"\\b\")); }
/*先进先出页面置换算法*/ void FIFO() {
int memery[10]={0};
int time[10]={0}; /*记录进入物理块的时间*/ int i,j,k,m;
int max=0; /*记录换出页*/
int count=0; /*记录置换次数*/ /*前mSIZE个数直接放入*/ for(i=0;imemery[i]=page[i]; time[i]=i;for(j=0;jfor(i=mSIZE;i/*判断新页面号是否在物理块中*/ for(j=0,k=0;j- 8 -{
if(memery[j]!=page[i]) k++; }
if(k==mSIZE) /*如果不在物理块中*/ {
count++;
/*计算换出页*/
max=time[0]if(time[m]memery[max]=page[i];time[max]=i; /*记录该页进入物理块的时间*/ for(j=0;jfor(j=0;jcompute(); print(count); }/*最近最久未使用置换算法*/ void LRU() {
int memery[10]={0};
int flag[10]={0}; /*记录页面的访问时间*/ int i,j,k,m;
int max=0; /*记录换出页*/
int count=0; /*记录置换次数*/ /*前mSIZE个数直接放入*/ for(i=0;imemery[i]=page[i]; flag[i]=i;for(j=0;j- 9 -}
for(i=mSIZE;i/*判断新页面号是否在物理块中*/ for(j=0,k=0;jif(memery[j]!=page[i]) k++; elseflag[j]=i; /*刷新该页的访问时间*/ }
if(k==mSIZE) /*如果不在物理块中*/ {
count++;
/*计算换出页*/
max=flag[0]if(flag[m]memery[max]=page[i];flag[max]=i; /*记录该页的访问时间*/ for(j=0;jfor(j=0;j}compute(); print(count); }
- 10 -
3、 结果及分析
图3-1编者信息显示界面
图3-2 输入物理块个数
- 11 -
3-3输入页面号引用串个数
3-4输入页面号引用串
- 12 -
3-5 进入置换算法载入界面
3-6 进入选择算法界面
- 13 -
3-7 FIFO算法运行结果
3-8 LRU算法运行结果
- 14 -
3-9运行结束界面
4、 设计小结
通过这次的程序设计,让我对C语言有了更深一步的了解和认识,编程能力也有了提高,我认到学好计算机要重视实践操作,只有真正动手了才知道自己还有那些不足之处。通过这次实验我对先进先出FIFO,最近最久未使用LRU页面置换算法的实现方法。有了更多的了解。在编程过程中我也通过查阅书籍和复习以前的课本,对C++编程语言进行了复习。 通过这个实验我也体会到思路的重要性,一个程序如果一开始计划的好,结构设计完善,才可能顺利进行。这次实验模拟出了优先权调度算法,使我更加了解这一算法的调度过程。以前仅限于知道这一知识点,现在居然能用程序来实现这个过程。我相信这将是一个很好的学习方法。
5、参考文献
1. 严蔚敏, 吴伟民. 数据结构. 清华大学出版社, 2005.11 2. 谭浩强. C语言程序设计. 清华大学出版社, 2005.11
- 15 -