预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共13页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

计算机科学与工程学院学生实验报告 专业计算机科学与技术班级学号姓名课程名称操作系统课程类型专业必修课实验名称动态分区存储管理的模拟实现实验目的: 熟悉动态分区存储管理方式下,主存空间的分配和回收算法。 提高C语言编程能力。实验内容: 假设主存当前状态如右表所示: 系统采用最佳适应分配算法为作业分配主存空间,而且具有紧凑技术。请编程完成以下操作: (1).输出此时的已分配区表和未分配区表; (2).装入Job3(15K),输出主存分配后的已分配区表和未分配区表; (3).回收Job2所占用的主存空间,输出主存回收后的已分配区表和未分配区表; (4).装入Job4(130K),输出主存分配后的已分配区表和未分配区表。 实验要求 1.数据结构参考定义如下,也可根据需要进行改进: (1)已分配区表: #definen10/*假定系统允许的最大作业数量为n,n值为10*/ struct {intnumber; /*序号*/ intaddress; /*已分配分区起始地址,单位为KB*/ intlength; /*已分配分区长度,单位KB*/ floatflag; /*已分配区表登记栏标志,0:空表项,否则为作业名;*/ }used_table[n]; /*已分配区表*/ (2)未分配区表: #definem10 /*假定系统允许的空闲区表最大为m,m值为10*/ struct {intnumber; /*序号*/ intaddress; /*空闲区起始地址,单位为KB*/ intlength; /*空闲区长度,单位为KB*/ intflag; /*空闲区表登记栏标志,0:空表项;1:空闲区*/ }free_table[m]; /*空闲区表*/ 2.以allocate命名主存分配所用的过程或函数(算法参考课件),要将各种情况考虑周全。 3.以reclaim命名主存回收所用的过程或函数(算法参考课件),要将各种情况考虑周全。 4.画出算法实现的N-S流程图。 5.程序调试、运行成功后,请老师检查。 实验步骤: 分配内存,结果如下图: 回收内存,结果如下图: 合并内存,结果如下图: 4.N-S流程图: 4.1内存分配流程图: 4.2内存回收流程图: 附录程序代码: #define_CRT_SECURE_NO_WARNINGS1 #include<stdio.h> #include<stdlib.h> enumSTATE { Free, Busy }; structsubAreaNode { intaddr;//起始地址 intsize;//分区大小 inttaskId;//作业号 STATEstate;//分区状态 subAreaNode*pre;//分区前向指针 subAreaNode*nxt;//分区后向指针 }subHead; //初始化空闲分区链 voidintSubArea() { //分配初始分区内存 subAreaNode*fir=(subAreaNode*)malloc(sizeof(subAreaNode)); //给首个分区赋值 fir->addr=0; fir->size=240;//内存初始大小 fir->state=Free; fir->taskId=-1; fir->pre=&subHead; fir->nxt=NULL; //初始化分区头部信息 subHead.pre=NULL; subHead.nxt=fir; } //最佳适应算法 intbestFit(inttaskId,intsize) { subAreaNode*tar=NULL; inttarSize=240+1; subAreaNode*p=subHead.nxt; while(p!=NULL) { //寻找最佳空闲区间 if(p->state==Free&&p->size>=size&&p->size<tarSize) { tar=p; tarSize=p->size; } p=p->nxt; } if(tar!=NULL) { //分配大小为size的区间 subAreaNode*node=(subAreaNode*)malloc(sizeof(subAreaNode)); node->addr=tar->addr+size; node->size=tar->size-size; node->state=Free; node->taskId=-1; //修改分区链节点指针 node->pre=tar; node->nxt=tar->nxt; if(tar->nxt!=NULL) { tar->nxt->pre=node; } tar->nxt=node; //分配空闲区间 tar->size=size;