当前位置:
文档之家› 操作系统 七次实验报告 常用页面置换算法模拟实验
操作系统 七次实验报告 常用页面置换算法模拟实验
实验用到的软件(: ) DevC++,Visio 实验内容及关键步骤(代码)Q3(15 分) 得分:
流程图:
输入页ห้องสมุดไป่ตู้访问序列
取访问的页号
查页表 是 是否缺页? 否
置缺页标志 flag 为’*’
按算法不同淘汰一页面
调入所访问的页面
FIFO 算法流程图
LRU 算法流程图:
函数关系解释图:
主函数,入口
{ /*判断新页面号是否在物理块中*/ for(j=0,k=0;j<mSIZE;j++) { if(memery[j]!=page[i]) k++; else flag[j]=i; /*刷新该页的访问时间*/ } if(k==mSIZE) /*如果不在物理块中*/ { count++; /*计算换出页*/ max=flag[0]<flag[1]?0:1; for(m=2;m<mSIZE;m++) if(flag[m]<flag[max]) max=m; memery[max]=page[i]; flag[max]=i; /*记录该页的访问时间*/ for(j=0;j<mSIZE;j++) temp[i][j]=memery[j]; } else { for(j=0;j<mSIZE;j++) temp[i][j]=memery[j]; } // } compute(); print(count);
内容:编写一个程序,使用以下页面置换算法中的某 2 种分别模拟一个分页系统,并统
计同一个页面访问序列情况下不同页面置换算法引发的缺页中断次数。 1、第二次机会算法(Second Chance) 2、最近最少使用算法(Least Recently Used,LRU ) 3、最不常用算法(Not Frequently Used,NFU) 4、最近未使用算法(Not Recently Used ,NRU) 5、时钟页面置换算法 6、老化算法(aging) 页框的数量固定为 4,虚拟页面数为 8。实验输入为访问页面序列,比如 0,1 ,3 ,2, 7,1
} /*显示设计者信息*/ void designBy() { printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf("┃㊣ 实验七:页面置换算法 ㊣┃\n"); printf("┃ 学号:1001010042 ┃\n"); printf("┃ 姓名:黄浩全 <Dev-C++ 4.9.9.0>┃\n"); printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━┫\n"); }
实验 总分 (Q1+Q2+ Q3+Q4)
实验编号与实验名称:
实验七、常用页面置换算法模拟实验
实验目的:
通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点, 掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它 们的效率。
实验内容及要求(详见实验讲义与实验指导书) :
printf(" | |"); } for(i=mSIZE+20*k;(i<pSIZE)&&(i<20*(k+1));i++) { for(flag=0,l=0;l<mSIZE;l++) if(temp[i][l]==temp[i-1][l]) flag++; if(flag==mSIZE)/*页面在物理块中*/ printf(" "); else printf(" |%d|",temp[i][j]); } /*每行显示 20 个*/ if(i%20==0) continue; printf("\n"); } } printf("----------------------------------------\n"); printf("缺页次数:%d\t\t",t+mSIZE); printf("缺页率:%d/%d\n",t+mSIZE,pSIZE); printf("置换次数:%d\t\t",t); printf("访问命中率:%d%%\n",(pSIZE-(t+mSIZE))*100/pSIZE); printf("----------------------------------------\n"); } /*先进先出页面置换算法*/ 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;i<mSIZE;i++) { memery[i]=page[i]; time[i]=i; for(j=0;j<mSIZE;j++) temp[i][j]=memery[j]; } for(i=mSIZE;i<pSIZE;i++) { /*判断新页面号是否在物理块中*/
操作系统课程第七次实验报告
姓名 任课教师 实验地点 实验时间 实验课表 现
学号 指导教 贺辉 师 综合楼 B102 2012-9-26 出勤和个人表现 Q1(15+15 (组长评分)=30 分) 实验完成情况 Q2(45 分(组 长与教师评分的加权平 均))
系 贺辉 评阅教师
计算机 贺辉
得分: 得分:
/*物理块数*/
#define PROESS_SIZE 8 /*页面号引用串个数*/#include <stdio.h> #include <stdlib.h> /*全局变量*/ int mSIZE=4; int pSIZE=8; static int memery[4]={0}; /*物理块中的页号*/ static int page[8]={0}; /*页面号引用串*/ static int temp[8][4]={0}; /*辅助数组*/ /*置换算法函数*/ void FIFO(); void LRU(); void OPT(); void designBy(); /*辅助函数*/ void print(unsigned int t); /*主函数*/ int main() { int i,k,code; designBy(); system("color 0A"); puts("请依次输入页面号(8 个):"); for(i=0;i<pSIZE;i++) scanf("%1d",&page[i]); system("cls"); system("color 0E"); do{ puts("输入的页面号引用串为:"); for(k=0;k<=(pSIZE-1)/20;k++) { for(i=20*k;(i<pSIZE)&&(i<20*(k+1));i++) { if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1))) printf("%d\n",page[i]); else printf("%d ",page[i]); } } printf("* * * * * * * * * * * * * * * * * * * * * * *\n"); printf("* 请选择页面置换算法:\t\t\t *\n"); printf("* ----------------------------------------- *\n"); printf("* 1.先进先出(FIFO) 2.最近最久未使用(LRU) *\n"); printf("* 3.退出 *\n");
designB y() 0 1
作者信息显示
Main()
用FIFO算法实现
1 FIFO()
1 LRU
用LRU算法实 现 退出
EXIT()
2
实现结果:
PRINT()
2
显示内存页框每次 置换结果
图1
图2
代码:
#include <stdio.h> #include <stdlib.h> #define MEMORY_SIZE 4
实验过程中遇到的问题解决办法与实验体会 Q4(需手写,10 得分: 分) 1、在 FIFO 算法可以很容易用数组实现,而 LRU 算法可以用数组实现,不过用结 构体会更明显简单。结构体成员变量可以记录页号进入的时间,和最近使用的记 录。相对比数组更容易理解和实现。 2:首先,FIFO(先进先出)算法和 LRU(最近未使用算法)两者之间,FIFO 算法 明显会比 LRU 容易理解,而且比 LRU 算法较容易实现,但在性能方面,LRU 的 确在优化方面做的比较理想。再且在考虑页框和页表号之间的问题用代码可以容 易模拟,但是真是在物理内存块中是如何实现,那确实是很难以理解,需要真正 理解到内存内部的知识才知道这两个算法是怎么实现的。 评阅教师特殊评语:
for(j=0,k=0;j<mSIZE;j++) { if(memery[j]!=page[i]) k++; } if(k==mSIZE) /*如果不在物理块中*/ { count++; /*计算换出页*/ max=time[0]<time[1]?0:1; for(m=2;m<mSIZE;m++) if(time[m]<time[max]) max=m; memery[max]=page[i]; time[max]=i; /*记录该页进入物理块的时间*/ for(j=0;j<mSIZE;j++) temp[i][j]=memery[j]; } else { for(j=0;j<mSIZE;j++) temp[i][j]=memery[j]; } } 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;i<mSIZE;i++) { memery[i]=page[i]; flag[i]=i; for(j=0;j<mSIZE;j++) temp[i][j]=memery[j]; } for(i=mSIZE;i<pSIZE;i++)