一、实验名称:缺页中断统计
二、实验目的与要求
目的:通过本次实验,理解页面置换过程,加深对页式虚存管理的原理和实现过程的理解。
要求:设计和实现最佳页面置换算法,并统计缺页中断率。
三、实验内容
设系统为某一进程分配了3个物理块,引用串为:
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
设计和实现最佳置换算法,并统计缺页率。
四、代码实现
#include<iostream>
#include <iomanip>
using namespace std;
const int N=100;
int pool[N];//物理块
int str[N];//引用串
int n,m=0; //n:物理块个数,m:引用串元素个数
int sum=0;//中断次数
bool find(int t){//判断当前物理块中是否存在t
for(int i=0;i<n;i++){
if(pool[i]==t) return true;
}
return false;
}
int findfarest(int j,int pool[]){//找到要置换掉的位置
int tmp,far=j,farest;
for(int x=0; x<n; x++) {
for(int i=j; i++; i<m) {
if(pool[x]==str[i]) {
tmp=i;
if(far<tmp) {
far=tmp;
farest=x;
}
break;
}
}
}
return farest;
}
void replace(){ //最佳置换算法
sum=3; //前三个直接缺页中断
pool[0]=str[0],pool[1]=str[1],pool[2]=str[2];
int tmp=3;
for(int j=3; j<m; j++){
if(find(str[tmp])){ //在物理块中
tmp++;
}else{ //不在物理块中
int x=findfarest(j,pool); //物理块中某个值在串中最远的下标
pool[x]=str[tmp++];
sum++;//缺页中断次数加1
}
}
}
int main()
{
cout<<"请输入引用串顺序:"<<endl;
cin>>str[m++]; //7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
while(cin.get()!='\n')
cin>>str[m++];
cout<<"请输入系统分配的物理块个数:"<<endl;
cin>>n;
replace();
cout<<"执行次数: "<<m<<endl;
cout<<"缺页中断次数: "<<sum<<endl;
double s=double(sum*100)/m;
cout<<"缺页中断率:"<<setiosflags(ios::fixed)<<setprecision(2) <<s<<"%"<<endl;
}
五、运行结果截图
六、体会
首先物理块有n个,串中前n个元素一定产生中断,且前n个元素可以直接赋值到物理块中,然后还需要一个位置指针指向串的中元素,判断每个元素是否会发生缺页中断,如果在当前物理块中存在,则指针向后移动一个位置;若不存在,则需要找物理块中的某个元素在串中是最远的,然后置换该元素,同时移动指针,统计中断次数。串中有几个元素就需要执行几次,最后用缺页次数/执行次数算出缺页中断率。
!最后一个实验作业,哈哈哈 !