目录
1.算法原理
基本思想是所选择的被淘汰页面,将是以后永不使用的,或是在最长(未来)时间内不再被访问的页面。采用最佳置换算法,可保证获得最低的缺页率。
2.实验要求
在某请求分页管理系统中,作业执行时依次访问如下页面:1,4,3,1,2,5,1,4,2,1,4,5,分配给该作业的主存块数为3
3.算法流程图
4.代码分析
1.max函数的构建
int max(int c[3]){//找出内存三个页面距离下一次使用时间最长的页面索引
int temp=c[0],index=0;
for(int i=1;i<3;i++){
if(c[i]>temp){
temp=c[i];
index=i;
}
}
return index;
}
输入为数组C,C是用来存储内存三个页面对应的距离从b[0]开始下一次使用的时间
通过for循环找出最大值,将其索引值返回
2.found函数的构建
void found(int a[3],int b[100],int start,int n,int c[3]){//寻找页面内三个进程距离下一次使用的时间
for(int i=0;i<3;i++){
for(int j=start+1;j<n;j++){
if(b[j]==a[i]){
c[i]=j;
break;
}
}
if(c[i]==0){
c[i]=999;//如果之后不再使用这个页面,就会把这个页面还需时间置为很大
}
}
}
输入为数组a(处于内存中的三个页面),数组b(即将要进入内存的页面总集),数组c,start(数组b中要进入内存的第start个),n(页面总数)
从start+1开始找与内存三个页面的时间,即间距,如果在后面都找不到,设为999
3.IN函数的构建
int IN(int a[3],int temp){//判断需要顶替的页面是否在内部
int flag=0;
for(int i=0;i<3;i++){
if(a[i]==temp){
flag=1;
break;
}
}
return flag;
}
IN函数输入为内存的三个页面以及即将进入内存的页面,是为了判断内存页面中是否和它重复
如果重复,则flag置为1,否则不变,还是0,最后返回flag
4.print函数的构建
void print(int a[3],int b[100],int n,int start){
int c[3]={0},m;
if(IN(a,b[start])==0){//如果不在内部,则需要更改
found(a,b,start,n,c);
m=max(c);
a[m]=b[start];
}
cout<<"现在进入第"<<start<<"次进入内存:"<<endl;
cout<<"现在系统内的三个页面为:"<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;
}
输入为数组a(处于内存中的三个页面),数组b(即将要进入内存的页面总集),start(数组b中要进入内存的第start个),n(页面总数)
定义数组c,用来储存内存三个页面对应的距离下一次使用的时间,其实是从b中0开始的索引值
如果即将进入内存的页面在内存中,则无需更改
否则需要调用found来找到需要替换的页面,并更改
最后输出
5.主函数的构建
int main(){
int a[3],b[100],n;
for(int i=0;i<3;i++){
cout<<"请输入第"<<i<<"个页面:";
cin>>a[i];
}
cout<<"现在系统内的三个页面为:"<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;
cout<<"请按时间先后顺序输入即将进入系统的页面数目:";
cin>>n;
for(int i=0;i<n;i++){
cin>>b[i];
}//需要所有进程输入完才能判断谁用的时间久
for(int i=0;i<n;i++){
print(a,b,n,i);
}
return 0;
}
6.总代码
#include<iostream>
using namespace std;
int max(int c[3]){//找出内存三个页面距离下一次使用时间最长的页面索引
int temp=c[0],index=0;
for(int i=1;i<3;i++){
if(c[i]>temp){
temp=c[i];
index=i;
}
}
return index;
}
void found(int a[3],int b[100],int start,int n,int c[3]){//寻找页面内三个进程距离下一次使用的时间
for(int i=0;i<3;i++){
for(int j=start+1;j<n;j++){
if(b[j]==a[i]){
c[i]=j;
break;
}
}
if(c[i]==0){
c[i]=999;//如果之后不再使用这个页面,就会把这个页面还需时间置为很大
}
}
}
int IN(int a[3],int temp){//判断需要顶替的页面是否在内部
int flag=0;
for(int i=0;i<3;i++){
if(a[i]==temp){
flag=1;
break;
}
}
return flag;
}
void print(int a[3],int b[100],int n,int start){
int c[3]={0},m;
if(IN(a,b[start])==0){//如果不在内部,则需要更改
found(a,b,start,n,c);
m=max(c);
a[m]=b[start];
}
cout<<"现在进入第"<<start<<"次进入内存:"<<endl;
cout<<"现在系统内的三个页面为:"<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;
}
int main(){
int a[3],b[100],n;
for(int i=0;i<3;i++){
cout<<"请输入第"<<i<<"个页面:";
cin>>a[i];
}
cout<<"现在系统内的三个页面为:"<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;
cout<<"请按时间先后顺序输入即将进入系统的页面数目:";
cin>>n;
for(int i=0;i<n;i++){
cin>>b[i];
}//需要所有进程输入完才能判断谁用的时间久
for(int i=0;i<n;i++){
print(a,b,n,i);
}
return 0;
}
5.测试结果及其分析
测试数据就用实验要求给出的
测试结果分析
起始 | 输入1 | 2 | 5 | 1 | 4 | 2 | 1 | 4 | 5 | |
a[0] | 1 | 1(2) | 1(2) | 1 | 1 | 1(6) | 1 | 1 | 1(999) | 5 |
a[1] | 4 | 4(3) | 4(3) | 4 | 4 | 4(7) | 4 | 4 | 4(999) | 4 |
a[2] | 3 | 3 (999) | 2(4) | 5 | 5 | 5(8) | 2 | 2 | 2(999) | 2 |