#include<stdio.h>
#include<string.h>
#define N 1024
bool ROM[N];
int p=0;
int count=0;
int free_rom_counter=0;//空闲区数目
typedef struct Pcb //进程结构体
{
char name[10];
int start;
int size;//大小
int state=0; //状态
} pcb;
pcb num[20];//进程数组
typedef struct Free_rom//空闲区结构体
{
int num;
int start;
int end;
int space;//空闲区大小
} Free_room;
Free_rom free_rom[100];//空闲区数组
void show()//显示空闲区信息
{
printf("****************************************************************\n\n");
printf("空闲区名\t开始地址\t\t大小\t\t结束地址\t\t\n");
for (int i=1; i<= free_rom_counter; i++)
printf("%d\t\t%d\t\t\t%d\t\t%d\t\t\n",free_rom[ i].num,free_rom[ i].start, free_rom[ i].space,free_rom[ i].end);
printf("\n");
printf("****************************************************************\n\n");
}
void find_free_rom()//寻找空闲区,更新空闲区数组
{
free_rom_counter=0;
int i,j,p;
for(i=0; i<N; i++)
if(ROM[i]==0)
{
p=i;
for(j=i; j<N; j++)
{
if(ROM[j]==0)
{
i=j;
continue;
}
if(ROM[j]==1)//找到就更新信息
{
free_rom_counter++;
free_rom[ free_rom_counter].num= free_rom_counter;
free_rom[ free_rom_counter].start=p;
free_rom[ free_rom_counter].end=j-1;
free_rom[ free_rom_counter].space=j-p;
i=j+1;
break;
}
}
if(j==N&&ROM[j-1]==0)//对最后一个内存进行特殊处理
{
free_rom_counter++;
free_rom[ free_rom_counter].num= free_rom_counter;
free_rom[ free_rom_counter].start=p;
free_rom[ free_rom_counter].end=j-1;
free_rom[ free_rom_counter].space=j-p;
}
}
}
void sort1()//最佳适应算法对空闲区从小到大排序
{
find_free_rom();
Free_rom a;
for(int i=1; i<free_rom_counter; i++)
for(int j=1; j<free_rom_counter; j++)
if( free_rom[j].space> free_rom[j+1].space)
{
a=free_rom[j];
free_rom[j]=free_rom[j+1];
free_rom[j+1]=a;
}
}
void sort2()//最坏适应算法对空闲区从大到小排序
{
find_free_rom();
Free_rom a;
for(int i=1; i<free_rom_counter; i++)
for(int j=1; j<free_rom_counter; j++)
if( free_rom[j].space< free_rom[j+1].space)
{
a=free_rom[j];
free_rom[j]=free_rom[j+1];
free_rom[j+1]=a;
}
}
void init()//初始化
{
for(int i=0; i<N; i++)
ROM[i]=0;
}
void input(pcb &a)//输入
{
char name[10];
printf("输入进程名\n");
scanf("%s",&a.name);
printf("输入进程大小\n");
scanf("%d",&a.size);
}
void insert_pcb1(pcb &a)//最佳适应算法插入进程
{
find_free_rom();
sort1();
int i,j,k;
for(i=1; i<=free_rom_counter; i++)//判断插入
if(a.size<= free_rom[i].space)
{
for(j= free_rom[i].start; j<free_rom[i].start+a.size; j++)
ROM[j]=1;
a.state=1;
a.start=free_rom[i].start;
num[count++]=a;
break;
}
if(i==free_rom_counter+1)//插入失败
printf("可用空间不足!\n");
}
void insert_pcb2(pcb &a)//最坏适应算法插入{
find_free_rom();
sort2();
int i,j,k;
for(i=1; i<=free_rom_counter; i++)
if(a.size<= free_rom[i].space)
{
for(j= free_rom[i].start; j<free_rom[i].start+a.size; j++)//寻找
ROM[j]=1;
a.state=1;
a.start=free_rom[i].start;
num[count++]=a;
break;
}
if(i==free_rom_counter+1)//插入失败
printf("可用空间不足!\n");
}
void Delete(pcb &a)//内存中释放进程
{
int i;
for(i=a.start; i<a.start+a.size; i++)
ROM[i]=0;//更新内存信息,更新进程状态数组
a.state=0;
printf("删除成功\n");
find_free_rom();
}
int main()//主函数
{
init();
find_free_rom();
int choose1;
int choose;
char name[10];
printf("1、最佳适应算法\n");//主界面
printf("2、最坏首次适应算法\n");
scanf("%d",&choose1);
pcb a;
do
{
printf("\n\n1、插入进程\n");
printf("2、删除进程\n");
printf("3、显示进程信息\n");
printf("4、显示空余内存信息\n");
scanf("%d",&choose);
if(choose==1)//选择
{
input(a);
if(choose1==1)
insert_pcb1(a);
else insert_pcb2(a);
}
else if(choose==2)
{
printf("输入删除进程的名字\n");
scanf("%s",&name);
for(int i=0; i<count; i++)
if( !strcmp(num[i].name,name))
Delete(num[i]);
}
else if(choose==3)
{
printf("****************************************************************\n\n");
printf("进程名\t\t开始地址\t\t大小\t\t结束地址\t\t\n");//输出内存信息
for(int i=0; i<count; i++)
if(num[i].state!=0)
printf("%s\t\t%d\t\t\t%d\t\t%d\t\t\n",num[i].name,num[i].start,num[i].size,num[i].size+num[i].start-1);
printf("\n****************************************************************\n\n");
}
else if(choose=4)
{
find_free_rom();
show();
}
else break;
}
while(1);
return 0;
}