实验3内存管理 空闲分区表.docx

上传人:b****4 文档编号:5406767 上传时间:2023-05-08 格式:DOCX 页数:17 大小:317.49KB
下载 相关 举报
实验3内存管理 空闲分区表.docx_第1页
第1页 / 共17页
实验3内存管理 空闲分区表.docx_第2页
第2页 / 共17页
实验3内存管理 空闲分区表.docx_第3页
第3页 / 共17页
实验3内存管理 空闲分区表.docx_第4页
第4页 / 共17页
实验3内存管理 空闲分区表.docx_第5页
第5页 / 共17页
实验3内存管理 空闲分区表.docx_第6页
第6页 / 共17页
实验3内存管理 空闲分区表.docx_第7页
第7页 / 共17页
实验3内存管理 空闲分区表.docx_第8页
第8页 / 共17页
实验3内存管理 空闲分区表.docx_第9页
第9页 / 共17页
实验3内存管理 空闲分区表.docx_第10页
第10页 / 共17页
实验3内存管理 空闲分区表.docx_第11页
第11页 / 共17页
实验3内存管理 空闲分区表.docx_第12页
第12页 / 共17页
实验3内存管理 空闲分区表.docx_第13页
第13页 / 共17页
实验3内存管理 空闲分区表.docx_第14页
第14页 / 共17页
实验3内存管理 空闲分区表.docx_第15页
第15页 / 共17页
实验3内存管理 空闲分区表.docx_第16页
第16页 / 共17页
实验3内存管理 空闲分区表.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

实验3内存管理 空闲分区表.docx

《实验3内存管理 空闲分区表.docx》由会员分享,可在线阅读,更多相关《实验3内存管理 空闲分区表.docx(17页珍藏版)》请在冰点文库上搜索。

实验3内存管理 空闲分区表.docx

实验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】查看作业完成情况

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

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2