殷德好

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

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

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;
}

 

posted on 2020-06-02 23:28  殷德好  阅读(596)  评论(0编辑  收藏  举报

导航