#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;
}
}
}
运行结果: