一、实验内容
设计模拟实现内存动态分区分配和回收的c语言程序。
1、建立一个长度为1024的一维数组,用以模拟内存。
2、建立空闲分区表或空闲分区链,用来记录内存的使用情况。
3、为请求进入内存的作业分配内存,回收运行完成的作业所占内存。
4、键盘输入:表示一个请求进入内存的作业的三元组: (作业号(0–9),作业大小(1—1024),作业运行时间)
5、程序接受键盘输入,进行内存分配,返回分配或其它信息(在屏幕显示)
二、代码
#include<stdio.h>
struct storage{//
int state;
int size;
int add;
int No;
}table[1024];
struct task{//
int No;
int size;
int time;
}T[100];
//int num=3;
int num=1;
//storage table[1024];
//task T[100];
void recover(int n);
void allocation(int n);
int main()
{
int n,i,j,k;
/* for(i=0,j=0;i<3;i++,j+=300)
{
table[0].No=i;
table[0].add=j;
table[0]=10;
}*/
for(i=0;i<1024;i++)
{
table[i].add=0;
table[i].No=-1;
table[i].size=1024;
table[i].state=0;
}
//printf("%d",table[10].No);
printf("请输入作业数:");
scanf("%d",&n);
printf("请依次输入各作业信息:作业号(0--9)、作业大小(1--1024)、运行时间(秒)\n");
for(i=0;i<n;i++)
{
scanf("%d %d %d",&T[i].No,&T[i].size,&T[i].time);
}
allocation(n);
printf("此时内存信息如下:\n\n") ;
printf("分区号 起始地址 大小 状态\n") ;
for(k=0;k<num;k++)
{
printf(" %d %d %d %d\n",k,table[k].add,table[k].size,table[k].state) ;
}
printf("\n");
recover(n);
return 0;
}
void allocation(int n)
{
int i,j,k,temp;
for(i=0;i<n;i++)
{
for(j=0;j<num;j++)
{
if(table[j].state==0&&table[j].size>=T[i].size)
{
table[j].No=T[i].No;
table[j].state=1;
if((table[j].size-T[i].size)>1)
{
temp=table[j].size;
table[j].size=T[i].size;
for(k=num;k>j+1;k--)
{
table[k].No=table[k-1].No;
table[k].add=table[k-1].add;
table[k].size= table[k-1].size;
table[k].state=table[k-1].state;
}
table[j+1].add=table[j].add+T[i].size;
table[j+1].size=temp-T[i].size;
table[j+1].state=0;
num++;
}
printf("作业 %d 内存分配地址为:%d--%d\n",T[i].No,table[j].add,table[j+1].add-1);
break;
}
}
if(j==num) printf("错误!作业%d没有足够大空间加载进内存\n",T[i].No);
}
printf("\n");
}
void recover(int n)
{
int i,j,k,temp;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(T[i].time>T[j].time)
{
temp=T[i].time;
T[i].time=T[j].time;
T[j].time=temp;
temp=T[i].No;
T[i].No=T[j].No;
T[j].No=temp;
temp=T[i].size;
T[i].size=T[j].size;
T[j].size=temp;
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<num;j++)
{
if(table[j].No==T[i].No)
{
if((j>=1&&table[j-1].state==0)||(j<num-1&&table[j+1].state==0))
{
if((j>=1&&table[j-1].state==0)&&(j>=num-1||table[j+1].state==1))
{
table[j-1].size+=table[j].size;
for(k=j;k+1<num;k++)
{
table[k].add=table[k+1].add;
table[k].No=table[k+1].No;
table[k].size=table[k+1].size;
table[k].state=table[k+1].state;
}
num--;
}
else if((j<1||table[j-1].state==1)&&(j<num-1&&table[j+1].state==0))
{
table[j].size+=table[j+1].size;
table[j].state=0;
table[j].No=-1;
for(k=j+1;k+1<num;k++)
{
table[k].add=table[k+1].add;
table[k].No=table[k+1].No;
table[k].size=table[k+1].size;
table[k].state=table[k+1].state;
}
num--;
}
else
{
table[j-1].size=table[j-1].size+table[j].size+table[j+1].size;
for(k=j;k+1<num;k++)
{
table[k].add=table[k+2].add;
table[k].No=table[k+2].No;
table[k].size=table[k+2].size;
table[k].state=table[k+2].state;
}
num-=2;
}
}
else
{
table[j].No=-1;
table[j].state=0;
}
break;
}
}
printf("作业 %d 已回收\n\n",T[i].No) ;
printf("此时内存信息如下:\n\n") ;
printf("分区号 起始地址 大小 状态\n") ;
for(k=0;k<num;k++)
{
printf(" %d %d %d %d\n",k,table[k].add,table[k].size,table[k].state) ;
}
}
}
/*
3
1 100 20
2 200 10
3 10 100
*/