实验3内存管理 空闲分区表.docx
《实验3内存管理 空闲分区表.docx》由会员分享,可在线阅读,更多相关《实验3内存管理 空闲分区表.docx(17页珍藏版)》请在冰点文库上搜索。
实验3内存管理空闲分区表
南京信息工程大学实验(实习)报告
实验(实习)名称实验3内存管理日期14.5.30得分指导教师
系计软院专业软件工程年级班次姓名学号
实验3内存管理
1、程序中使用的数据结构及符号说明。
structform{//空闲分区表单
intstartaddress;//起址
intsize;//长度
charstate;//状态r代表未分配,e表示空表单
};
structwork{//作业表单
intid;//作业号
intsize;//申请空间大小
intfrom;//起址,正在执行的程序的起址,就绪程序为0k,完成程序为-1k
charstate;//作业状态,r表示就绪,d表示正在运作,o表示作业完成
};
2、作业流程
【1】创建作业表
【2】创建空闲分区表
【3】为作业4申请空闲分区
【4】回收作业2、3的申请量
【5】打印作业完成情况
【6】回收作业1、4的申请量
【7】打印作业完成情况
3、打印一份源程序并附上注释。
#include
#defineNUM10//表单长度
structform{//空闲分区表单
intstartaddress;//起址
intsize;//长度
charstate;//状态r代表未分配,e表示空表单
};
structwork{//作业表单
intid;//作业号
intsize;//申请空间大小
intfrom;//起址
charstate;//作业状态,r表示就绪,d表示正在运作,o表示作业完成
};
voidshowallwork(work*w){//展示所有作业情况
printf("以下是所有作业情况:
\n");
printf("----------------------------------\n");
printf("作业号所需空间大小起始地址状态\n");
printf("----------------------------------\n");
for(inti=0;i<4;i++)
{
printf("%4d%8dk%8dk%6c\n",w[i].id,w[i].size,w[i].from,w[i].state);
}
printf("----------------------------------\n");
printf("《r表示就绪状态,d表示正在执行,o表示完成》");
printf("\n");
printf("\n");
}
voidInit_work(work*w){//初始化作业
printf("请输入作业号所需空间起始地址(0表示地址未分配):
\n");
for(inti=0;i<4;i++)
{
printf("");
scanf("%d%dk%dk",&w[i].id,&w[i].size,&w[i].from);
if(w[i].from)
w[i].state='d';
else
w[i].state='r';
printf("------------------------作业《%d》已经创建\n",w[i].id);
}
showallwork(w);
printf("初始化作业完成\n");
printf("\n");
printf("\n");
}
voidInit_forms(form*f){//初始化表单
printf("请输入起址长度:
\n");
for(inti=0,j=1;i{
if(j)
{
printf("表%d\n",i+1);
scanf("%dk%dk",&f[i].startaddress,&f[i].size);
f[i].state='r';
printf("继续请按序号,完成请按0\n");
scanf("%d",&j);
printf("请输入起址长度\n");
}
else
{
f[i].startaddress=10000;
f[i].size=0;
f[i].state='e';
}
}
}
voidsort_forms1(form*f){//按地址大小排序表单
formtemp;
for(inti=0;i{
for(intj=0;j{
if(f[j].startaddress>f[j+1].startaddress)
{
temp=f[j];
f[j]=f[j+1];
f[j+1]=temp;
}
}
}
}
voidsort_forms2(form*f){//按空间大小排序表单
formtemp;
for(inti=0;i{
for(intj=0;j{
if(f[j].size>f[j+1].size)
{
temp=f[j];
f[j]=f[j+1];
f[j+1]=temp;
}
}
}
}
voidshowallforms(form*f){//展示所有空表
sort_forms1(f);
printf("以下是空闲分区表状态:
\n");
printf("--------------------------------\n");
printf("序号起址长度状态\n");
for(inti=0;i{
if(f[i].size)
printf("%3d%8dk%8dk%6c\n",i+1,f[i].startaddress,f[i].size,f[i].state);
}
printf("--------------------------------\n");
printf("《r表示未分配,e表示空表目显示》");
printf("\n");
printf("\n");
}
formadd_empty_form(){//在末尾加空表单
formf;
f.startaddress=10000;
f.size=0;
f.state='e';
returnf;
}
voidmerge(form*f){//合并相邻的空表单
sort_forms1(f);
for(inti=0;i{
if(f[i].startaddress+f[i].size==f[i+1].startaddress&&f[i+1].size!
=0)
{
f[i].size=f[i].size+f[i+1].size;
for(intj=i+1;jf[j]=f[j+1];
f[NUM-1]=add_empty_form();
i--;
printf("成功合并空表单\n");
}
}
}
voidAdd_form(form*f,work*w){//作业完成,归还空间,创建新的空闲分区
formtemp;
printf("请输入完成的作业序号:
");
intn;
scanf("%d",&n);
for(intj=0;j<4;j++)
{
if(w[j].id==n)
{
temp.startaddress=w[j].from;
temp.size=w[j].size;
temp.state='r';
w[j].from=-1;
w[j].state='o';
break;
}
}
for(inti=0;i{
if(f[i].startaddress>temp.startaddress)
{
for(intj=NUM-1;j>i;j--)
f[j]=f[j-1];
f[i]=temp;
break;
}
}
merge(f);
showallforms(f);
printf("作业完成,归还空间\n");
}
voidapply_form(form*f,work*w){//
sort_forms2(f);
showallforms(f);
inti;
printf("请输入作业号");
scanf("%d",&i);
for(intk=0;k<4;k++)
{
if(w[k].id==i)
{
w[k].state='d';
for(intj=0;j{
if(f[j].size>w[k].size)
{
w[k].from=f[j].startaddress;
f[j].startaddress=f[j].startaddress+w[k].size;
f[j].size=f[j].size-w[k].size;
break;
}
}
}
}
showallforms(f);
showallwork(w);
printf("作业申请空间完成\n");
}
voidmanu(){//菜单
printf("内存管理系统\n");
printf("--------------------------------------\n");
printf("|---1、创建新的空表------------------|\n");
printf("|---2、创建新的作业序列--------------|\n");
printf("|---3、项目完成创建新的空闲分区------|\n");
printf("|---4、申请空闲分区------------------|\n");
printf("|---5、查看分区表--------------------|\n");
printf("|---6、查看作业表--------------------|\n");
printf("--------------------------------------\n");
printf("返回请按0请输入您的选择:
");
}
voidmain(){//主函数
manu();
intoption;
scanf("%d",&option);
while
(1)
{
switch(option)
{
printf("\n");
printf("\n");
case1:
formf[NUM];Init_forms(f);break;
case2:
workw[4];Init_work(w);break;
case3:
Add_form(f,w);break;
case4:
apply_form(f,w);break;
case5:
showallforms(f);break;
case6:
showallwork(w);break;
default:
break;
}
manu();
scanf("%d",&option);
if(!
(option==1||option==2||option==3||option==4||option==5||option==6))
break;
}
}
4、打印程序运行时的初值和运行结果,要求如下:
【1】打印空闲区说明表的初始状态
【2】创建空闲分区
【3】作业4的申请量以及为作业4分配后的空闲区说明表状态;
【4】再依次打印作业3和作业2的归还量以及回收作业3,作业2所占主存后的空闲区说明表。
【5】打印作业情况
【6】回收作业1、4
【7】查看作业完成情况