⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 4best.cpp

📁 模拟操作系统中可变分区管理方式的主存分配回收的方式
💻 CPP
字号:
#include<iostream.h>
#include<stdlib.h>
#include<math.h>
const int maxmemory=80;
const int maxproc=maxmemory/2;
const int atime=500;
struct  node{
	int  name;
	 int begin;
	  int end;
	   int status;
	    int time;
};
class  list
{
private:
	 node  use[maxmemory];
	 node unuse[maxmemory];
	 int  worklist[maxmemory];
	 int  worknum;
public:
	list()
	{
		for(int i=0;i<maxmemory;i++)
		{
			use[i].name=i;
			unuse[i].name=i;
			use[i].status=0;
			unuse[i].status=0;
			use[i].time=0;
			unuse[i].time=0;
		}
		unuse[0].begin=0;
		unuse[0].end=maxmemory-1;
		unuse[0].status=1;
		worknum=0;
	}
	void integrate()
	{
		int flag[maxmemory],start=0;
		 for(int i=0;i<maxmemory;i++)
			 if(use[i].status==1)
				 flag[i]=1;
			  else
				  flag[i]=0;
			  for(i=0;i<maxmemory;i++)
			  {
				  int min=maxmemory+1,tag=-1;
				    for(int j=0;j<maxmemory;j++)
						if(use[j].status==1&&flag[j]==1&&use[j].begin<min)
						{
							min=use[j].begin;
							 tag=j;
						}
						if(tag!=-1&&use[tag].begin!=start)
						{
						   show(tag,3,5);
					    	use[tag].end=use[tag].end-use[tag].begin+start;
                             use[tag].begin=start;
							  start=use[tag].end+1;
							   flag[tag]=0;
						}
						else
							if(tag!=-1)
							{
								start=use[tag].end+1;
								 flag[tag]=0;
							}
						unuse[i].status=0;
			  }
		unuse[0].status=1;
		 unuse[0].begin=start;
		  unuse[0].end=maxmemory-1;
	}
	/*void integrate()
	{
		int start=0;
		for(int i=0;i<maxmemory;i++)
		{
			 if(use[i].status==1)
			 {
				show(i,3,5);
				 int temp=use[i].end-use[i].begin;
				  use[i].begin=start;
				   use[i].end=use[i].begin+temp;
				    start=use[i].end+1;
			 }
			 unuse[i].status=0;
		}
		unuse[0].status=1;
		 unuse[0].begin=start;
		  unuse[0].end=maxmemory-1;
	}*/
	int findmin(int size)
	{
		int minsize=maxmemory+1,flag=-1;
		for(int i=0;i<maxmemory;i++)
			if(unuse[i].status==1&&(unuse[i].end-unuse[i].begin+1)>=size&&(unuse[i].end-unuse[i].begin+1)<minsize)
			{
				if((unuse[i].end-unuse[i].begin+1)==size)
					return i;
				 else
				 {
					 minsize=unuse[i].end-unuse[i].begin+1;
					  flag=i;
				 }
			}
			return flag;
	}
	int creatework()
	{
		if(worknum<=0)
		{
			int size;
			 cout<<"请输入作业的大小!(不超过"<<maxmemory<<")"<<endl;
			  cin>>size;
			   if(size>maxmemory||size<=0)
				   cout<<"你输入的作业太大或太小,无法运行!"<<endl;
			   else
			   {
				   int flag=findmin(size);
				   int sum=0;
				       for(int i=0;i<maxmemory;i++)
					      if(unuse[i].status==1)
						     sum+=unuse[i].end-unuse[i].begin+1;
				    if(flag==-1&&sum<size)
					{
						 worklist[worknum]=size;
						  worknum++;
						   return 0;
					}
					else
					{
						if(flag==-1)
						{
							integrate();
							 flag=0;
						}
							int tag=-1;
							for(int i=0;i<maxmemory&&tag<=-1;i++)
								if(use[i].status==0)
									tag=i;
								if(tag==-1)
								{
									cout<<"已分配表已经满了,无法填写分配表!!"<<endl;
										return -1;
								}
								else
								{
									use[tag].begin=unuse[flag].begin;
									use[tag].end=use[tag].begin+size-1;
									use[tag].time=(int(sqrt(size))+1)*atime;
									use[tag].status=1;
									unuse[flag].begin+=size;
									if(unuse[flag].begin>unuse[flag].end)
										unuse[flag].status=0;
									  show(tag,0,3);
									return 1;
								}
					}
			   }
		}
		else
		{
			int flag=findmin(worklist[0]);
			  int sum=0;
				  for(int i=0;i<maxmemory;i++)
					  if(unuse[i].status==1)
						  sum+=unuse[i].end-unuse[i].begin+1;
			 if(flag==-1&&sum<worklist[0])
						  return 0;
			 else
			 {
				 if(flag==-1)
				 {
					 integrate();
					  flag=0;
				 }
							int tag=-1;
							for(int i=0;i<maxmemory&&tag==-1;i++)
								if(use[i].status==0)
									tag=i;
								if(tag==-1)
								{
									cout<<"已分配表已经满了,无法填写分配表!"<<endl;
										return -1;
								}
								else
								{
									use[tag].begin=unuse[flag].begin;
									use[tag].end=use[tag].begin+worklist[0]-1;
									use[tag].status=1;
									use[tag].time=(int(sqrt(worklist[0]))+1)*atime;
									unuse[flag].begin+=worklist[0];
									if(unuse[flag].begin>unuse[flag].end)
										unuse[flag].status=0;
									for(int j=0;j<worknum-1;j++)
										worklist[j]=worklist[j+1];
									      worknum--;
										   show(tag,0,3);
										  return 1;
								}
			 }
		}
		return -1;
	}
	void  recycled()
	{
		for(int i=0;i<maxmemory;i++)
			if(use[i].status==1&&use[i].time<=0)
			{
					   int p=-1;
					    for(int j=0;j<maxmemory&&p<=-1;j++)
							if(unuse[j].status==0)
								p=j;
							if(p<=-1)
							{
								cout<<"空闲表满了!"<<endl;
								exit(0);
							}
							else
							{
							   show(i,2,5);
								unuse[p].status=1;
								 unuse[p].begin=use[i].begin;
								  unuse[p].end=use[i].end;
								   use[i].status=0;
							}
			}
			for(i=0;i<maxmemory;i++)
				for(int j=0;j<maxmemory;j++)
				{
					if(unuse[i].status==1&&unuse[j].status==1&&i!=j)
					{
						if(unuse[i].begin==unuse[j].end+1)
						{
							unuse[i].begin=unuse[j].begin;
							 unuse[j].status=0;
						}
						else
							if(unuse[j].begin==unuse[i].end+1)
							{
								unuse[i].end=unuse[j].end;
								unuse[j].status=0;
							}
					}
				}
			for(i=0;i<maxmemory;i++)
				if(use[i].status==1&&use[i].time>0)
				{
					show(i,1,5);
					use[i].time-=atime;
				}
	}
	 void cls()
	 {
		 char cls[4]="cls";
		 system(cls);
	 }
	 void show(int tag,int type,int times)//type==0表示加入进程,1表示运行进程,2表示运行完毕,3表示合并区间
	 {
		 int flag=65,temp=97;
		 char ch[maxmemory];
		 for(int i=0;i<maxmemory;i++)
		 {
			 if(use[i].status==1)
			 {
				 for(int j=use[i].begin;j<=use[i].end;j++)
					 ch[j]=char(flag);
				 if(i==tag)
					 temp=flag;
				  flag++;
			 }
		 }
		 for(i=0;i<maxmemory;i++)
			 if(!(ch[i]>='A'&&int(ch[i])<flag))
				 ch[i]='-';
			 times=3;
			 for(i=0;i<times;i++)
			 {
				 if(i%2==0)
				 {
					 cls();
					 cout<<"                  可变分区管理方式的主存分配回收模拟"<<endl<<endl;
					 for(int j=use[tag].begin;j<=use[tag].end;j++)
						  ch[j]=char(temp);
					 for( j=0;j<maxmemory;j++)
						 cout<<ch[j];
					 cout<<endl;
				 }
				 else
				 {
					 cls();
					 cout<<"                  可变分区管理方式的主存分配回收模拟"<<endl<<endl;
					  for(int j=use[tag].begin;j<=use[tag].end;j++)
						  ch[j]=' ';
					  for(j=0;j<maxmemory;j++)
						  cout<<ch[j];
					  cout<<endl;
				 }
				 if(type==0)
					 cout<<"    位于区间"<<use[tag].begin<<"---"<<use[tag].end<<"的作业被载入!"<<endl;
				 else
					 if(type==1)
						 cout<<"    位于区间"<<use[tag].begin<<"---"<<use[tag].end<<"的作业在运行!"<<endl;
					 else
						 if(type==2)
							 cout<<"    位于区间"<<use[tag].begin<<"---"<<use[tag].end<<"的作业运行完毕,被回首!"<<endl;
						  else
							  cout<<"    空余区间进行合并!"<<endl;
						 cout<<"    作业队列中的情况如下:"<<endl;
						  if(worknum>0)
						  { 
							  cout<<"    ";
							  for(int x=0;x<worknum;x++)
								  cout<<worklist[x]<<"--";
							  cout<<endl;
						  }
						  else
							  cout<<"        作业队列中为空!"<<endl;
						for(int k=0;k<50;k++)
							 for(int p=0;p<500;p++)
								 cout<<' '<<'\b';
			 }
	 }
};
void main()
{
	list  mylist;
	while(1)
	{     
		  mylist.creatework();
		   mylist.recycled();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -