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

📄 主存储器空间的分配和回收.cpp

📁 实现主存储备空间的的分配和回收
💻 CPP
字号:
// 主存储器空间的分配和回收.cpp : Defines the entry point for the console application.


#include "stdafx.h"
#include "iostream"
#include <string.h>

using namespace std;
#define M 128
struct jcb
{
	char name[4];
	int  start;
	int length;
	jcb *next;
};
struct kmen
{
	int start;
	int length;
	kmen *next;
};
struct men
{
	int total;
	jcb *header;
	kmen *b;
};
void init(men *m)
{
	jcb *head,tmp;

	strcpy(tmp.name,"p1");
	//tmp.name="p1";
	tmp.start =5;
	tmp.length=5;
	tmp.next=NULL;
	head=new jcb();
	m->header=head;
	*head=tmp;
	head->next =new jcb();
	head=head->next ;
	//tmp.name="p2";
	strcpy(tmp.name,"p2");
	tmp.start =26;
	tmp.length =6;
	*head=tmp;
	head->next =new jcb();
	head=head->next ;
	//tmp.name="p3";
	strcpy(tmp.name,"p3");
	tmp.start =10;
	tmp.length =4;
	*head=tmp;
	kmen *hk,ht;
	ht.start=14;
	ht.length=12;
	ht.next=NULL;
	hk=new kmen();
	m->b=hk;
	*hk=ht;
	hk->next=new kmen();
	hk=hk->next;
	ht.start =32;
	ht.length=96;
	*hk=ht;
}
void dis(men *m)
{
	jcb *head=m->header ,*tmp=new jcb();
	
	kmen *km,*kt=NULL;
	km=m->b;	
	cout<<"要求分配内存的作业名:";
	//char nm[4];
	cin.clear ();
	cin>>tmp->name;
	//strcpy(,nm);
	//tmp->name=nm;
	
	cout<<"空间大小:";cin>>tmp->length;
	cout<<endl;
	tmp->next=NULL;
	tmp->start=0;
	if(km==NULL){cout<<"所有内存空间已用完."<<endl;return;}
	if(km->length >=tmp->length)
	{
		tmp->start=km->start;
		//kt=km;
		if(km->length ==tmp->length)
		{
			kt=km;
			km=km->next;
			//kt->next=NULL;
			m->b=km;
			if(head==NULL)m->header =tmp;
			else{
				while(head->next !=NULL)head=head->next ;
				head->next =tmp;
			}
			
			return;
		}
		kt=new kmen();
		kt->start =km->start ;
		kt->start +=tmp->length;
		kt->length =km->length -tmp->length ;
		kt->next =km->next ;
		km->next =NULL;
		m->b=kt;
		if(head==NULL)m->header =tmp;
		else{
			while(head->next !=NULL)head=head->next ;
			head->next =tmp;
		}
		return;
	}
	kt=km->next ;
	while(kt!=NULL)
	{
		//kt=km->next ;
		if(kt->length ==tmp->length )
		{
			tmp->start =kt->start ;
			if(head==NULL)m->header =tmp;
			else{
				while(head->next !=NULL)head=head->next ;
				head->next =tmp;
			}
			km->next =kt->next ;
			return;
		}
		if(kt->length >tmp->length)
		{
			tmp->start =kt->start ;
			if(head==NULL)m->header =tmp;
			else{
				while(head->next !=NULL)head=head->next ;
				head->next =tmp;
			}
			kt->start +=tmp->length ;
			kt->length -=tmp->length ;
			return;
		}
		km=kt;
		kt=km->next;
	}
	cout<<"不存在足够大的空间来运行该作业."<<endl;
}
void recy(men *m)
{
	jcb *head,*tmp=new jcb();
	kmen *km,*kc,*kt;
	cout<<"要求撤离内存的作业名:";
	//char nm[4];
	cin>>tmp->name;
	//=nm;
	tmp->length =0;
	km=m->b;
	head=m->header ;
	
	if(strcmp(head->name ,tmp->name)==0 )
	{
		tmp=head;
		m->header =head->next ;
		tmp->next =NULL;
	}
	while(head->next !=NULL)
	{
		
		if(strcmp(head->next ->name ,tmp->name)==0 )
		{
			tmp=head->next ;
			head->next =tmp->next ;
			tmp->next =NULL;
			break;
		}
		head=head->next ;
	}
	if(tmp->length ==0)
	{
		cout<<"不存在这样的作业."<<endl;
		return;
	}
	kt=new kmen();
	kt->length =tmp->length ;
	kt->start =tmp->start ;
	kt->next =NULL;

	if(km->start >kt->start )
	{
		if(km->start ==(kt->start +kt->length ))
		{
			km->start =kt->start ;
			km->length +=kt->length ;
			return;
		}
		kt->next =km;
		m->b=kt;
		return;
	}
	kc=km->next ;
	while(kc!=NULL)
	{
		int i=0;
		if(kc->start >kt->start )
		{
			if((km->start +km->length )==kt->start )
			{
				//km->start =kt->start ;
				km->length +=kt->length ;
				kt=km;
				i++;
			}
			if((kt->start +kt->length )==kc->start)
			{
				if(i==1){
					km->length +=kc->length ;
					km->next =kc->next ;
					kc->next =NULL;
					return;
				}
				kc->start =kt->start ;
				kc->length +=kt->length ;
				return;
			}
		}
	}
	
	km->next =kt;
	return;	


}
void out(men *m)
{
	
	jcb *head=m->header ;
	kmen *km;
	km=m->b;
	
	cout<<"-------主存分区一览-------"<<endl;
	cout<<"进程名\t起始地址\t长度"<<endl;
	while(head!=NULL)
	{
		cout<<head->name <<"\t"<<head->start <<"\t\t"<<head->length<<endl ;
		head=head->next ;		
	}
	int i=1;	

	cout<<"空区号\t起始地址\t长度"<<endl;
	while(km!=NULL)
	{
		cout<<i<<"\t"<<km->start <<"\t\t"<<km->length<<endl ;
		km=km->next ;
		i++;
	}
}
int main(int argc, char* argv[])
{
	men m;
	m.total =M;
	m.header=NULL;
	m.b=NULL;
	int ch;
	init(&m);
	while(true){
		cout<<endl;
		cout<<"1.分配空间\t2.回收空间\t3.打印内存\t其他.退出\t:";
		cin>>ch;
		cout<<endl;
		cout.flush();
		
		switch(ch){
		case 1:
			dis(&m);
			break;
		case 2:
			recy(&m);
			break;
		case 3:
			out(&m);
			break;		
		default:
			return 0;
		}
	}

	return 0;
}

⌨️ 快捷键说明

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