最近最久未使用页面置换算法(C语言)——大三操作系统实验

目录

1.算法原理

2.实验要求

3.算法流程图

4.代码分析 

1.定义结构体页面

2.long_max函数的构建

3.IN函数的构建

4.print函数的构建

5.主函数的构建

6.总代码

5.测试结果及其分析


1.算法原理

最近未访问的页面,将来一段时间也不会访问。利用局部性原理,根据一个进程在执行过程中过去的页面访问踪迹来推测未来的行为。最近的过去 → 最近的将来     思想:选择最近最久未使用的页面予以淘汰。利用页表中的访问字段,记录页面自上次被访问以来所经历的时间t,需要淘汰页面时,选择在内存页面中t值最大的,即最近最久未使用的页面予以淘汰。

2.实验要求

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

3.算法流程图

最近最久未使用页面置换算法(C语言)——大三操作系统实验_第1张图片

4.代码分析 

1.定义结构体页面

struct Page//定义结构体页面 
{
	int time;//已经待的时间 
	int number;//页面序号 
};

2.long_max函数的构建

int long_max(struct Page a[3]){//寻找出待在内存中时间最长的页面,并对相关time进行修改 
	int index=0,min_time=a[0].time;//初始值赋值为内存的第一个页面 
	for(int i=1;i<3;i++){//找出最大的time以及对应的页面 
		if(a[i].time>min_time){
			min_time=a[i].time;
			index=i;
		}
	}
	if(index==0){//如果是页面0,则将1,2的时间修改加一,因为它们这一轮没被顶替,需要等待一个时间段 
		a[1].time++;
		a[2].time++;
	}
	if(index==1){//如果是页面1 
		a[0].time++;
		a[2].time++;
	}
	if(index==2){//如果是页面2 
		a[1].time++;
		a[0].time++;
	}
	a[index].time=0;//将被顶替出的页面时间置位0,因为其是刚进来 
	return index;
}

输入为内存中的三个页面,函数是求内存中待时间最长的页面的索引值,并对三个页面时间进行修改

3.IN函数的构建

int IN(struct Page a[3],int temp){//找出即将进来的进程是否在内存的三个页面中 
	int flag=3;//flag为相同的页面,如果为3,说明不在 
	for(int i=0;i<3;i++){
		if(a[i].number==temp){
			flag=i;
			break;
		}
	}
	return flag;
}

IN函数输入为内存的三个页面以及即将进入内存的页面,是为了判断内存页面中是否和它重复

如果重复,则flag为重复的页面的索引值,如果没重复,就为3.

4.print函数的构建

void print(struct Page a[3],int temp){
	int index,m;
	index=IN(a,temp);//判断是否在里面 
	if(index!=3){//如果在 
		a[index].time=0;
		if(index==0){
			a[1].time++;
			a[2].time++;
		}
		if(index==1){
			a[0].time++;
			a[2].time++;
		}
		if(index==2){
			a[1].time++;
			a[0].time++;
		}
	}
	else{//如果不在,则number需要变化 
		m=long_max(a);//找出需要变化页面的索引 
		a[m].number=temp;
	}
	cout<<"现在系统内的三个页面为:"<

index其实就是重复的索引值,如果重复就对相应数据就行修改,否则就更新内存三页面再修改

最后输出

5.主函数的构建

int main(){
	struct Page a[3];
	struct Page b[100];
	int n;
	for(int i=0;i<3;i++){
		cout<<"请输入第"<>a[i].number;
		a[i].time=3-i;//即前三个时间为3,2,1 
	}
	cout<<"现在系统内的三个页面为:"<>n; 
	for(int i=0;i>b[i].number;
		print(a,b[i].number);
	}
}

数组a(处于内存中的三个页面),数组b(即将要进入内存的页面总集)

6.总代码

#include
using namespace std;

struct Page//定义结构体页面 
{
	int time;//已经待的时间 
	int number;//页面序号 
};

int long_max(struct Page a[3]){//寻找出待在内存中时间最长的页面,并对相关time进行修改 
	int index=0,min_time=a[0].time;//初始值赋值为内存的第一个页面 
	for(int i=1;i<3;i++){//找出最大的time以及对应的页面 
		if(a[i].time>min_time){
			min_time=a[i].time;
			index=i;
		}
	}
	if(index==0){//如果是页面0,则将1,2的时间修改加一,因为它们这一轮没被顶替,需要等待一个时间段 
		a[1].time++;
		a[2].time++;
	}
	if(index==1){//如果是页面1 
		a[0].time++;
		a[2].time++;
	}
	if(index==2){//如果是页面2 
		a[1].time++;
		a[0].time++;
	}
	a[index].time=0;//将被顶替出的页面时间置位0,因为其是刚进来 
	return index;
}

int IN(struct Page a[3],int temp){//找出即将进来的进程是否在内存的三个页面中 
	int flag=3;//flag为相同的页面,如果为3,说明不在 
	for(int i=0;i<3;i++){
		if(a[i].number==temp){
			flag=i;
			break;
		}
	}
	return flag;
}
void print(struct Page a[3],int temp){
	int index,m;
	index=IN(a,temp);//判断是否在里面 
	if(index!=3){//如果在 
		a[index].time=0;
		if(index==0){
			a[1].time++;
			a[2].time++;
		}
		if(index==1){
			a[0].time++;
			a[2].time++;
		}
		if(index==2){
			a[1].time++;
			a[0].time++;
		}
	}
	else{//如果不在,则number需要变化 
		m=long_max(a);//找出需要变化页面的索引 
		a[m].number=temp;
	}
	cout<<"现在系统内的三个页面为:"<>a[i].number;
		a[i].time=3-i;//即前三个时间为3,2,1 
	}
	cout<<"现在系统内的三个页面为:"<>n; 
	for(int i=0;i>b[i].number;
		print(a,b[i].number);
	}
}

5.测试结果及其分析

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

最近最久未使用页面置换算法(C语言)——大三操作系统实验_第2张图片

 测试结果分析

起始 输入1 2 5 1 4 2 1 4 5
a[0] 1(3) 1(0) 1(1) 1(2) 1(0) 1(1) 1(2) 1(0) 1(1) 1
a[1] 4(2) 4(3) 2(0) 2(1) 2(2) 4(0) 4(1) 4(2) 4(0) 4
a[2] 3(1) 3(2) 3(3) 5(0) 5(1) 5(2) 2(0) 2(1) 2(2) 5

最佳置换算法(C语言)——大三操作系统实验_西瓜妹妹的唯一男朋友的博客-CSDN博客

先进先出算法(c语言)——大三操作系统实验_西瓜妹妹的唯一男朋友的博客-CSDN博客

你可能感兴趣的:(操作系统,c语言,开发语言)