动态分区存储管理模拟系统

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<pthread.h>
#include<semaphore.h>
#include<string>
#include<iomanip>
using namespace std;
const int max_size=100;
const int max_len=10000;
typedef struct partition_node
{
	int name;	//作业名称
	int address;	//分区起始地址
	int length;	//分区地址,单位为字节
	int flag;	//0 1	分区表的标志项
}p_node;
p_node free_table[max_size],used_table[max_size];
int free_number,used_number;
void init()
{	
	free_table[0].address=0;
	free_table[0].length=max_len;
	for(int i=1;i<max_size;i++)
    	{
		free_table[i].address=-1;
		free_table[i].length=0;
		used_table[i].flag=0;
		used_table[i].address=-1;
		used_table[i].length=0;
		used_table[i].flag=1;
    	}
	free_number=1; 
	used_number=0;
}
void sort(){
	int i,j,p;
	for(i=0;i<free_number-1;i++){
		p=i;
		for(j=i+1;j<used_number;j++){
			if(free_table[j].length<free_table[p].length){
				p=j;
			}
		}
		if(p!=i){
			free_table[free_number]=free_table[i];
			free_table[i]=free_table[p];
			free_table[p]=free_table[free_number];
		}
	}
}
int find_insert(p_node *table,int number,int address)
{
	if(number==1) return 0;
	for(int i=0;i<number;i++)
	{
		if(i==0&&table[i].address>address)
		{
			for(int j=number-1;j>0;j--)
				table[j]=table[j-1];
			return 0;
		}
		else if(i==number-1&&table[i].address<address)
		{
			return i;
		}						
		else if(table[i].address<address&&table[i+1].address>address)
		{
			for(int j=number-1;j>i+1;j--)
				table[j]=table[j-1];
			return i+1;
		}
	}
	
}
void first_fit()
{
	int job_name;
	int job_length;
	int i,index;
	cout<<"请输入作业的名称和大小"<<endl;
	scanf("%d%d",&job_name,&job_length);
	for(i=0;i<free_number;i++)
	{
		if(free_table[i].length>=job_length)
		{
			index=i;
			break;
		}
	}
	if(i>=free_number)
	{
		cout<<"内存分配失败!当前没有能满足你申请的长度的内存空间!"<<endl;
		return ;
	}
	used_table[used_number].address=free_table[index].address;
	used_table[used_number].name=job_name;
	used_table[used_number].length=job_length;
	if(free_table[index].length>job_length)
	{
		free_table[index].address+=job_length;
		free_table[index].length-=job_length;
	}
	else
	{
		for(i=index;i<free_number-1;i++)
			free_table[i]=free_table[i+1];
		free_number--;
	}
	cout<<"内存分配成功!"<<endl;
	used_number++;

}
int find_best(int job_length)
{
	int min=max_len;
	int ans=-1;
	int i;
	for(i=0;i<free_number;i++)
	{
		if(free_table[i].length>job_length&&free_table[i].length<=min)
		{
			min=free_table[i].length;
			ans=i;
		}
	}
	return ans;
}		
void best_fit()
{
	int job_name;
	int job_length;
	int i,index;
	cout<<"请输入作业的名称和大小"<<endl;
	scanf("%d%d",&job_name,&job_length);
	if((index=find_best(job_length))==-1)
	{
		cout<<"内存分配失败!当前没有能满足你申请的长度的内存空间!"<<endl;
		return ;
	}
	used_number++;
	int k=find_insert(used_table,used_number,free_table[index].address);
	used_table[k].address=free_table[index].address;
	used_table[k].name=job_name;
	used_table[k].length=job_length;
	if(free_table[index].length>job_length)
	{
		free_table[index].address+=job_length;
		free_table[index].length-=job_length;
	}
	else
	{
		for(i=index;i<free_number-1;i++)
			free_table[i]=free_table[i+1];
		free_number--;
	}
	cout<<"内存分配成功!"<<endl;
}
int find_worst(int job_length)
{
	int max=0;
	int ans=-1;
	int i;
	for(i=0;i<free_number;i++)
	{
		if(free_table[i].length>job_length&&free_table[i].length>max)
		{
			max=free_table[i].length;
			ans=i;
		}
	}
	return ans;
}
void worst_fit()
{
	int job_name;
	int job_length;
	int i,index;
	cout<<"请输入作业的名称和大小"<<endl;
	scanf("%d%d",&job_name,&job_length);
	if((index=find_worst(job_length))==-1)
	{
		cout<<"内存分配失败!当前没有能满足你申请的长度的内存空间!"<<endl;
		return ;
	}
	used_number++;
	int k=find_insert(used_table,used_number,free_table[index].address);
	used_table[k].address=free_table[index].address;
	used_table[k].name=job_name;
	used_table[k].length=job_length;
	if(free_table[index].length>job_length)
	{
		free_table[index].address+=job_length;
		free_table[index].length-=job_length;
	}
	else
	{
		for(i=index;i<free_number-1;i++)
			free_table[i]=free_table[i+1];
		free_number--;
	}
	cout<<"内存分配成功!"<<endl;
}
void show(){
	int i;
	cout<<endl<<"______________________________"<<endl;
	cout<<"当前空闲表"<<endl;
	cout<<"起始地址 长度 "<<endl;
	for(i=0; i<free_number;i++){
		cout.width(6);
		cout<<free_table[i].address;
		cout.width(8);
		cout<<free_table[i].length<<endl;
	}
	cout<<endl<<"_______________________________"<<endl;
	cout<<"当前已分配表:"<<endl;
	cout<<"起始地址 长度 作业标签"<<endl;
	for(i=0; i<used_number;i++){
		cout.width(6);
		cout<<used_table[i].address;
		cout.width(6);
		cout<<used_table[i].length;
		cout. width(6);
		cout<<used_table[i].name<<endl;
	}
}
void free(int address,int length)
{
	free_number++;
	for(int i=0;i<free_number;i++)
	{
		if(i==0&&free_table[i].address>address)
		{
			for(int j=free_number-1;j>0;j--)
				free_table[j]=free_table[j-1];
			free_table[0].address=address;
			free_table[0].length=length;
		}
		if(i==free_number-1&&free_table[i].address<address)
		{
			free_table[free_number-1].address=address;
			free_table[free_number-1].length=length;
		}						
		if(free_table[i].address<address&&free_table[i+1].address>address)
		{
			for(int j=free_number-1;j>i+1;j--)
				free_table[j]=free_table[j-1];
			free_table[i+1].address=address;
			free_table[i+1].length=length;
		}
	}
}
void recover()
{
	int job_name,index=-1,address,length;
	cout<<"请输入待回收的作业名:"<<endl;
	scanf("%d",&job_name);
	for(int i=0;i<used_number;i++)
	{
		if(used_table[i].name==job_name)
		{
			index=i;
			break;
		}
	}
	if(index==-1)
	{
		cout<<"回收失败!没有这个作业!"<<endl;
		return ;
	}
	else
	{
		address=used_table[index].address;
		length=used_table[index].length;
		int flag1=-1;
		int flag2=-1;
		for(int j=index;j<used_number-1;j++)
			used_table[j]=used_table[j+1];
		used_number--;
		for(int i=0;i<free_number;i++)
		{
			if(free_table[i].address+free_table[i].length==address)
			{
				free_table[i].length+=length;
				flag1=i;
			}
			if(free_table[i].address==address+length)
			{
				flag2=1;
				if(flag1>=0){
					free_table[flag1].length+=free_table[i].length;
					for(int j=i;j<free_number-1;j++)
						free_table[j]=free_table[j+1];
					free_number--;
					printf("%d\n",free_number);
				}
				else{
					free_table[i].length+=length;
					free_table[i].address=address;
				}
			}
		}
		if(flag1==-1&&flag2==-1)
		{
			free_number++;
			int k=find_insert(free_table,free_number,address);
			free_table[k].address=address;
			free_table[k].length=length;
		}		
	}
	cout<<"回收成功!"<<endl;
}

int main()
{
	cout<<"                 动态分区储存管理模拟系统                 "<<endl;
	cout<<"---------------------------------------------------------"<<endl;
	init();
	int choice;
	while(true){			  		   
		cout<<"========================================================="<<endl;
		cout<<"1.分配空间 2.回收空间 3.显示空闲表和分配表 0.退出"<<endl;
		cout<<"请输入你的选择"<<endl;
		scanf("%d",&choice);
		switch(choice){
		case 0:
			cout<<"退出系统"<<endl;
			return 0;
		case 1:
			int t;
			cout<<"1.first-fit 2.best-fit 3.worst-fit 0.退出"<<endl;
			cout<<"请输入想要选择的分配算法:";
			scanf("%d",&t);
			switch(t){
			case 0:
				break;
			case 1:
				first_fit();
				break;
			case 2:
				best_fit();
				break;
			case 3:
				worst_fit();
				break;
			default:
				cout<<"输入的选择错误请重新选择"<<endl;
			}
			break;
		case 2:
			recover();
			break;
		case 3:
			show();
			break;
		default:
			cout<<"输入的选择错误请重新选择"<<endl;
		}
	}
}

运行结果:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值