实验四存储器管理Word下载.docx
- 文档编号:21221906
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:14
- 大小:40.57KB
实验四存储器管理Word下载.docx
《实验四存储器管理Word下载.docx》由会员分享,可在线阅读,更多相关《实验四存储器管理Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
(2)Requiretocollectethesize.将分配的内存回收
(3)Checkthememory。
检查当前的内存情况
(4)Quit。
退出
***********************************
1
Enteryourjobname:
JOB1
Enteryourjoblength:
1000
namelength(b)addre
JOB110002000
Thetotalleftis4000bytes
6.实验程序
#include〈stdio。
h〉
#include<
dos.h>
#include〈stdlib.h〉
#include〈conio.h>
#include<
io.h>
#include"
string.h”
#defineTOTALSPACE5000/*起始空闲空间大小
#defineINITADDRESS2000/*起始地址
#defineMINSPACE100
#defineMAXJOBCNT10/*内存中作业数量最大值
structJobMat
{
charname[10];
intaddress;
intlength;
structJobMat*next;
structJobMat*back;
};
structFreeArea
intaddress;
intsize;
structFreeArea*next;
structFreeArea*back;
structJobMat*p_JobMat;
structFreeArea*p_FreeArea;
intUnusedSpace;
/*未分配的空闲空间大小
intCurrentJobCnt;
/*目前内存中的作业数量
intJobSize;
/*目前要分配的作业的大小
charJobName[10];
intJobAddress;
voidinitiation(){
p_FreeArea=(structFreeArea*)malloc(sizeof(structFreeArea));
p_FreeArea—>
size=TOTALSPACE;
p_FreeArea—〉address=INITADDRESS;
p_FreeArea—〉next=NULL;
back=NULL;
UnusedSpace=TOTALSPACE;
p_JobMat=NULL;
CurrentJobCnt=0;
JobSize=0;
memset(JobName,0,10);
JobAddress=0;
}
voidffallocation()
{
structFreeArea*fp;
structJobMat*jp;
structJobMat*jp1;
structJobMat*jp2;
JobAddress=—1;
if(UnusedSpace<
JobSize)
{
/*printf(”Sorry,youinputjoblengthistoobig^_^\n"
);
*/
return;
}
fp=p_FreeArea;
while(fp!
=NULL)
if((fp->
size)〈JobSize)
{
fp=fp->
next;
}
else
CurrentJobCnt=CurrentJobCnt+1;
UnusedSpace=UnusedSpace-JobSize;
jp2=(structJobMat*)malloc(sizeof(structJobMat));
strcpy(jp2-〉name,JobName);
jp2-〉length=JobSize;
jp2—>
address=fp—〉address;
JobAddress=jp2—>
address;
if(p_JobMat==NULL)
{
jp2->
next=NULL;
jp2—〉back=NULL;
p_JobMat=jp2;
}
else
jp=p_JobMat;
while((jp!
=NULL)&&(jp2—〉address〈jp—>
address))
{
jp1=jp;
jp=jp->
next;
}
jp2—>
next=jp;
if(jp==NULL)
jp2—〉back=jp1;
jp1->
next=jp2;
}
{
jp2—>
back=jp-〉back;
if(jp->
back!
=NULL)jp1—>
elsep_JobMat=jp2;
jp—〉back=jp2;
}
if(fp—〉size—JobSize<
MINSPACE)
if(fp->
next!
=NULL)fp—〉next—〉back=fp—>
back;
if(fp—〉back!
=NULL)fp->
back->
next=fp->
elsep_FreeArea=fp—〉next;
{
fp—>
size=fp—〉size-JobSize;
fp-〉address=fp-〉address+JobSize;
/*exit
(1);
*/
}
}
voidffcollection()
structFreeArea*fp;
structFreeArea*fp1;
structFreeArea*fp2;
structJobMat*jp;
intf;
jp=p_JobMat;
f=0;
while((jp!
=NULL)&
&
strcmp(jp->
name,JobName)!
=0)
jp=jp-〉next;
if(jp!
{
CurrentJobCnt=CurrentJobCnt—1;
UnusedSpace=UnusedSpace+jp—〉length;
if(p_FreeArea==NULL)
p_FreeArea=(structFreeArea*)malloc(sizeof(structFreeArea));
p_FreeArea->
address=jp—〉address;
p_FreeArea-〉size=jp—>
length;
next=NULL;
p_FreeArea-〉back=NULL;
fp=p_FreeArea;
while((fp!
=NULL)&
(fp-〉address<
jp—>
{
fp1=fp;
fp=fp->
if(fp!
if((fp—〉next!
&(fp—>
next-〉address==jp—>
address+jp—>
length))
f=f+1;
if((fp—>
back!
=NULL)&&
(jp->
address==fp1—>
address+fp1—>
size))
f=f+2;
elseif((jp->
address)==(fp1-〉address+(fp1-〉size)))
f=f+2;
switch(f)
case0:
fp2=(structFreeArea*)malloc(sizeof(structFreeArea));
fp2->
address=jp—>
address;
size=jp-〉length;
next=fp;
if(fp!
{
fp2—〉back=fp-〉back;
if(fp—>
=NULL)fp1-〉next=fp2;
elsep_FreeArea=fp2;
fp-〉back=fp2;
}
else
{
fp2-〉back=fp1;
fp1—>
next=fp2;
}
break;
case1:
fp->
size=fp-〉size+jp—>
length;
fp—〉address=jp—>
case2:
fp1-〉size=fp1-〉size+jp-〉length;
break;
case3:
fp1—〉size=fp1->
size+jp—>
length+fp->
size;
fp1->
next=fp—〉next;
if(fp->
next!
fp->
next-〉back=fp2;
free(fp);
}
if(jp==p_JobMat)p_JobMat=jp—〉next;
if(jp->
=NULL){jp—>
next—〉back=jp—>
back;
if(jp—〉back!
=NULL)jp—>
back-〉next=jp->
free(jp);
voidshowyou()
/*clrscr();
if(CurrentJobCnt<
=0)
printf(”Nojob。
\n"
);
else
printf(”namelength(b)addre\n”);
jp=p_JobMat;
while(jp!
printf(”%s%d%d\n”,jp-〉name,jp—〉length,jp—>
address);
jp=jp->
printf("
Thetotalleftis%dbytes\n"
UnusedSpace);
voidcoalesce()
structFreeArea*fp1;
intbottom;
if(CurrentJobCnt>
0)
jp=p_JobMat;
bottom=TOTALSPACE+INITADDRESS;
while(jp!
jp-〉address=bottom—jp—>
bottom=bottom-jp-〉length;
fp=p_FreeArea;
while(fp!
fp1=fp;
fp=fp-〉next;
free(fp1);
p_FreeArea=(structFreeArea*)malloc(sizeof(structFreeArea));
p_FreeArea—>
size=UnusedSpace;
p_FreeArea-〉address=INITADDRESS;
p_FreeArea->
p_FreeArea—〉back=NULL;
voidmenu()
intselect;
\n\n\n****************MENU***************\n"
printf(”
(1)Requiretobeallocate。
(2)Requiretocollectethesize.\n"
printf(”(3)Checkthememory.\n"
printf(”(4)Quit。
\n”);
printf(”***********************************\n”);
scanf(”%d"
&
select);
switch(select)
case1:
if(CurrentJobCnt>
=MAXJOBCNT)
printf("
Thejobistoomany"
"
scanf(”%s”,JobName);
printf("
Enteryourjoblength:
”);
scanf("
%d”,&JobSize);
ffallocation();
switch(JobAddress)
case—1:
printf("
thememoryisfull”);
case0:
coalesce();
ffallocation();
default:
break;
case2:
Enterthenameofjob:
”);
%s”,JobName);
ffcollection();
break;
case3:
case4:
exit
(1);
default:
Youinputawrongnumber!
voidmain()
initiation();
while
(1)
menu();
showyou();
7.实验结果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 存储器 管理