实验存储器管理二Word文件下载.docx

上传人:b****5 文档编号:19208669 上传时间:2023-01-04 格式:DOCX 页数:13 大小:18.56KB
下载 相关 举报
实验存储器管理二Word文件下载.docx_第1页
第1页 / 共13页
实验存储器管理二Word文件下载.docx_第2页
第2页 / 共13页
实验存储器管理二Word文件下载.docx_第3页
第3页 / 共13页
实验存储器管理二Word文件下载.docx_第4页
第4页 / 共13页
实验存储器管理二Word文件下载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

实验存储器管理二Word文件下载.docx

《实验存储器管理二Word文件下载.docx》由会员分享,可在线阅读,更多相关《实验存储器管理二Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。

实验存储器管理二Word文件下载.docx

系统的主流程如图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、设计体会

经过本次试验加深了对于存储器管理的理解和认识,对它有了一个整体的认识,了解了分配,回收,查询的全过程和每一步的作用。

加深对所学各种存储器管理方案的了解和实现方法,懂得了各种分区分配算法的优缺点,和各种算法使用的各种领域。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1