1、题 目 可变分区内存分配首次适应算法模拟 姓 名: ﻩ 学 号: 专 业: ﻩ 学 院: ﻩ ﻩﻩ 指导教师: 林夕ﻩ 二零一八 年 十一月 ﻬ一、实验目得 主存得分配与回收得实现与主存储器得管理方式有关得,通过本实验帮助学生理解在可变分区管理方式下应怎样实现主存空间得分配与回收。 二、实验内容及原理 编写一个内存动态分区分配模拟程序,模拟内存得分配与回收得完整过程。 模拟在可变分区管理方
2、式下采用最先适应算法实现主存分配与回收。 可变分区方式就是按作业需要得主存空间大小来分割分区得.当要装入一个作业时,根据作业需要得主存量查瞧就是否有足够得空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。随着作业得装入、撤离,主存空间被分成许多个分区,有得分区被作业占用,而有得分区就是空闲得。 当进程运行完毕释放内存,系统根据回收区得首址,从空闲区链表中找到相应得插入点,此时可能出现以下4种情况之一: 1、回收区与插入点得前一个空闲分区F1相邻接,此时将两个分区合并 2、回收区与插入点得后一个空闲分区F2相邻接,此时将两个分区合并 3、回收区与插入点得前,
3、后两个空闲分区相邻接,此时将三个分区合并 4、回收区既不与F1相邻接,又不与F2相邻接,此时应为回收区单独建立一个新表项 三、程序设计 1、算法流程 3、详细设计 (1)定义两个结构体 struct kongxian //空闲分区 { int start; //起址 ﻩint end; //结束 ﻩint length; //长度 }kongxian[N]; struct zuoye //作业分区 { ﻩint start; //起址 ﻩint end; //结束 ﻩint length; //长度 }zuoye[N]; (2)
4、init() //初始化函数kongxian 结构体为 0 1023 1024 print1() //打印空闲分区 ﻩ print2() //打印作业分区 main()中具体实现算法: ﻩﻩprintf(”请输入作业得占用空间得长度 ”); scanf("%d",&len); ﻩﻩ flag=0; ﻩfor(i=0;i〈n1;i++) ﻩ{ ﻩﻩﻩﻩif(kongxian[i]、length〉=len) //首次适应算法 { ﻩﻩﻩ ﻩflag=1; ﻩﻩ break; ﻩ} } ﻩ if(!flag) ﻩ
5、{ ﻩ ﻩprintf("内存分配失败\n”); ﻩﻩﻩ} ﻩﻩﻩelse ﻩ{ ﻩ ﻩﻩ//将该作业加入作业区里 ﻩ zuoye[n2]、start=kongxian[i]、start; ﻩ ﻩﻩzuoye[n2]、end=zuoye[n2]、start+len; ﻩ zuoye[n2]、length=len; ﻩﻩﻩ n2++; //作业数加1 ﻩ if(kongxian[i]、length==len) //该分区全部用于分配,删除该空闲分区 ﻩﻩ { ﻩ ﻩfor(j=i;j<n1-1;j++) ﻩ { ﻩﻩ ﻩﻩﻩkongxi
6、an[j]、start=kongxian[j+1]、start; ﻩ kongxian[j]、end=kongxian[j+1]、end; ﻩﻩﻩﻩ kongxian[j]、length=kongxian[j+1]、length; ﻩ ﻩ} ﻩ n1—-; ﻩ } ﻩﻩelse //该空闲分区部分用于分配,剩余得留在空闲分区中 ﻩﻩﻩ{ ﻩ kongxian[i]、start+=len; ﻩ ﻩ kongxian[i]、length-=len; ﻩﻩ ﻩ} ﻩ } (3)回收作业: printf("输入要回收得作业ID ")
7、 scanf(”%d",&id); ﻩ front=middle=behind=0; ﻩﻩﻩfor(i=0;i〈n1;i++) ﻩ ﻩ{ ﻩ ﻩif(kongxian[i]、start>zuoye[id]、end) ﻩﻩﻩ break; ﻩ ﻩﻩif(kongxian[i]、end==zuoye[id]、start) //待回收得作业上面有空闲分区 ﻩﻩ{ ﻩ ﻩ ﻩfront=1; ﻩﻩ t1=i; ﻩﻩﻩﻩ} ﻩﻩﻩ if(kongxian[i]、start==zuoye[id]、end) //待回收得作业下面有空闲分区
8、ﻩ ﻩ { ﻩ behind=1; ﻩﻩ t2=i; ﻩ ﻩﻩ} 四、实验结果 五、实验小结 在设计得过程中,有很多问题不就是很清楚,所以做起来就就很困难,刚开始得时候都有点无从下手得感觉。很多时候在遇到问题时,基本知识都了解,但就是就不知道怎么才能把它们都整合到一块,也就就是说知识都就是很零散得,没有一个完整得系统.而且,又由于基础知识不牢固,使得我在这次得课程设计中感到更加力不从心。 在设计得过程中,每走一步就会发现,思路想出来很容易,但涉及到实现得时候,总就是有点手无足措。对于本次得课程设计,里面还有很多需要改进得地方.一个程序得顺利出炉,少不了反复地调试与修
9、改.在调试得过程中,总就是会发生很多错误,但在解决这些错误得时候,开始很模糊得概念就会变得越来越清晰。其实很多错误都就是很类似得,只要解决了一个,其余得就会迎刃而解了。 #include〈stdio、h> #include〈string、h> #include<stdlib、h> #include<math、h〉 #define N 10000 int n1;//空闲分区得个数 int n2;//作业区得个数 struct kongxian { ﻩint start; //起址 ﻩint end; //结束 int length; //长度 }kongxi
10、an[N]; struct zuoye { ﻩint start; //起址 ﻩint end; //结束 int length; //长度 }zuoye[N]; int cmp1(const void *a,const void *b) { ﻩreturn (*(struct kongxian *)a)、start—(*(struct kongxian *)b)、start; } int cmp2(const void *a,const void *b) { ﻩreturn (*(struct zuoye *)a)、start-(*(struct zuoy
11、e *)b)、start;
}
void init()
{
ﻩn1=1; //初始时只有一个空闲区
ﻩn2=0; //初始没有作业
ﻩkongxian[0]、start=0;
kongxian[0]、end=1023;
ﻩkongxian[0]、length=1024;
}
void print1() //打印空闲分区
{
int i;
for(i=0;i 12、h);
}
void print2() //打印作业分区
{
ﻩint i;
for(i=0;i 13、 while(scanf("%d",&t)!=EOF)
{
if(t==1) //装入新作业
ﻩﻩ{
printf(”请输入作业得占用空间得长度 ");
ﻩﻩscanf(”%d",&len);
ﻩ flag=0;
ﻩﻩ for(i=0;i 14、
ﻩ {
ﻩ //将该作业加入作业区里
ﻩ ﻩ zuoye[n2]、start=kongxian[i]、start;
ﻩﻩzuoye[n2]、end=zuoye[n2]、start+len;
ﻩ zuoye[n2]、length=len;
ﻩ ﻩn2++; //作业数加1
if(kongxian[i]、length==len) //该分区全部用于分配,删除该空闲分区
{
ﻩ ﻩ for(j=i;j〈n1-1;j++)
ﻩﻩﻩﻩ {
ﻩ ﻩ kongxian[j]、start=kongxian[j+1]、start;
ﻩ ﻩ ko 15、ngxian[j]、end=kongxian[j+1]、end;
ﻩkongxian[j]、length=kongxian[j+1]、length;
ﻩ ﻩ}
ﻩ n1--;
}
ﻩﻩﻩelse //该空闲分区部分用于分配,剩余得留在空闲分区中
ﻩ{
ﻩﻩ kongxian[i]、start+=len;
ﻩﻩﻩ kongxian[i]、length-=len;
ﻩﻩ }
ﻩ}
ﻩ }
else if(t==0)
{
ﻩ ﻩprintf("输入要回收得作业ID ");
scanf("% 16、d",&id);
ﻩ front=middle=behind=0;
ﻩ ﻩfor(i=0;i〈n1;i++)
ﻩ{
ﻩﻩ if(kongxian[i]、start〉zuoye[id]、end)
ﻩﻩﻩbreak;
ﻩ if(kongxian[i]、end==zuoye[id]、start) //待回收得作业上面有空闲分区
{
ﻩﻩ ﻩﻩfront=1;
ﻩﻩﻩ t1=i;
ﻩﻩ }
ﻩif(kongxian[i]、start==zuoye[id]、end) //待回收得作业下面有空闲分区
ﻩﻩﻩ {
ﻩ ﻩ behind=1;
17、ﻩ t2=i;
ﻩ ﻩﻩ}
ﻩﻩ }
if(!front&&!behind) //待回收得作业上下均没有空闲分区
ﻩﻩ {
ﻩ ﻩkongxian[n1]、start=zuoye[id]、start;
ﻩﻩﻩﻩkongxian[n1]、end=zuoye[id]、end;
ﻩﻩﻩkongxian[n1]、length=zuoye[id]、length;
ﻩﻩ n1++; //空闲分区增加一个
ﻩ ﻩqsort(kongxian,n1,sizeof(struct kongxian),cmp1); //插入空闲分区后排序
ﻩfor(j=id;j< 18、n2—1;j++) //在作业分区中删除该作业
ﻩ ﻩﻩ{
zuoye[j]、start=zuoye[j+1]、start;
ﻩ ﻩﻩ zuoye[j]、end=zuoye[j+1]、end;
ﻩﻩ zuoye[j]、length=zuoye[j+1]、length;
ﻩ }
ﻩ ﻩn2-—;
ﻩ }
ﻩﻩﻩif(front &&behind) //待回收得作业上下均有空闲分区
ﻩﻩ middle=1;
ﻩﻩﻩif(front&&!middle) //合并待回收得作业与上面得空闲分区
ﻩﻩ {
ﻩ kongxian[t1]、end+ 19、=zuoye[id]、length;
ﻩﻩﻩﻩkongxian[t1]、length+=zuoye[id]、length;
ﻩﻩ for(j=id;j 20、ongxian[t1]、end=kongxian[t2]、end;
ﻩﻩ kongxian[t1]、length+=(zuoye[id]、length+kongxian[t2]、length);
ﻩﻩ//删除空闲分区t2
ﻩ ﻩfor(j=t2;j 21、
ﻩ for(j=id;j<n2-1;j++) //在作业分区中删除该作业
ﻩﻩﻩ{
ﻩ ﻩ ﻩzuoye[j]、start=zuoye[j+1]、start;
ﻩ ﻩ ﻩzuoye[j]、end=zuoye[j+1]、end;
ﻩ ﻩﻩzuoye[j]、length=zuoye[j+1]、length;
ﻩ ﻩ }
ﻩﻩ n2-—;
ﻩ}
if(behind &&!middle) //合并待回收得作业与下面得分区
ﻩﻩ{
ﻩﻩkongxian[t2]、start-=zuoye[id]、length;
kongxian[t2 22、]、length+=zuoye[id]、length;
ﻩﻩﻩ for(j=id;j〈n2-1;j++) //在作业分区中删除该作业
{
ﻩ ﻩzuoye[j]、start=zuoye[j+1]、start;
ﻩ ﻩzuoye[j]、end=zuoye[j+1]、end;
ﻩ ﻩzuoye[j]、length=zuoye[j+1]、length;
ﻩﻩﻩ }
ﻩ ﻩn2-—;
ﻩ }
}
ﻩ else
{
printf("操作结束\n");
ﻩ break;
ﻩﻩ}
print1();
ﻩprint2();
}
ﻩreturn 0;
}






