用首次适应算法模拟内存的分配和回收
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验报告完成日期:2011-12-5
用首次适应算法模拟内存的分配和回收一、实验目的
在计算机系统中,为了提高内存区的利用率,必须给电脑内存区进行合理的分配。本实验通过对内存区分配方法首次适应算法的使用,来了解内存分配的模式。在熟练掌握计算机分区存储管理方式的原理的基础上,编程模拟实现操作系统的可变分区存储管理的功能,一方面加深对原理的理解,另一方面提高根据已有原理通过编程解决实际问题的能力,为进行系统软件开发和针对实际问题提出高效的软件解决方案打下基础。
二、实验内容与数据结构:
(1)可变式分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需要,
并且分区的个数是可以调整的。当需要装入一个作业时,根据作业需要的贮存量,查看是否有足够的空闲空间,若有,则按需求量分割一部分给作业;若无,则作业等待。随着作业的装入、完成,主存空间被分割成许多大大小小的分区。有的分区被分配作业占用,有的分区空闲,例如,某时刻主存空间占用情况如图所示:
为了说明哪些分区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,如下图所示。
(2)当有一个新作业要求装入贮存时,必须查空闲区说明表,从中找出一个足够大的空闲
区。有时找到的空闲区可能大于作业的需求量,这时应将空闲区一分为二。一个分给作业,另一个仍作为空闲区留在空闲区表中。为了尽量减少由于分割造成的碎片,尽可能分配地地址部分的空闲区,将较大的空闲区留在高地址端,以利于大作业的装入。为此在空闲区表中,按空闲区首地址从低到高进行登记。
(3)当一个作业执行完成时,作业所占用的分区应归还给系统。在归还时,要考虑相邻空
间区合并问题。作业的释放区与空闲区的邻接分以下4种情况考虑:
A、释放区下邻空闲区;
B、释放区上邻空闲区;
C、释放区上下都与空闲区邻接;
D、释放区上邻空闲区不邻接;
二、实验要求
1.内存大小初始化
2.可以对内存区进行动态分配,采用首次适应算法来实现
3.可以对已分配的内存块进行回收,并合并相邻的空闲内存块。
三、实验内容
把一个作业装入内存,按照首次适应算法对内存区进行分配,作业结束,回收已分配给该作业的内存块,并合并相邻的空闲内存块。
四、实验结果
运行效果:
1.初始化内存区大小,并添加作业,选择1添加作业
2. 当作业大小超过存储块大小时,分配失败。
3.选择3,可查看内存分配情况
4.选择2回收内存
5.选择1添加新作业
6.回收C作业,相邻的空闲内存块合并。
五、程序流程图:
六、实验源代码:
// FirstFit.cpp : 可变分区用首次适应算法来模拟内存回收
#include
#include
int MAX_SEGMENT=10;//最大碎片值
struct Partition //分区表目
{
int Par_Size; //分区大小
int Par_No; //分区序号或者名字
int Addr; //分区地址
int IsUse; //分区使用情况,0表示空闲,1表示使用
Partition *pri; //前向指针
Partition *next; //后向指针
};
Partition * Int()//函数,返回Partition类型指针
{ //初始化空闲分区表
Partition *list,*H,*H1;
list=(struct Partition *)malloc(sizeof(struct Partition));
list->next=NULL;
H=list;
if(!list)
{
printf("\n错误,内存初始化分配失败!程序结束");
exit(1);
}
H1=(struct Partition *)malloc(sizeof(struct Partition));
printf("请预先输入分区总大小(以KB为单位):");
scanf("%d",&H1->Par_Size);
H1->Addr=0;
H1->Par_No=0;
H1->IsUse=0;
H1->pri=H;
H1->next=NULL;
H->next=H1;////list--->H1
return list;
}
Partition * InitFP()
{ //初始化已分配分区表
Partition *FP,*F,*H;
int i;
FP=(struct Partition *)malloc(sizeof(struct Partition));
FP->next=NULL;
H=FP;
for(i=0;i<10;i++) //已分配区先暂定分配十个表目
{
F=(struct Partition *)malloc(sizeof(struct Partition));
if(!F)
{
printf("\n错误,内存分配失败!程序结束");
exit(1);
}
F->Par_Size=0;
F->Addr=0;
F->Par_No=0;
F->IsUse=0;
F->next=NULL;
H->next=F;
F->pri=H;
H=H->next;
}
return FP;
}
Partition * New_Process( Partition *list, Partition *FP)
{ //为新的进程分配资源
Partition *H,*P,*H1;
int Size,Name,L;
H=list;
H1=FP->next;
H=H->next;
printf("请输入新作业的名称和大小(整数):");
scanf("%d %d",&Name,&Size);
while(H)
{
if(!H) //表目已查完,无法分配
{
printf("\n已无空闲分区,本次无法分配!");
return list;
}
else{
if(H->IsUse==0) //空表目
//if(H->Par_Size>=Size) //大小满足,空闲分区大小》要分配的大小
if(H->Par_Size>=Size) //大小满足,
{
bool temp=false;
if((H->Par_Size-Size)<=MAX_SEGMENT){//空闲分区大小-要分配的大小<碎片值,会产生碎片,将整块内存大小分配出去,
Size=H->Par_Size;//分配的大小为整块内存
temp=true;//会产生碎片
}
//其他情况就分配大小为请求大小,不会产生碎