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

操作系统: 最佳适配算法和邻近适配算法的模拟实现(内存分配算法)

时间:2015-12-27 23:35:59      阅读:864      评论:0      收藏:0      [点我收藏+]

标签:

实现动态分区的分配算法。

(1) 最佳适配算法:选择内存空闲块中最适合进程大小的块分配。

(2) 邻近适配算法:从上一次分配的地址开始查找符合要求的块,所查找到的第一个满足要求的空闲块就分配给进程。

模拟添加进程的时候,假定内存是一块完整的空闲区,对于算法(1)来说,分配的时候遍历所有的空闲内存块,找出其中最适合的一块,注意此时内存分区的总块数可能已经发生了变化;

对于算法(2)来说,则需要从上次分配的内存块(使用变量记录即可)接着向下找到第一个满足条件的块即可,内存分区的总块可能也已经发生了变化。

模拟删除进程(释放内存)的时候,则需要注意如果当前内存块的上下有空闲块,则需要将其合并为一整个空闲块,也需要注意内存总块的数量变化。

最佳适配算法

#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
struct node
{
	int num;
	int is_data;
};
int main()
{
	vector<node> cluster;
	vector<node> TTemp;
	map <int,int> mp;
	mp.clear();
	node temp;
	int R_num;
	int curnum;
	
	temp.is_data=0;
	temp.num=10;
	cluster.push_back(temp);
   
    cout<<"请使用add命令添加一个进程,delete命令删除一个进程!"<<endl;
    while(1)
    {
   	   string s;
   	   cin>>s;
   	   if(s=="add")
   	   {
      	cout<<"请输入进程号及其的大小"<<endl;
	   	cin>>R_num>>curnum;

		int flag=0;
		int curIndex;
	
		int cmp=11;
    	for(int i=0;i<cluster.size();i++)
		{
			if(cluster[i].is_data==0&&cluster[i].num>=curnum)
			{
				flag=1;
				if(cluster[i].num-curnum<cmp)
				{
					curIndex=i;
					cmp=cluster[i].num-curnum;
				}
			}
		}
		if(flag)
		{
			cluster[curIndex].is_data=1;
			mp[R_num]=curIndex;

			node op;
			TTemp.clear();
			int is_flag=0;
			if(cluster[curIndex].num>curnum)
			{
				op.is_data=0;
				op.num=cluster[curIndex].num-curnum;
				is_flag=1;
			}

		for(int i=0;i<cluster.size();i++)
		{
			if(i==curIndex)
			{
				cluster[curIndex].num=curnum;
				TTemp.push_back(cluster[curIndex]);
				mp[R_num]=i;

				if(is_flag)
				{
					TTemp.push_back(op);
				}
			}
			else
			TTemp.push_back(cluster[i]);
		}
		
		cluster.swap(TTemp);
		
		
		for(int i=0;i<cluster.size();i++)
		cout<<"大小 "<<cluster[i].num<<"  是否分配 "<<cluster[i].is_data<<endl;
		
	}
	else
	{
		cout<<"内存不足!"<<endl;
	}
 }
   	      
     else if(s=="delete")
     {
   	   	  	int deletenum;
			cout<<"请输入删除的进程:"<<endl;
			cin>>deletenum;

		int i=mp[deletenum];
		while(--i>=0 && cluster[i].is_data==0)
		{
		
		}
		int j=mp[deletenum];
		while(++j<cluster.size() && cluster[j].is_data==0)
		{
		
		}

		node kk;
		kk.num=0;
		for(int e=i+1;e<=j-1;e++)
		{
			kk.num+=cluster[e].num;
		}	
		kk.is_data=0;

		TTemp.clear();
		for(int p=0;p<cluster.size();)
		{
			if(p==i+1)
			{
				p=j;
				TTemp.push_back(kk);
			}
			else{
				TTemp.push_back(cluster[p]);
	      		p++;
		}
		
	}
		cluster.swap(TTemp);
	
		for(int i=0;i<cluster.size();i++)
		cout<<"大小 "<<cluster[i].num<<"  是否分配 "<<cluster[i].is_data<<endl;

   	   }
   }
	return 0;
}

技术分享

邻近适配算法

#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
struct node
{
	int num;
	int is_data;
};
int main()
{
	vector<node> cluster;
	vector<node> TTemp;
	map <int,int> mp;
	mp.clear();
	node temp;
	int R_num;
	int curnum;
	int last_ID=0;
	temp.is_data=0;
	temp.num=10;
	cluster.push_back(temp);
   
    cout<<"请使用add命令添加一个进程,delete命令删除一个进程!"<<endl;
  
    while(1)
    {
   	   string s;
   	   cin>>s;
   	   if(s=="add")
   	   {
      	cout<<"请输入进程号及其的大小"<<endl;
	   	cin>>R_num>>curnum;

		int flag=0;
		int curIndex;
		
    	//for(int i=beg_pos;i<cluster.size();i++)
    	int i=last_ID+1;
    	while(1)
		{
			if(i==cluster.size())
			i=0;
			if(cluster[i].is_data==0&&cluster[i].num>=curnum)
			{
				flag=1;
			    curIndex=i;
			    break;
			}
			i++;
		}
		if(flag)
		{
			cluster[curIndex].is_data=1;
			mp[R_num]=curIndex;

			node op;
			TTemp.clear();
			int is_flag=0;
			if(cluster[curIndex].num>curnum)
			{
				op.is_data=0;
				op.num=cluster[curIndex].num-curnum;
				is_flag=1;
			}

		for(int i=0;i<cluster.size();i++)
		{
			if(i==curIndex)
			{
				cluster[curIndex].num=curnum;
				TTemp.push_back(cluster[curIndex]);
				mp[R_num]=i;
                last_ID=i; 
				if(is_flag)
				{
					TTemp.push_back(op);
				}
			}
			else
			TTemp.push_back(cluster[i]);
		}
		
		cluster.swap(TTemp);
		
		for(int i=0;i<cluster.size();i++)
		cout<<"大小 "<<cluster[i].num<<"  是否分配 "<<cluster[i].is_data<<endl;
		
	}
	else
	{
		cout<<"内存不足!"<<endl;
	}
 }
   	      
     else if(s=="delete")
     {
   	   	  	int deletenum;
			cout<<"请输入删除的进程:"<<endl;
			cin>>deletenum;

		int i=mp[deletenum];
		while(--i>=0 && cluster[i].is_data==0)
		{
		
		}
		int j=mp[deletenum];
		while(++j<cluster.size() && cluster[j].is_data==0)
		{
		
		}

		node kk;
		kk.num=0;
		for(int e=i+1;e<=j-1;e++)
		{
			kk.num+=cluster[e].num;
		}	
		kk.is_data=0;

		TTemp.clear();
		for(int p=0;p<cluster.size();)
		{
			if(p==last_ID)
			last_ID=TTemp.size();
			if(p==i+1)
			{
				p=j;
				TTemp.push_back(kk);
			}
			else{
				TTemp.push_back(cluster[p]);
	      		p++;
		}
		
	}
		cluster.swap(TTemp);
	
		for(int i=0;i<cluster.size();i++)
		cout<<"大小 "<<cluster[i].num<<"  是否分配 "<<cluster[i].is_data<<endl;

   	   }
   }
	return 0;
}
技术分享

操作系统: 最佳适配算法和邻近适配算法的模拟实现(内存分配算法)

标签:

原文地址:http://blog.csdn.net/nk_test/article/details/50413665

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