实验3内存管理空闲分区表概要.docx
- 文档编号:7287858
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:15
- 大小:317.57KB
实验3内存管理空闲分区表概要.docx
《实验3内存管理空闲分区表概要.docx》由会员分享,可在线阅读,更多相关《实验3内存管理空闲分区表概要.docx(15页珍藏版)》请在冰豆网上搜索。
实验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;j f[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】查看作业完成情况
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 内存 管理 空闲 分区表 概要