完整word版动态分区分配方式的模拟实验报告.docx
《完整word版动态分区分配方式的模拟实验报告.docx》由会员分享,可在线阅读,更多相关《完整word版动态分区分配方式的模拟实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
完整word版动态分区分配方式的模拟实验报告
中北大学软件学院
实验报告
专业:
软件工程
方向:
软件开发与测试
课程名称:
操作系统
班级:
学号:
姓名:
辅导教师:
2017年9月制
成绩:
实验时间
2017年11月12日10时至12时
学时数2
2学时
1.实验名称
动态分区分配方式的模拟
2.实验内容
编程分别实现采用首次适应算法和最佳适应算法的动态分区分配过程。
3。
基本要求
1.用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free()。
其中,空闲分区通过空闲分区链(表)来管理:
在进行内存分配时,系统优先使用空闲区低端的空间。
2.给出初始状态、可用内存空间、请求序列,分别采用首次适应算法和最佳适应算法进行内存块的分配和回收,要求每次分配和回后显示出空闲内存分区链的情况(共有多个空闲分区,每个空闲分区的大小分别为多大)。
4。
实验原理或流程图
首次适应算法(First-fit):
当要分配内存空间时,就查表,在各空闲区中查找满足大小要求的可用块。
只要找到第一个足以满足要球的空闲块就停止查找,并把它分配出去;如果该空闲空间与所需空间大小一样,则从空闲表中取消该项;如果还有剩余,则余下的部分仍留在空闲表中,但应修改分区大小和分区始址。
最佳适应算法(Best-fit):
当要分配内存空间时,就查找空闲表中满足要求的空闲块,并使得剩余块是最小的.然后把它分配出去,若大小恰好合适,则直按分配;若有剩余块,则仍保留该余下的空闲分区,并修改分区大小的起始地址.
内存回收:
将释放作业所在内存块的状态改为空闲状态,删除其作业名,设置为空。
并判断该空闲块是否与其他空闲块相连,若释放的内存空间与空闲块相连时,则合并为同一个空闲块,同时修改分区大小及起始地址。
5.源程序
#include
#include〈cmath>
#include#include
#includeusingnamespacestd;
intpos,n,Size;///查找位置,分区数量,最小分割大小
structList
{
intid;///空闲分区编号
intsad;///空闲分区首地址
introm;///空间
intstate;///状态,0为空,1为未满,2为满;
}L[2000];
structTask
{
intid;
introm;
intsad;
}T[2000];
boolcmp(Lista,Listb)
{
returna.rom〈b。
rom;
}
voidprint()
{
inti;
printf("|——-—---————------————---——--—————---—-——-—————-—--—--------—-——|\n”);
printf(”|分区号分区始址分区大小分区状态|\n”);
printf("|---—-—--—-----———-——-—--———---———-———----——-—————-—-——-—-—-———-|\n");
for(i=1;i<=n;i++)
{
printf(”|%3d%3d%3d%3d|\n”,
L[i].id,L[i]。
sad,L[i].rom,L[i].state);
printf(”|--—-————————--—------—--—---—--—---——-----—-———--————-———--———-|\n");
}
}
voidrecycle()
{
printf(”请输入要释放占用空间任务的序号:
\n");
intl;
intf1=0,f2=0,f3=0;
intp1,p2;
cin>〉l;
for(inti=1;i〈=n;i++)
{
if(T[l].sad==L[i]。
sad+L[i].rom)
{
f1=1;
p1=i;
}
if(T[l]。
sad+T[l].rom==L[i].sad)
{
f2=1;
p2=i;
}
}
//cout〈if(f1==1&&f2==0)
{
L[p1]。
rom=L[p1].rom+T[l]。
rom;
}
elseif(f1==0&&f2==1)
{
L[p2]。
rom=L[p2].rom+T[l].rom;
L[p2]。
sad=T[l]。
sad;
}
elseif(f1==1&&f2==1)
{
L[p1].rom=L[p1].rom+T[l].rom+L[p2].rom;
for(intj=p1+1;j〈=n;j++)
L[j]。
id——;
n—-;
}
elseif(f1==0&&f2==0)
{
inttemp;
for(intj=1;j〈=n;j++)
{
if(L[j]。
sad>T[l].sad+T[l].rom)///实际上大于T[l].sad就可以
{
temp=j;
}
}
for(intj=temp;j〈=n;j++)
T[j]。
id++;
n++;
L[temp]。
id=temp;
L[temp]。
rom=T[l]。
rom;
L[temp].sad=T[l].sad;
L[temp]。
state=0;
}
cout〈〈"内存回收完毕!
"<〈endl;
}
voidNF()///循环首次适应算法
{
cout<<"选择采用'循环首次适应算法'进行内存分配\n”〈〈endl;
inttmp;
pos=1;///开始从第一个分区查找
while
(1)
{
cout<〈”*******************************************"〈cout〈〈”1:
分配内存2:
回收内存"〈〈endl;
cout〈〈endl;
cout<〈"3:
查看空闲分区表0:
退出”<〈endl;
cout〈〈"*******************************************"<cout<〈"请输入您的操作:
";
cin〉>tmp;
intk=0;
if(tmp==1)
{
k++;
printf(”请输入第%d个作业占用空间大小:
\n",k);
cin〉>T[k].rom;
T[k].id=k;
intnum=0;
for(inti=pos;;i++)
{
num++;
if(num>n)
{
printf("作业请求内存空间过大,空闲分区表不能满足要求,内存分配失败!
\n");
break;
}
if(i〉n)
{
i=1;
continue;
}
if((L[i]。
state==0||L[i].state==1)&&L[i].rom>=T[i].rom)
{
if(L[i]。
rom-T[k].rom〉Size)
{
L[i].sad=L[i]。
sad+T[k]。
rom;
L[i]。
rom=L[i].rom—T[k].rom;
L[i]。
state=1;
T[k].sad=L[i].sad—T[k].rom;
printf("内存分配成功!
\n作业申请空间为%d\n起始地址为%d\n”,T[k].rom,T[k]。
sad);
break;
}
else
{
L[i]。
sad=L[i].sad+Size;
L[i]。
rom=L[i]。
rom—Size;
L[i].state=2;
T[k].sad=L[i]。
sad—Size;
printf(”内存分配成功!
\n作业申请空间为%d\n起始地址为%d\n",L[i].rom,T[k].sad);
break;
}
}
elseif(L[i]。
state=0&&L[i].rom—T[k]。
rom==Size)
{
L[i].state=2;
T[k].sad=L[i].sad;
printf("内存分配成功!
\n作业申请空间为%d\n起始地址为%d\n",T[k]。
rom,T[k]。
sad);
break;
}
}
}
elseif(tmp==2)
{
recycle();
}
elseif(tmp==3)
print();
elseif(tmp==0)
return;
else
{
printf(”输入有误,请重新输入!
\n”);
continue;
}
}
}
voidBF()///最佳适应算法
{
cout〈〈"选择采用’最佳适应算法’进行内存分配\n"<sort(L+1,L+n+1,cmp);
inttmp;
while
(1)
{
cout<<"*******************************************”〈cout<〈"1:
分配内存2:
回收内存”〈cout〈〈endl;
cout〈<”3:
查看空闲分区表0:
退出”〈〈endl;
cout<〈"*******************************************"<cout〈<"请输入您的操作:
";
cin>>tmp;
intk=0;
if(tmp==1)
{
k++;
printf("请输入第%d个作业占用空间大小:
\n”,k);
cin〉>T[k].rom;
T[k].id=k;
inti;
for(i=1;i<=n;i++)
{
if(i〉n)
{
i=1;
continue;
}
if((L[i]。
state==0||L[i]。
state==1)&&L[i]。
rom>=T[i]。
rom)
{
if(L[i].rom-T[k].rom>Size)
{
L[i].sad=L[i].sad+T[k]。
rom;
L[i]。
rom=L[i].rom-T[k].rom;
L[i].state=1;
T[k]。
sad=L[i]。
sad-T[k]。
rom;
printf("内存分配成功!
\n作业申请空间为%d\n起始地址为%d\n",T[k]。
rom,T[k].sad);
break;
}
else
{
L[i]。
sad=L[i]。
sad+Size;
L[i].rom=L[i]。
rom-Size;
L[i]。
state=2;
T[k]。
sad=L[i].sad—Size;
printf(”内存分配成功!
\n作业申请空间为%d\n起始地址为%d\n",L[i]。
rom,T[k].sad);
break;
}
}
elseif(L[i].state=0&&L[i]。
rom—T[k]。
rom==Size)
{
L[i].state=2;
T[k].sad=L[i]。
sad;
printf(”内存分配成功!
\n作业申请空间为%d\n起始地址为%d\n",T[k].rom,T[k]。
sad);
break;
}
}
if(i>n)
{
printf("作业请求内存空间过大,空闲分区表不能满足要求,内存分配失败!
\n”);
break;
}
}
elseif(tmp==2)
{
recycle();
sort(L+1,L+n+1,cmp);
}
elseif(tmp==3)
print();
elseif(tmp==0)
return;
else
{
printf(”输入有误,请重新输入!
\n");
continue;
}
}
}
voidinit()
{
loop1:
pos=1;
printf("请输入空闲分区表分区数量:
\n”);
cin〉〉n;
printf(”请输入每个空闲分区的分区大小,分区始址\n");
for(inti=1;i<=n;i++)
{
printf(”请输入第%d个分区的信息:
\n”,i);
cin>>L[i]。
rom>>L[i]。
sad;
L[i]。
id=i;
L[i].state=0;
}
printf(”输入完毕,当前空闲分区表状态为:
\n");
print();
printf(”请输入不再切割的剩余空间的大小:
\n”);
cin〉〉Size;
loop2:
printf(”选择内存分配的算法:
1.循环首次适应算法2。
最佳适应算法3。
重新编辑空闲分区表4。
退出\n");
inttmp;
cin〉>tmp;
if(tmp==1)NF();
elseif(tmp==2)BF();
elseif(tmp==3)
{
gotoloop1;
}
elseif(tmp==4)return;
else
{
printf(”输入有误,请重新输入!
\n");
gotoloop2;
}
}
intmain()
{
init();
return0;
}
6。
运行截图
7。
实验心得
这次实验学习了编程分别实现采用首次适应算法和最佳适应算法的动态分区分配过程,这是操作系统的最后一次实验,实验内容不是很简单,需要我们有很大的耐心,好在还是完成了,感谢老师,让我学会这么多关系操作系统的知识。