使用动态分区分配方式的模拟

使用动态分区分配方式的模拟

1、实验目的 了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区 存储管理方式及其实现过程的理解。
2、实验内容
(1)用 C 语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程 alloc( )和回收过程 free( )。其中,空闲分区通过空闲分区链来管理:在进行内存 分配时,系统优先使用空闲区低端的空间。
(2)假设初始状态下,可用的内存空间为 640KB,并有下列的请求序列:
•作业 1 申请 130KB。
•作业 2 申请 60KB。
•作业 3 申请 100KB。
•作业 2 释放 60KB。
•作业 4 申请 200KB。
•作业 3 释放 100KB。
•作业 1 释放 130KB。
•作业 5 申请 140KB。
•作业 6 申请 60KB。
•作业 7 申请 50KB
•作业 6 释放 60KB。 请分别采用首次适应算法和最佳适应算法,对内存块进行分配和回收,要求每次 分配和回收后显示出空闲分区链的情况。

#include<iostream>
#include<cstdlib>
#define Free 0//空闲状态 
#define Busy 1//已用状态 
#define OK 1//完成 
#define ERROR 0//出错 
#define MAX_length 640//定义最大主存信息 
using namespace std;
typedef int Status;
struct ElemType{
	int ID;
	int size;
	int address;
	int state;
};
typedef struct DulNode{
	ElemType data;
	struct DulNode *prior;
	struct DulNode *next;
}*DuLinkList;
DuLinkList block_first=NULL;
DuLinkList block_last=NULL;
Status alloc(int);//内存分配函数 
Status free(int);// 内存回收函数 
Status First_fit(int,int);//首次适应——地址从小到大 
Status Best_fit(int,int);// 最佳适应——空闲区从小到大排列 
void show();//查看分配 
Status Initblock();//开创带头节点的内存空间链表 
int main(){
	int ch;
	cout<<"1.首次适应算法                        2.最佳适应算法"<<endl;
	cout<<"****************************************************"<<endl;
	cout<<"请选择分配算法:";
	cin>>ch;
	Initblock();
	int choice;
	while(1){
		cout<<"************************************************"<<endl;
		cout<<"1.分配内存    2.回收内存         0.退出         "<<endl;
		cout<<"************************************************"<<endl;
		cout<<"请输入操作:";
		cin>>choice;
		if(choice==1)	{
			alloc(ch);
			show();
		}else if(choice==2){
			int ID;
			cout<<"请输入释放的分区号:";
			cin>>ID;
			free(ID);
			show();
		}else if(choice==0){
			break;
		}else cout<<"输入有误,请重试!"<<endl;
	}
	return 0;
}
Status Initblock(){
	block_first=new DulNode;
	block_last=new DulNode;
	block_first->prior=NULL;
	block_first->next=block_last;
	block_last->prior=block_first;
	block_last->next=NULL;
	block_last->data.ID=0;
	block_last->data.address=0;
	block_last->data.size=MAX_length;
	block_last->data.state=Free;
	return 0;
}
Status alloc(int ch){
	int ID,request;
	cout<<"请输入作业(分区号):";
	cin>>ID;
	cout<<"请输入需要分配的主存大小(单位 kb):";
	cin>>request;
	if(request<=0){
		cout<<"分配失败,请重试!"<<endl;
		return ERROR;
	 }
 	if(ch==2){
	 	if(Best_fit(ID,request)==OK) cout<<"内存分配成功!"<<endl;
	 	else cout<<"内存不足,分配失败!"<<endl;
	 	return OK;
	 }else{
	 	if(First_fit(ID,request)==OK) cout<<"内存分配成功!"<<endl;
	 	else cout<<"内存不足,分配失败!"<<endl;
	 	return OK;
	 }
}
Status First_fit(int ID,int request){
	DulNode *temp=NULL;
	temp= new DulNode;
	temp->data.ID=ID;
	temp->data.size=request;
	temp->data.state=Busy;
	DulNode *p=block_first->next;
	while(p){
		if(p->data.state==Free && p->data.size>=request)
		{
			temp->prior=p->prior;
			temp->next=p;
			temp->data.address=p->data.address;
			p->prior->next=temp;
			p->prior=temp;
			p->data.address=temp->data.address+temp->data.size;
			p->data.size-=request;
			return OK;
 
		}
		p=p->next;
	}
	return ERROR;
}
Status Best_fit(int ID,int request)
{
	int ch;
	DulNode *temp=NULL;
	temp= new DulNode;
	temp->data.ID=ID;
	temp->data.size=request;
	temp->data.state=Busy;
	DulNode *p=block_first->next;
	DulNode *q=NULL;
	while(p)
	{
		if(p->data.state==Free && p->data.size>=request)
		{
			q=p;
			ch=p->data.size-request;
			break;
		}
		p=p->next;
	}
	while(p)
	{
 
		if((p->data.state==Free) && (p->data.size>=request))
		{
			if(p->data.size-request<ch)
			{
				ch=p->data.size-request;
				q=p;
				break;
			}
 
		}
		p=p->next;
	}
	if(q==NULL)
	{
		return ERROR;
	}
	else
	{
		temp->prior=q->prior;
		temp->next=q;
		temp->data.address=q->data.address;
		q->prior->next=temp;
		q->prior=temp;
		q->data.address+=request;
		q->data.size=ch;
		return OK;
 
	 }
}
Status free(int ID)
{
	DulNode *p = block_first->next;
	DulNode *q = NULL; 
	while(p)
	{
		if(p->data.ID==ID)
		{
			q=p;
			p->data.state=Free;
			p->data.ID=Free;
			if((p->prior->data.state==Free)&&(p->next->data.state==Free))
			{
				
				p->prior->data.size+=(p->data.size+p->next->data.size);
				p->next->next->prior=p->prior;
				p->prior->next=p->next->next;
				delete p;
				delete p->next;
			}
			else
			{
				if(p->prior->data.state==Free)
				{
					p->prior->data.size+=p->data.size;
					p->prior->next=p->next;
					p->next->prior=p->prior;
					delete p;
				}
 
				else if(p->next->data.state==Free)
				{	
					q=p->next;
					p->data.size+=p->next->data.size;
					p->next->next->prior=p;
					p->next=p->next->next;
					delete q;
				}
 
			}
 
			break;
		}
		p=p->next;
 
	}
	return OK;
}
void show()
{
	cout<<"***********主存分配情况***********"<<endl;
	DulNode *p=block_first->next;
	cout<<"分区号\t起始地址\t分区大小(kb)\t状态"<<endl;
	while(p)
	{
 
		if(p->data.ID==Free) cout<<"Free\t";
		else cout<<p->data.ID<<'\t';
		cout<<p->data.address<<'\t'<<'\t';
		cout<<p->data.size<<'\t'<<'\t';
		if(p->data.state==Free) cout<<"空闲"<<endl;
		else cout<<"已分配"<<endl;
		p=p->next;
	}
}

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值