实验存储器管理二Word文件下载.docx
《实验存储器管理二Word文件下载.docx》由会员分享,可在线阅读,更多相关《实验存储器管理二Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
系统的主流程如图3所示。
3、数据结构
(1)自由链与区头。
内存空闲区采用自由链结构。
链首由freep指向,链中各个空闲区按地址递增次序排列。
初启时整个用户内存区为一个空闲区。
在每个空闲区首部设置一个区头(freearca)结构。
区头信息包括:
size空闲区大小(以字节计),包括区头所占空间;
next前向链指针,指向下一个空闲区;
back反向链指针,指向上一个空闲区;
address本空闲区首地址。
(2)内存分配表MAT。
系统设置一个MAT,每个运行作业都在MAT中占有一个表目,回收分区时清除相应表目。
表目信息包括:
name用户作业名;
length作业区大小;
addr作业区首地址;
4、程序清单
#include<
stdio.h>
stdlib.h>
#defineTOTAL5000
#defineSETADDRESS2000
#defineMIN100
#defineMAX10
typedefstructfreearea
{intaddress;
intsize;
structfreearea*next;
structfreearea*back;
}*freeptr;
typedefstructmat
{charname;
intaddress;
intlength;
structmat*next;
structmat*back;
}*jobptr;
charstring[10];
longtotalfree;
charjobnumber;
freeptrfreep;
jobptrjobp;
/********初始化**********/
init()
{
freep=(freeptr)malloc(sizeof(structfreearea));
freep->
size=TOTAL;
address=SETADDRESS;
next=NULL;
back=NULL;
totalfree=TOTAL;
jobp=NULL;
jobnumber=0;
return(0);
}
/******分配模块*******/
fengpei(intjl,charjn)
{freeptrfp;
jobptrjp,jp1,jp2;
jp2=(jobptr)malloc(sizeof(structmat));
if(totalfree<
jl)return
(1);
fp=freep;
while(fp!
=NULL)
{if(fp->
size<
jl)fp=fp->
next;
else
{jobnumber=jobnumber+1;
totalfree=totalfree-jl;
jp2->
name=jn;
length=jl;
address=freep->
address;
if(jobp==NULL)
{jp2->
jp2->
jobp=jp2;
}
{jp=jobp;
while(jp!
=NULL&
&
(jp2->
address<
jp->
address))
{jp1=jp;
jp=jp->
}
next=jp;
if(jp==NULL)
{
jp2->
back=jp1;
jp1->
next=jp2;
else
{jp2->
back=jp->
back;
if(jp->
back!
=NULL)jp1->
elsejobp=jp2;
jp->
back=jp2;
if((fp->
size-jl)<
MIN)
{if(fp->
next!
=NULL)fp->
next->
back=fp->
if(fp->
back->
next=fp->
elsefreep=fp->
/*return();
*/
else
{
fp->
size=fp->
size-jl;
address=fp->
address+jl;
return
(2);
}
if(totalfree>
=jl)return(0);
/*********显示模块*********/
xianshi()
{jobptrjp;
/****清屏****/
if(jobnumber<
=0)printf("
NOJOB!
"
);
{
printf("
name\t\tlength\t\taddress\n"
jp=jobp;
while(jp!
printf("
%c\t\t%d\t\t%d\n"
jp->
name,jp->
length,jp->
address);
jp=jp->
printf("
\nthetotalleftis%dbytes:
totalfree);
/******回收模块********/
huishou(charjn)
freeptrfp,fp1,fp2;
jobptrjp;
intf=0;
jp=jobp;
while((jp!
=NULL)&
(jp->
name!
=jn))jp=jp->
if(jp!
jobnumber=jobnumber-1;
totalfree=totalfree+jp->
length;
if(freep==NULL)
freep=(freeptr)malloc(sizeof(structfreearea));
freep->
address=jp->
size=jp->
fp=freep;
while((fp!
(fp->
{
fp1=fp;
fp=fp->
}
if(fp!
if((fp->
address+jp->
length))
f=f+1;
address=fp1->
address+fp1->
size))
f=f+2;
elseif((jp->
address)=(fp1->
size))f=f+2;
switch(f)
case0:
fp2=(freeptr)malloc(sizeof(structfreearea));
fp2->
next=fp;
if(fp!
{
fp2->
if(fp->
=NULL)fp1->
next=fp2;
elsefreep=fp2;
fp->
back=fp2;
}
else
back=fp1;
fp1->
case1:
fp->
size+jp->
case2:
fp1->
size=fp1->
case3:
length+fp->
size;
if(fp->
free(fp);
if(jp==jobp)jobp=jp->
if(jp->
=NULL)jp->
next=jp->
free(jp);
/*********搬家************/
banjia()
freeptrfp,fp1;
longbottom;
if(jobnumber>
0)
bottom=TOTAL+SETADDRESS;
jp->
address=bottom-jp->
bottom=bottom-jp->
fp=freep;
while(fp!
fp1=fp;
fp=fp->
free(fp1);
freep=(freeptr)malloc(sizeof(freeptr));
freep->
size=totalfree;
mingling()
charname,anykey,jobname;
intlength,select;
a1:
youcanselectoneofthefollowing:
\n"
(1)requiretobeallocate\n"
(2)requiretocollextethesize\n"
(3)checkthememory\n"
(4)quitsystem\n"
youselectis:
scanf("
%d"
&
select);
switch(select)
{case1:
if(jobnumber>
=MAX)printf("
thejobistoomany"
printf("
enteryoujobname\n"
scanf("
%s"
name);
enteryourjoblength\n"
%10d"
length);
address=fengpei(length,name);
switch(address)
{case1:
thememoryisfull"
break;
case0:
{banjia();
fengpei(length,name);
xianshi();
break;
}
case2:
xianshi();
/*****elsexianshi();
*****/
}
break;
case2:
enterthenameofthejob\n"
jobname=getchar();
huishou(jobname);
xianshi();
case3:
xianshi();
case4:
gotoa2;
printf("
\npressentertoreturnmenu\n"
anykey=getchar();
/*scanf("
%c"
anykey);
*/
gotoa1;
a2:
youhaveexitthesystem!
main()
init();
mingling();
5、程序运行结果
本程序用TurboC语言编写,运行结果如下:
youcanselectoneofthefollowing:
(1)requiretobeallocate。
(2)requiretocollectethesize。
(3)checkthememory。
(4)quit。
youselect:
1
enteryourjobname:
job1
enteryourjoblength:
1000
namelegth(b)address
job110002000
thetotalleftis:
4000bytes
pressanykeytoreturnmenu.
.
youselect:
1
enteryourjobname:
job4
enteryourjoblength:
900
namelegth(b)address
job49005900
job37005200
job222003000
thetotalleftis:
200bytes
2
enterthenameofthejob:
job2
namelegth(b)address
job49005900
thetota1leftis:
2400bytes
…
job5
2300
namelength(b)address
job49006100
job370054000
job110004400
job523002000
thetotalleftis:
100bytes
6、调试程序出现的问题及解决的方法
调试程序过程中发现一些问题主要问题如下:
输出内容多,在屏幕上一闪而过,可采用在程序中预先设置断点或将输出信息发送到文件中的方法来处理。
在调用动态存储分配函数时,有可能分配不成功,此时要退出一些应用程序再进行调试。
7、设计体会
经过本次试验加深了对于存储器管理的理解和认识,对它有了一个整体的认识,了解了分配,回收,查询的全过程和每一步的作用。
加深对所学各种存储器管理方案的了解和实现方法,懂得了各种分区分配算法的优缺点,和各种算法使用的各种领域。