码迷,mamicode.com
首页 > 编程语言 > 详细

操作系统中的内存管理算法

时间:2016-05-31 20:39:15      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:

操作系统的内存管理算法主要分为最近最久未使用算法(LRU),最近最少使用算法(LFU),先进先出算法,最优置换算法。这些算法都比较容易实现,在上课时做了一个课程实验,写了相关的程序:

#include  <iostream>
#include  <queue>
#include  <stack>
#include  <cstdio>
#include  <cstring>
#include  <cstdlib>
#include  <ctime>
#include  <set>
using namespace std;
const int maxn=320;
const int address_stream_length=320;
//int op[maxn]={70,0,10,20,0,30,0,40,20,30,0,30,20,10,20,0,10,70,0,10},lost,num,upper;
int op[maxn],lost,num,upper;
double target;
bool inmemory[35];

void optimization()
{
	set<int> task;
	for(int i=0;i<maxn;i++)
	{
		//cout<<"i="<<i<<endl;
		int page=op[i]/10+1;
		if(inmemory[page])
		{
			continue;
		}
		else
		{
			//cout<<"i="<<i<<" "<<"op[i]="<<op[i]<<" page="<<page<<endl;
			lost++;
			if(num<upper)
			{
				num++;
				inmemory[page]=true;
				task.insert(page);
			}
			else
			{
				int sum=0,out;
				bool count[maxn]={false};
				for(int j=i+1;j<maxn;j++)
				{
					if(inmemory[op[j]/10+1]&&!count[op[j]/10+1])
					{
						sum++;
						//cout<<"sum="<<sum<<endl;
						count[op[j]/10+1]=true;
						if(sum==upper)
						{
							out=op[j]/10+1;
							break;
						}
					}
				}
				if(sum<upper)
				{
					for(int j=1;j<=30;j++)
					{
						if(inmemory[j]&&!count[j])
						{
							out=j;
							break;
						}
					}
				}
				/*
				cout<<"out="<<out<<" before=";
				for(set<int>::iterator i=task.begin();i!=task.end();i++)
				  cout<<(*i)<<‘ ‘;
				cout<<"  after=";
				*/
				inmemory[out]=false;
				task.erase(task.find(out));
				task.insert(page);
				inmemory[page]=true;
				/*
				for(set<int>::iterator i=task.begin();i!=task.end();i++)
				  cout<<(*i)<<‘ ‘;
				cout<<endl;
				*/
			}
		}
	}
	task.clear();
}
void LRU()
{
	set<int> task;
	for(int i=0;i<maxn;i++)
	{
		int page=op[i]/10+1;
		if(inmemory[page])
		{
			continue;
		}
		else
		{
			lost++;
			//cout<<"i="<<i<<" page="<<page-1<<endl;
			if(num<upper)
			{
				task.insert(page);
				inmemory[page]=true;
				num++;
			}
			else
			{
				int sum=0;
				bool vis[maxn]={false};
				for(int j=i-1;j>=0;j--)
				{
					if(!vis[op[j]/10+1]&&inmemory[op[j]/10+1])
					{
						sum++;
						vis[op[j]/10+1]=true;
						if(sum==upper)
						{
							int out=op[j]/10+1;
							//cout<<"out="<<out-1<<endl;
							inmemory[out]=false;
							task.erase(task.find(out));
							inmemory[page]=true;
							task.insert(page);
							break;
						}
					}
				}
			}
		}
	}
	task.clear();
}
void FIFO()
{
	queue<int> task;
	for(int i=0;i<maxn;i++)
	{
		int page=op[i]/10+1;
		if(inmemory[page])
		{
			continue;
		}
		else
		{
			lost++;
			//cout<<"lost page="<<page<<endl;
			if(num<upper)
			{
				task.push(page);
				inmemory[page]=true;
				num++;
			}
			else
			{
				int tag=task.front();
				inmemory[tag]=false;
				task.pop();
				task.push(page);
				inmemory[page]=true;
			}
		}
	}
	while(!task.empty())
	{
		task.pop();
	}
}
void LFU()
{
	int cnt[35]={0};
	memset(cnt,0,sizeof(cnt));
	set<int> task;
	for(int i=0;i<maxn;i++)
	{
		int page=op[i]/10+1;
		if(inmemory[page])
		{
			cnt[page]++;
			continue;
		}
		else
		{
			lost++;
			//cout<<"i="<<i<<"  page="<<page<<endl;
			if(num<upper)
			{
				num++;
				cnt[page]++;
				inmemory[page]=true;
				task.insert(page);
			}
			else
			{
				int tag=0,minm=10000;
				for(int j=0;j<i;j++)
				{
					int page2=op[j]/10+1;
					if(inmemory[page2]&&cnt[page2]<minm)
					{
						tag=page2;
						minm=cnt[page2];
					}
				}
				//cout<<"out="<<tag<<endl;
				task.erase(task.find(tag));
				inmemory[tag]=false;
				task.insert(page);
				inmemory[page]=true;
				cnt[page]++;
			}
		}
	}
	task.clear();
}
int main()
{
	srand(time(NULL));
	upper=rand()%32+1;
	cout<<"Start memory management."<<endl;
	cout<<"Processing address flow,wait for while,please."<<endl;
	
	for(int i=0;i<160;i++)
		op[i]=rand()%320+1;
	for(int i=160;i<240;i++)
		op[i]=rand()%160+1;
	for(int i=240;i<320;i++)
		op[i]=rand()%160+160;
	
	cout<<"There are algorithms in the program"<<endl;
	cout<<"  1.Optimization algorithm"<<endl;
	cout<<"  2.Least recently used algorithm"<<endl;
	cout<<"  3.First in first out algorithm"<<endl;
	cout<<"  4.Least frequently used algorithm"<<endl;
	cout<<"Select an algorithm number,please:"<<endl;
	int tag;
	while(scanf("%d",&tag)!=EOF)
	{
		if(tag>=1&&tag<=4)
		{
			num=0;
			lost=0;
			memset(inmemory,false,sizeof(inmemory));
			if(tag==1)
				optimization();
			if(tag==2)
				LRU();
			if(tag==3)
				FIFO();
			if(tag==4)
				LFU();
			cout<<"lost="<<lost<<endl;
			target=1-double(lost)/address_stream_length;
			cout<<"The target="<<target<<endl;
			cout<<"Do you want to try again with another algorithm?(y/n)"<<endl;
			char ch;
			cin>>ch;
			if(ch==‘y‘)
				continue;
			else
				if(ch==‘n‘)
					break;
		}
		else
			cout<<"There is not the algorithm in the program"<<endl;
	}
	return 0;
}

  

操作系统中的内存管理算法

标签:

原文地址:http://www.cnblogs.com/northsnow95/p/5547247.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!