操作系统实验二存储管理动态分区分配及回收算法文档格式.docx
《操作系统实验二存储管理动态分区分配及回收算法文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统实验二存储管理动态分区分配及回收算法文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
的合法性
过程,过程,过程,过程,
实现实现实现实现
FirstFitAlgorithmBestFitAlgorithmFirstFitAlgorithmBestFitAlgorithm
的回收算法的回收算法
print过程,打印空闲区队列
(3)执行
程序首先申请一整块空闲区,其首址为0,大小为32767;
然后,提示用户使用哪种分
配算法,再提示是分配还是回收;
分配时要求输入申请区的大小,
首址和大小。
(4)输出
要求每执行一次,输出一次空闲区队列情况,内容包括:
编号首址终址大小
2.主要流程和源代码实验二源代码
回收时要求输入释放区的
#include<
stdio.h>
#include<
stdlib.h>
string.h>
#defineMAX_SIZE32767typedefstructnode{intid;
intadr;
intsize;
structnode*next;
}Node;
Node*head1,*head2,*back1,*back2,*assign;
intrequest;
intcheck(intadd,intsiz,charc)
{
Node*p,*head;
intcheck=1;
if(add<
0||siz<
0)check=0;
/*地址和大小不能为负*/if(c=='
f'
||c=='
F'
)head=head1;
elsehead=head2;
p=head->
next;
while((p!
=NULL)&
&
check)
if(((add<
p->
adr)&
(add+siz>
adr))||((add>
=p->
(add<
adr+p->
size)))check=0;
elsep=p->
if(check==0)
printf("
\t输入释放区地址或大小有错误!
!
!
\n"
);
returncheck;
}
voidinit()
Node*p;
head1=(Node*)malloc(sizeof(Node));
head2=(Node*)malloc(sizeof(Node));
p=(Node*)malloc(sizeof(Node));
head1->
next=p;
head2->
p->
size=MAX_SIZE;
adr=0;
next=NULL;
id=0;
Node*assignment1(intnum,intreq)
Node*before,*after,*ass;
ass=(Node*)malloc(sizeof(Node));
before=head1;
after=head1->
ass->
id=num;
size=req;
while(after->
size<
req)
before=before->
after=after->
if(after==NULL)
adr=-1;
}
else
if(after->
size==req)
before->
next=after->
ass->
adr=after->
adr;
{after->
size-=req;
after->
adr+=req;
returnass;
voidacceptment1(intaddress,intsiz,intrd){
Node*before,*after;
intinsert=0;
back1=(Node*)malloc(sizeof(Node));
back1->
adr=address;
back1->
size=siz;
id=rd;
while(!
insert&
after)
{//将要被回收的分区插入空闲区(按首址大小从小到大插入)
if((after==NULL)||((back1->
adr<
=after->
(back1->
adr>
=before->
adr))){
next=back1;
next=after;
insert=1;
if(insert)
{if(back1->
adr==before->
adr+before->
size)
{//和前边分区合并before->
size+=back1->
size;
next=back1->
free(back1);
elseif(after&
adr+back1->
size==after->
adr)
{//和后边分区合并back1->
size+=after->
id=after->
id;
free(after);
after=back1;
\t首先分配算法回收内存成功!
\t首先分配算法回收内存失败!
Node*assignment2(intnum,intreq)
Node*before,*after,*ass,*q;
q=(Node*)malloc(sizeof(Node));
before=head2;
after=head2->
while(after->
after=after->
q=after;
before->
adr=q->
q->
q->
after=head2->
next=q;
while((after->
size)<
(q->
size))
return(ass);
voidacceptment2(intaddress,intsiz,intrd)
back2=(Node*)malloc(sizeof(Node));
back2->
if(head2->
next==NULL)
{//空闲队列为空
next=back2;
size=back2->
{//空闲队列不为空
while(after)
if(back2->
adr==after->
adr+after->
{//和前边空闲分区合并before->
size+=back2->
back2=after;
{if(after->
adr==back2->
adr+back2->
size){//和后边空闲区合并before->
back2->
}before=head2;
insert)
{//将被回收的块插入到恰当的位置(按分区大小从小到大)
if(after==NULL||((after->
size>
size)&
(before->
size))){
break;
\t
最佳适应算法回收内存成功!
\n"
最佳适应算法回收内存失败!
voidprint(charchoice)//输出空闲区队列信息
if(choice=='
||choice=='
)p=head1->
elsep=head2->
if(p)
\n空闲区队列的情况为:
\t编号\t首址\t终址\t大小\n"
while(p)
{printf("
\t%d\t%d\t%d\t%d\n"
p->
id,p->
adr,p->
size-1,p->
size);
p=p->
voidmenu()//菜单及主要过程
charchose;
intch,num,r,add,rd;
while
(1)
system("
cls"
选择最先适应算法请输入printf("
请输入你的选择:
"
scanf("
%c"
&
chose);
if(chose=='
e'
||chose=='
E'
)exit(0);
F,选择最佳适应算法请输入B,退出程序请输入
E\n\n"
{system("
while
(1){if(chose=='
)printf("
最先适应算法(First-Fit)模拟:
if(chose=='
b'
B'
最佳适应算法(Best-Fit)模拟:
printf("
1.分配内存,2.回收内存,3.查看内存,4.返回\n\n"
scanf("
%d"
ch);
fflush(stdin);
switch(ch)
case1:
输入申请的分区大小:
"
r);
)
assign=assignment1(num,r);
assign=assignment2(num,r);
if(assign->
adr==-1)
分配内存失败!
分配成功!
分配的内存的首址为break;
case2:
:
%d\n"
assign->
adr);
scanf("
add);
rd);
printf(”输入释放的内存的首址
printf("
输入释放的内存的大小
输入释放的内存的编号
if(check(add,r,chose))
f||chose=='
)acceptment1(add,r,rd);
acceptment2(add,r,rd);
case3:
print(chose);
case4:
menu();
voidmain()//主函数
init();
四、实验结果
卷配jfeSi分配药內存的首址為k先适应蔓法CFlrs*nt>
tS;
^J;
-:
令配內存眾-叵收內存―宜右
•:
扌酉已内存尹花叵収內存二・云右內存#返回
茴y耒号垮lr育+聲F2勺勺勺•己rt:
p&
p自丄「31入慕舜舌_配*AAA先井
1-內
终址
339y
请喻入你的览择泊
1:
-分配内存窪•回收内存,囂沓着内存.4-返回
40存2楓知■-看址拟查酗百檯J_U灯”7■••存齐择区配%的的—算存你霍应内入®
配奧配佳分
■回t>
孚址杏翟Fi栩首-Rmt-如2勺勺好JY-s择存存富呂的囱黑最弟存你常放应内入释簷适配奧入入隹分
最1.
空闲区臥列的情揽为,编号首土止
24UU
Q4400
H佳适应宴法<
Be3t-Plt>
1ft拟2
-分配内存,2.[11收内存亠書看内存沁丿反冋
大小
五、实验总结
通过这次课程设计我练习了用C语言写系统软件,对操作系统中可变分区存储管理有了更深刻的了解。
在写程序的时候也遇到了一些困难。
比如在设计数据结构时特别犹豫,总
想找一个很合适的。
但是,后来才知道,关键要多尝试,而空想是没有用的。
最后我证实了自己的设计的合理性。
还有为了使程序更健壮,在网上下载了几个代码,进行调试,运行、查看结果。
看懂代码和结果后,这次实验也算是成功的一大半了。
总之这次实验还是让我收
获很大,让我在书本上的知识能够运用到实际当中。
这种学以致用的感觉才是最好的。