目录

1.算法原理

2.实验要求

3.算法流程图

 4.代码分析

1.max函数的构建

2.found函数的构建

3.IN函数的构建

4.print函数的构建

5.主函数的构建

6.总代码

5.测试结果及其分析


1.算法原理

基本思想是所选择的被淘汰页面,将是以后永不使用的,或是在最长(未来)时间内不再被访问的页面。采用最佳置换算法,可保证获得最低的缺页率。

2.实验要求

在某请求分页管理系统中,作业执行时依次访问如下页面:1,4,3,1,2,5,1,4,2,1,4,5,分配给该作业的主存块数为3

3.算法流程图

最佳置换算法java代码 最佳置换算法流程图_开发语言

 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.测试结果及其分析

测试数据就用实验要求给出的

最佳置换算法java代码 最佳置换算法流程图_开发语言_02

 测试结果分析

起始

输入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