动态分区存储管理的模拟实现

上传人:陈** 文档编号:94325628 上传时间:2022-05-22 格式:DOC 页数:15 大小:275.50KB
返回 下载 相关 举报
动态分区存储管理的模拟实现_第1页
第1页 / 共15页
动态分区存储管理的模拟实现_第2页
第2页 / 共15页
动态分区存储管理的模拟实现_第3页
第3页 / 共15页
点击查看更多>>
资源描述
精品范文模板 可修改删除撰写人:_日 期:_计算机科学与工程学院学生实验报告专 业计算机科学与技术班 级学 号姓 名课程名称操作系统课程类型专业必修课实验名称动态分区存储管理的模拟实现实验目的:1. 熟悉动态分区存储管理方式下,主存空间的分配和回收算法。2. 提高C语言编程能力。实验内容:假设主存当前状态如右表所示:系统采用最佳适应分配算法为作业分配主存空间,而且具有紧凑技术。请编程完成以下操作:(1). 输出此时的已分配区表和未分配区表;(2). 装入 Job3(15K),输出主存分配后的已分配区表和未分配区表;(3). 回收 Job2所占用的主存空间,输出主存回收后的已分配区表和未分配区表;(4).装入 Job4(130K),输出主存分配后的已分配区表和未分配区表。实验要求1.数据结构参考定义如下,也可根据需要进行改进:(1)已分配区表:#define n 10 /*假定系统允许的最大作业数量为n,n值为10*/structint number; /*序号*/ int address;/*已分配分区起始地址,单位为KB */ int length;/*已分配分区长度,单位KB*/ float flag;/*已分配区表登记栏标志,0:空表项,否则为作业名;*/used_tablen;/*已分配区表*/(2)未分配区表:#define m 10 /*假定系统允许的空闲区表最大为m,m值为10*/structint number; /*序号*/ int address; /*空闲区起始地址,单位为KB */ int length;/*空闲区长度,单位为KB*/ int flag;/*空闲区表登记栏标志,0:空表项;1:空闲区*/free_tablem;/*空闲区表*/2.以allocate命名主存分配所用的过程或函数(算法参考课件),要将各种情况考虑周全。3.以reclaim命名主存回收所用的过程或函数(算法参考课件),要将各种情况考虑周全。4.画出算法实现的N-S流程图。5.程序调试、运行成功后,请老师检查。实验步骤:1. 分配内存,结果如下图:2. 回收内存,结果如下图:3. 合并内存,结果如下图:4.N-S流程图: 4.1 内存分配流程图:4.2 内存回收流程图:附录 程序代码:#define _CRT_SECURE_NO_WARNINGS 1 #include#includeenum STATE Free,Busy; struct subAreaNode int addr; / 起始地址int size; / 分区大小int taskId; / 作业号STATE state; / 分区状态subAreaNode *pre; / 分区前向指针subAreaNode *nxt; / 分区后向指针subHead;/ 初始化空闲分区链void intSubArea()/ 分配初始分区内存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;/ 最佳适应算法int bestFit(int taskId, int size)subAreaNode *tar = NULL;int tarSize = 240 + 1;subAreaNode *p = subHead.nxt;while (p != NULL)/ 寻找最佳空闲区间if (p-state = Free & p-size = size & p-size 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;tar-state = Busy;tar-taskId = taskId;printf(内存分配成功!n);return 1;elseprintf(找不到合适的内存分区,分配失败.n);return 0;/ 回收内存 int freeSubArea(int taskId) int flag = 0;subAreaNode *p = subHead.nxt, *pp;while (p != NULL)if (p-state = Busy & p-taskId = taskId)flag = 1;if (p-pre != &subHead & p-pre-state = Free)& (p-nxt != NULL & p-nxt-state = Free)/ 情况1:合并上下两个分区/ 先合并上区间pp = p;p = p-pre;p-size += pp-size;p-nxt = pp-nxt;pp-nxt-pre = p;free(pp);/ 后合并下区间pp = p-nxt;p-size += pp-size;p-nxt = pp-nxt;if (pp-nxt != NULL) pp-nxt-pre = p;free(pp);else if (p-pre = &subHead | p-pre-state = Busy)& (p-nxt != NULL & p-nxt-state = Free) / 情况2:只合并下面的分区pp = p-nxt;p-size += pp-size;p-state = Free;p-taskId = -1;p-nxt = pp-nxt;if (pp-nxt != NULL) pp-nxt-pre = p;free(pp);else if (p-pre != &subHead & p-pre-state = Free)& (p-nxt = NULL | p-nxt-state = Busy) / 情况3:只合并上面的分区pp = p;p = p-pre;p-size += pp-size;p-nxt = pp-nxt;if (pp-nxt != NULL) pp-nxt-pre = p;free(pp);else/ 情况4:上下分区均不用合并p-state = Free;p-taskId = -1;p = p-nxt;if (flag = 1)/ 回收成功printf(内存分区回收成功.n);return 1;else / 找不到目标作业,回收失败printf(找不到目标作业,内存分区回收失败.n);return 0;/ 显示空闲分区链情况void showSubArea()printf(*n);printf( 当前的内存分配情况如下: n);printf(*n);printf( 起始地址 | 空间大小 | 工作状态 | 作业号 n);subAreaNode *p = subHead.nxt;while (p != NULL)printf(*-*n);printf(*);printf( %3d k |, p-addr);printf( %3d k |, p-size);printf( %s |, p-state = Free ? Free : Busy);if (p-taskId 0) printf( %2d , p-taskId);elseprintf( );printf(*n);p = p-nxt;printf(*n);int main()int option, ope, taskId, size;/ 初始化空闲分区链intSubArea(); / 模拟动态分区分配算法while (1)printf(n);/printf(*n);printf( 1: 分配内存 2: 回收内存 0: 退出 n);printf(*n);scanf(%d, &ope);if (ope = 0) break;if (ope = 1) / 模拟分配内存printf(请输入作业号: );scanf(%d, &taskId);printf(请输入需要分配的内存大小(KB): );scanf(%d, &size);if (size = 0) printf(错误:分配内存大小必须为正值n);continue;/ 调用分配算法bestFit(taskId, size);/ 显示空闲分区链情况showSubArea();else if (ope = 2)/ 模拟回收内存printf(请输入要回收的作业号: );scanf(%d, &taskId);freeSubArea(taskId);/ 显示空闲分区链情况showSubArea();else printf(错误:请输入 0/1/2n);printf(分配算法模拟结束n);system(pause);return 0;实验总结:通过本次实验,基本实现了内存分配和内存回收,内存分配中所运用的算法是最佳适应分配算法,但是该程序没有实现紧凑性,程序其他方面没有问题。实验评语:实验成绩教师签名第 15 页 共 15 页免责声明:图文来源于网络搜集,版权归原作者所以若侵犯了您的合法权益,请作者与本上传人联系,我们将及时更正删除。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!