#include"stdio.h"
#include"stdlib.h"
struct{
char name[8];
float address; /*已分分区起始地址*/
float length; /*已分分区长度,*/
int flag; /*已分配区表登记栏标志,用"0"表示空栏目*/
}used_table[10]; /*已分配区表*/
struct{
float address; /*空闲区起始地址*/
float length; /*空闲区长度*/
int flag; /*空闲区表登记栏标志,用"0"表示空栏目,用"1"表示未分配*/
}temp,free_table[10]; /*空闲区表*/
void allocate(char str[8],float leg);
void sort();
void reclaim(char str[8]);//回收主存函数
void input();
int main()
{
int i;
float length;
char name[8];
int caozuo;
/*空闲分区表初始化:*/
free_table[0].address=10240;
free_table[0].length=102400;
free_table[0].flag=1;
for(i=1;i<10;i++)
free_table[i].flag=0;
/*已分配表初始化:*/
for(i=0;i<10;i++){
used_table[i].flag=0;
strcpy(used_table[i].name,"---");
}
input();
while(1)
{
printf("请选择操作\n1.分配\n2.回收\n");
scanf("%d",&caozuo);
if(caozuo==1)
{
printf("输入进程名和作业所需长度: ");
scanf("%s",&name);
scanf("%f",&length);
allocate(name,length);/*分配主存空间*/
}
else
{
printf("输入要回收分区的进程名");
scanf("%s",&name);
reclaim(name);/*回收主存空间*/
}
input();
}
return 0;
}
void input()
{
int i;
printf("输出空闲区表:\n\t起始地址\t分区长度\t标志\n");
for(i=0;i<10;i++)
{
printf("\t%.0f\t%9.0f\t%9d\n",free_table[i].address,free_table[i].length,free_table[i].flag);
}
printf("输出已分配区表:\n名称\t起始地址\t分区长度\t标志\n");
strcpy(used_table[0].name,"sys");
used_table[0].address=0;
used_table[0].length=10240;
used_table[0].flag=1;
for(i=0;i<10;i++)
{
if(used_table[i].flag!=0)
printf("%s\t%.0f\t%9.0f\t%9d\n",used_table[i].name,used_table[i].address,used_table[i].length,used_table[i].flag);
else
printf("%s\t%.0f\t%9.0f\t%9d\n",used_table[i].name,used_table[i].address,used_table[i].length,used_table[i].flag);
}
}
int uflag;//分配表标志
int fflag;//空闲表标志
void allocate(char str[8],float leg)
{
int k,i;
fflag=0;
for(k=0;k<10;k++)
{
if(!strcmp(str,used_table[k].name))
{
printf("\n存在相同名称的作业,请重新输入\n");
return;
}
}
for(i=0;i<10;i++)
{
if(free_table[i].flag==1 && free_table[i].length>=leg)
{
fflag=1;
break;
}
}
if(fflag==0)
printf("没有满足条件的空闲区\n");
else
{
for(k=1;k<10;k++)
{
if(used_table[k].flag==0)
{
strcpy(used_table[k].name,str);
used_table[k].length=leg;
used_table[k].address=free_table[i].address;
used_table[k].flag=1;
free_table[i].address=free_table[i].address+leg;
free_table[i].length=free_table[i].length-leg;
free_table[i].flag=1;
break;
}
}
}
}
void sort()
{
int i,j;
for(i = 0; i < 10; i++)
{
for(j = 0; j < 10-i; j++)
{
if(free_table[j].address > free_table[j+1].address)
{
if(free_table[j+1].address==0)
break;
temp=free_table[j];
free_table[j]=free_table[j+1];
free_table[j+1]=temp;
}
}
}
}
void reclaim(char str[8])
{
int k,i;
float uend_address;
float fend_address;
uflag=0;
fflag=0;
for(k=1;k<10;k++)
{
if(!strcmp(str,used_table[k].name))
{
uflag=1;
break;
}
}
if(uflag==0)
printf("\n找不到该进程!\n");
else
{
for(i=0;i<10;i++)
{
uend_address=used_table[k].address+used_table[k].length;
fend_address=free_table[i].address+free_table[i].length;
if(used_table[k].address==fend_address)//上邻
{
fflag=1;
free_table[i].length=free_table[i].length+used_table[k].length;
free_table[i].flag=1;
strcpy(used_table[k].name,"---");
used_table[k].flag=0;
used_table[k].length=0;
used_table[k].address=0;
printf("\n已回收!\n");
break;
}
else
{
if(free_table[i].address==uend_address)//下邻
{
fflag=1;
free_table[i].address=used_table[k].address;
free_table[i].length=free_table[i].length+used_table[k].length;
free_table[i].flag=1;
strcpy(used_table[k].name,"---");
used_table[k].flag=0;
used_table[k].length=0;
used_table[k].address=0;
printf("\n已回收!\n");
break;
}
}
}
if(fflag==0)//上下领都没有空闲
{
i=0;
for(i=0;i<10;i++)
{
if(free_table[i].flag==0)
{
free_table[i].address=used_table[k].address;
free_table[i].length=used_table[k].length;
free_table[i].flag=1;
strcpy(used_table[k].name,"---");
used_table[k].length=0;
used_table[k].flag=0;
used_table[k].address=0;
break;
}
}
printf("\n已回收!\n");
}
}
sort();
}