操作系统概念 页面置换算法:分别使用FIFOOPTLRU三种置换算法来模拟页面置换的过程。

Posted yindehao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统概念 页面置换算法:分别使用FIFOOPTLRU三种置换算法来模拟页面置换的过程。相关的知识,希望对你有一定的参考价值。

关于页面置换算法的理论知识:

https://www.bilibili.com/video/BV1YE411D7nH?p=45

C++代码实现(未优化)

#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
int frame_length;//帧个数 
int string_length;
char *st;//串 

int Max(int *st,int length)
{
	int max = st[0];
	int max_index=0;
	for(int i=1;i<length;i++)
	{
		if(max<st[i])
		{
			max = st[i];
			max_index = i;
		}
	}
	return max_index;
}
int Far(char *frame,char *st,int i,int string_length) 
{
	int len1 = strlen(frame);
	int len2 = string_length;
	int *distances;
	distances = new int[len1];//储存各帧到下一个相同字符的距离 
	for(int j=0;j<len1;j++)		//初始将距离设置为无穷大 
		distances[j]=65535;
	for(int k=0;k<len1;k++)
	{
		for(int j=i+1;j<len2&&(distances[k]==65535);j++)
		{
			if(st[j]==frame[k])
				distances[k]=j-i;
		}
	}
	return Max(distances,len1);
}
int Past(char *frame,char *st,int i,int string_length) 
{
	int len1 = strlen(frame);
	int len2 = string_length;
	int *distances;
	distances = new int[len1];//储存各帧到下一个相同字符的距离 
	for(int j=0;j<len1;j++)		//初始将距离设置为无穷大 
		distances[j]=65535;
	for(int k=0;k<len1;k++)
	{
		for(int j=i-1;j>=0&&(distances[k]==65535);j--)
		{
			if(st[j]==frame[k])
				distances[k]=i-j;
		}
	}
	return Max(distances,len1);
}


void FIFO(char *st,int frame_length,int string_length)
{
	int len=string_length;
	char *frame; 
	int *life;
	int misno = 0; //错误次数 
	frame = new char[frame_length+1];//页帧 
	life = new int[frame_length];//各帧的占用时间
	for(int i=0;i<frame_length;i++) 
		life[i] = 0;
	cout<<"FIFO:"<<endl; 
	for(int i=0;i<frame_length;i++)//页帧未满时 
	{
		misno++;
		frame[i] = st[i];
		cout<<st[i]<<‘,‘;
		for(int j=0;j<frame_length;j++)
		{
			if(j<=i)
			{
				cout<<frame[j]<<‘ ‘;
				life[j]++;
			}	
			else
				cout<<‘*‘<<‘ ‘;
		}
		cout<<endl;
	}
	int flag;
	for(int i=frame_length;i<len;i++)//遍历引用串 
	{ 
		flag = 0;//flag判断引用字符是否在内存中 
		for(int j=0;j<frame_length&&!flag;j++)
		{
			if(st[i]==frame[j])
				flag=1;//引用已经在内存中,结束循环 
		}
		
		if(!flag)//引用字符不在内存中 
		{
			int max =  Max(life,frame_length);//选出最旧的帧 
			frame[max] = st[i];
			life[max] = 0;
			for(int j=0;j<frame_length;j++)
				life[j]++;
			misno++;
			cout<<st[i]<<‘,‘;
			for(int j=0;j<frame_length;j++)
				cout<<frame[j]<<‘ ‘;
			cout<<endl;
		}
		else
		{
			for(int j=0;j<frame_length;j++)
				life[j]++;
			flag = 0;
			cout<<st[i]<<endl;
		}
		
	}
	cout<<"错误次数:"<<misno<<endl;
}
void OPT(char *st,int frame_length,int string_length)
{
	int len=string_length;
	char *frame; 
	int *life;
	int misno = 0; //错误次数 
	frame = new char[frame_length+1];//页帧 
	cout<<"OPT:"<<endl; 
	for(int i=0;i<frame_length;i++)//页帧未满时 
	{
		misno++;
		frame[i] = st[i];
		cout<<st[i]<<‘,‘;
		for(int j=0;j<frame_length;j++)
		{
			if(j<=i)
			{
				cout<<frame[j]<<‘ ‘;
			}	
			else
				cout<<‘*‘<<‘ ‘;
		}
		cout<<endl;
	}
	int flag;
	for(int i=frame_length;i<len;i++)//遍历引用串 
	{ 
		flag = 0;//flag判断引用字符是否在内存中 
		for(int j=0;j<frame_length&&!flag;j++)
		{
			if(st[i]==frame[j])
				flag=1;//引用已经在内存中,结束循环 
		}
		
		if(!flag)//引用字符不在内存中 
		{
			int max =  Far(frame,st,i,string_length);//选出离得最远的帧 
			frame[max] = st[i];
			misno++;
			cout<<st[i]<<‘,‘;
			for(int j=0;j<frame_length;j++)
				cout<<frame[j]<<‘ ‘;
			cout<<endl;
		}
		else
		{
			flag = 0;
			cout<<st[i]<<endl;
		}	
	}
	cout<<"错误次数:"<<misno<<endl;
}
void LRU(char *st,int frame_length,int string_length)
{
	int len=string_length;
	char *frame; 
	int misno = 0; //错误次数 
	frame = new char[frame_length+1];//页帧 
	cout<<"LRU:"<<endl; 
	for(int i=0;i<frame_length;i++)//页帧未满时 
	{
		misno++;
		frame[i] = st[i];
		cout<<st[i]<<‘,‘;
		for(int j=0;j<frame_length;j++)
		{
			if(j<=i)
			{
				cout<<frame[j]<<‘ ‘;
			}	
			else
				cout<<‘*‘<<‘ ‘;
		}
		cout<<endl;
	}
	int flag;
	for(int i=frame_length;i<len;i++)//遍历引用串 
	{ 
		flag = 0;//flag判断引用字符是否在内存中 
		for(int j=0;j<frame_length&&!flag;j++)
		{
			if(st[i]==frame[j])
				flag=1;//引用已经在内存中,结束循环 
		}
		
		if(!flag)//引用字符不在内存中 
		{
			int max =  Past(frame,st,i,string_length);//选出离得最远的帧 
			frame[max] = st[i];
			misno++;
			cout<<st[i]<<‘,‘;
			for(int j=0;j<frame_length;j++)
				cout<<frame[j]<<‘ ‘;
			cout<<endl;
		}
		else
		{
			flag = 0;
			cout<<st[i]<<endl;
		}	
	}
	cout<<"错误次数:"<<misno<<endl;
}

int main()
{
	ifstream infile("page.txt");
	infile>>frame_length;
	infile>>string_length;
	st = new char[string_length+1];
	for(int i=0;i<string_length;i++)
	{
		infile>>st[i];
	}	
	cout<<endl;	
	FIFO(st,frame_length,string_length);
	cout<<endl;
	LRU(st,frame_length,string_length);
	cout<<endl;
	OPT(st,frame_length,string_length);
	cout<<endl;
	return 0;
}

 

以上是关于操作系统概念 页面置换算法:分别使用FIFOOPTLRU三种置换算法来模拟页面置换的过程。的主要内容,如果未能解决你的问题,请参考以下文章

操作系统-内存页面分配策略和页面置换算法

操作系统-内存页面分配策略和页面置换算法

操作系统--存储管理4

操作系统王道考研 p45 页面置换算法:最jia置换算法先进先出置换算法最近最久未使用置换算法时钟置换算法改进型的时钟置换算法

操作系统 页面置换算法LRU和FIFO

页面置换算法