系统结构实验二
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二计算机存储体系的页面替换算法(3学时)
一、实验目的
当计算机内存已满而又发生页面失效时,替换算法就要选择主存中哪个页作为被替换的页。通过本实验可以帮助学生理解虚拟存储器中页面替换的基本思想,深刻体会各种页面替换算法的性能差异。
二、实验环境
开发工具使用windows平台下的vc++6.0。
三、实验内容
编写一个模拟算法,模拟实现虚拟存储器的先进先出、近期最少使用、优化等算法。在程序设计的过程中,要求体会各种页面替换算法的优点和缺点,并计算出各种替换算法的命中率。
四、实验结果及完成情况
一、整个实验过程的思路可以整理如下:
1、初始化虚拟存储空间。
定义void DataInput()用来申请物理块BlockNum和页面数DataMax
2、产生一个随机调用页面的序列。
void DataInput()还可以随机成生调用页面序列
3、实现各种页面替换算法。
void FIFO(); // FIFO 先进先出算法函数
void Optimal(); // Optimal优化替换算法函数
void LRU(); // LRU近期最少使用算法函数
4、计算各种页面替换算法的命中率。
void DataOutput()用来显示数据和命中率
主要变量和函数:
const int DataMax=100;
const int BlockNum = 10;
int DataShow[BlockNum][DataMax]; // 用于存储要显示的数组
bool DataShowEnable[BlockNum][DataMax]; // 用于存储数组中的数据是否需要显示int Data[DataMax]; // 保存数据
int Block[BlockNum]; // 物理块
int count[BlockNum]; // 计数器
int N ; // 页面个数
int M;//最小物理块数
int ChangeTimes;
void DataInput(); // 输入数据的函数
void DataOutput();//输出数据的函数
void FIFO(); // FIFO 先进先出算法函数
void Optimal(); // Optimal优化替换算法函数
void LRU(); // LRU近期最少使用算法函数
二、实验中的几点注意事项:
1.虚拟存储空间的大小要合适。
2.根据能够存储页面的多少确定随机调用页面的序列。
五、主要代码:
void FIFO()
{
int i,j;
bool find;
int point;
int temp; // 临时变量
ChangeTimes = 0;
for(j=0;j for(i=0;i DataShowEnable[j][i] = false; // 初始化为false,表示没有要显示的数据 for(i=0;i { count[i] = 0; // 大于等于BlockNum,表示块中没有数据,或需被替换掉所以经这样初始化(3 2 1),每次替换>=3的块,替换后计数值置1,同时其它的块计数值加1,成了(1 3 2 ),见下面先进先出程序段 } for(i=0;i {// 增加count for(j=0;j count[j]++; find = false; // 表示块中有没有该数据 for(j=0;j { if( Block[j] == Data[i] ) { find = true; } } if( find ) continue; // 块中有该数据,判断下一个数据块中没有该数据 ChangeTimes++; // 缺页次数++ if( (i+1) > M ) // 因为i是从0开始记,而M指的是个数,从1开始,所以i+1 {//获得要替换的块指针 temp = 0; for(j=0;j { if( temp < count[j] ) { temp = count[j]; point = j; // 获得离的最远的指针 } } } else point = i; // 替换 Block[point] = Data[i]; count[point] = 0; // 更新计数值 for(j=0;j { DataShow[j][i] = Block[j]; DataShowEnable[i } } cout<< endl<<"FIFO算法:"<< endl;// 输出信息 DataOutput(); } void Optimal() { int i,j,k; bool find; int point; int temp; // 临时变量,比较离的最远的时候用 ChangeTimes = 0; for(j=0;j for(i=0;i DataShowEnable[j][i] = false; // 初始化为false,表示没有要显示的数据 for(i=0;i { find = false; // 表示块中有没有该数据 for(j=0;j { if( Block[j] == Data[i] ) find = true; } if( find ) continue; // 块中有该数据,判断下一个数据块中没有该数据,最优算法ChangeTimes++; // 缺页次数++ for(j=0;j {// 找到下一个值的位置 find = false; for( k =i;k { if( Block[j] == Data[k] ) { find = true; count[j] = k; break;