
操作系统实验报告
设计题目
在可变分区管理方式下采用最先适应算法实现主存分配和实现主存回收
一、设计内容
主存储器空间的分配和回收。
二、设计目的
一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要
能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要
求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主
动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回
收的实现虽与主存储器的管理方式有关的,通过本实习帮助学生理解在不同的存储管理方式下应怎
样实现主存空间的分配和回收。
三、设计过程
1、 数据结构设计
#define m 10
#define n 10
#define Q 1024
struct free
{
int ad;
int len;
char state;
}fr[m];
struct use
{
int ad;
int len;
char state;
}us[10];
struct free0
{
int ad;
int len;
char state;
}f0[1];

2、算法设计
void creatf()//空闲分区表初始化
{int i;
for(i=0;i<m;i++)
{
fr[i].ad=0;
fr[i].len=0;
fr[i].state='M';
}
}
void insertu(int i)
{
int j,p;
p=0;
printf("\n 请输入第%d 个作业的长度:\n",i);
scanf("%d",&us[i].len);
us[i].ad=0;
us[i].state='U';
j=0;
p=0;
if(fr[0].ad==0)
printf("\n 所有空闲区已经全部分配完毕!\n");
while(fr[j].state!='M'&&p==0)
{
if( us[i].len<fr[j].len)
{
us[i].ad=fr[j].ad;
fr[j].ad=us[i].len+fr[j].ad;
fr[j].len=fr[j].len-us[i].len;
p=1;
break;
}
if(us[i].len==fr[j].len)
{
fr[j].ad=0;
fr[j].len=0;
fr[j].state='M';
sort1();
p=1;

break;
}
j++;
}
if(p==0)
{
us[i].state='N';
printf("\n 没有适当的空间可以插入!\n");
}
if(p!=0)
{
printf("\n 第%d 个作业分配空间后,空闲表为:\n",i);
disp();
}
}
void sort()
{
int i,q,j;
i=0;
q=0;
if(fr[0].ad!=0)
{
do
{
if(f0[0].ad>fr[i].ad)
i=i+1;
else q=1;
}while(fr[i].state!='M'&&q==0);
for(j=m-1;j>i;j--)
{
fr[j].ad=fr[j-1].ad;
fr[j].len=fr[j-1].len;
fr[j].state=fr[j-1].state;
}
fr[i].ad=f0[0].ad;
fr[i].len=f0[0].len;
fr[i].state=f0[0].state;
}

if(fr[0].ad==0)
{
fr[0].ad=f0[0].ad;
fr[0].len=f0[0].len;
fr[0].state=f0[0].state;
}
}
void sort1()
{
int i;
i=0;
while(fr[i].state!='M')
{i++;}
if(fr[i+1].state!='M')
{
do
{
fr[i].ad=fr[i+1].ad;
fr[i].len=fr[i+1].len;
fr[i].state=fr[i+1].state;
i++;
}while(fr[i+1].state!='M');
fr[i].ad=0;
fr[i].len=0;
fr[i].state='M';
}
}
void disp()
{
int i;
printf("\n\taddress\t\tlength\t\tstate\n");
for(i=0;i<m;i++)
printf("\n\t%d\t\t%d\t\t %c\n",fr[i].ad,fr[i].len,fr[i].state);
}
void over()
{
int d,i,j,p,k;

p=0;
i=0;
printf("\n 输入要结束第几个作业:\n");
scanf("%d",&d);
printf("\n 要结束作业的信息为:\n");
printf("\n\taddress\t\tlength\t\tstate\n");
printf("\n\t%d\t\t%d\t\t %c\n",us[d].ad,us[d].len,us[d].state);
if(us[d].state=='N')//如果要结束作业的状态为'N',说明此作业没有被分配空间
printf("\n 此作业没有分配内存!\n");
if(us[d].state=='Y')//如果要结束作业的状态为'Y',说明此作业已经被结束
printf("\n 此作业已经结束 !\n");
if(us[d].state=='U')//如果要结束作业的状态为'U',说明此作业没有被结束
{
while(fr[i].state!='M')
{
if(us[d].ad==fr[i].ad+fr[i].len)
//如果被结束作业的起始地址和一个空闲分区的结束地址相邻,则合并两者
{
fr[i].len=fr[i].len+us[d].len;
if(fr[i].ad+fr[i].len==fr[i+1].ad)
//合并完之后的空闲分区的结束地址和相邻的空闲分区的起始地址也相连,则继续合并
{
fr[i].len=fr[i].len+fr[i+1].len;
for(k=i+1;k<m-1;k++)
{
fr[k].ad=fr[k+1].ad;
fr[k].len=fr[k+1].len;
fr[k].state=fr[k+1].state;
}
fr[m-1].ad=-1;
fr[m-1].len=-1;
fr[m-1].state='M';
}
us[d].state='Y';//修改已经结束作业的信息
p=1;
break;
}
if(us[d].ad+us[d].len==fr[i].ad)
//如果被结束作业的结束地址和一个空闲分区的起始地址相邻,则合并两者
{
fr[i].len=us[d].len+fr[i].len;
fr[i].ad=us[d].ad;
fr[i].state='F';
- 1
- 2
- 3
- 4
- 5
- 6
前往页