可变分区内存管理实验

上传人:大米 文档编号:499507426 上传时间:2023-05-07 格式:DOC 页数:15 大小:777KB
返回 下载 相关 举报
可变分区内存管理实验_第1页
第1页 / 共15页
可变分区内存管理实验_第2页
第2页 / 共15页
可变分区内存管理实验_第3页
第3页 / 共15页
可变分区内存管理实验_第4页
第4页 / 共15页
可变分区内存管理实验_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《可变分区内存管理实验》由会员分享,可在线阅读,更多相关《可变分区内存管理实验(15页珍藏版)》请在金锄头文库上搜索。

1、题目: 可变分区内存管理实验 学 号10130506学生姓名李文涛专业(班级)软件工程设计题目 可变分区内存管理实验 设计技术参数系统平台:windows XP/windows 7开发工具:vc6.0设计要求实现一个完整的可变分区管理器,包括分配,回收,分区碎片整理等。工作量课程设计报告要求不少于3000字。工作计划:熟悉题目并理解,及找寻相关资料。:熟悉vc6.0及其操作。:完成界面及word文档。参考资料 11年 12 月 2 日摘 要可变分区是指系统不预先划分固定分区,而是在装入程序的时候划分内存区域,使得为程序分配的分区大小恰好等于该程序的需求量,且分区的个数是可变的。显然可变分区有较

2、大的灵活性,较之固定分区能获得好的内存利用率。 关键词:目 录1 需求分析21.1确定目标系统的功能.22 总体设计.32.1 整体思路3 2.2 设计所采用的算法.3 2.3 内存的分配与回收所采用的结构体.3 2.4 关于内存分配留下的小碎片问题.3 2.5 内存的回收.43 详细设计43.1 系统采用的数据结构43.2 系统的核心算法5 3.3 流程图.8 3.4 内存的分配与回收截图.104 总结154.1设计体会. .15 4.2系统改进.15参考文献.15 1 需求分析1.1 确定目标系统功能实现一个完整的可变分区管理器,包括分配,回收,分区碎片整理等。具有一定的容错性,当操作出现

3、错误,比如空间不足,空指针引用等的情况下可以进行处理。空闲块可以合并。能对已分配空间进行跟踪。当做碎片整理时,需要跟踪分配的空间,修改其引用以保证引用的正确性。2. 总体设计2.1 整体思路:可变分区管理方式将内存除操作系统占用区域外的空间看做一个大的空闲区。当作业要求装入内存时,根据作业需要内存空间的大小 查询内存中的各个空闲区,当从内存空间中找到一个大于或等于该作业大小的内存空闲区时,选择其中一个空闲区,按作业需求量划出一个分区装人该作业,作业执行完后,其所占的内存分区被收回,成为一个空闲区。如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。2.2设计所采用的算法: 采

4、用最优适应算法,每次为作业分配内存时,总是把既能满足要求、又是最小的空闲分区分配给作业。 但最优适应算法容易出现找到的一个分区可能只比作业所需求的长度略大一点的情行,这时,空闲区分割后剩下的空闲区就很小以致很难再使用,降低了内存的使用率。为解决此问题,设定一个限值minsize,如果空闲区的大小减去作业需求长度得到的值小于等于minsize,不再将空闲区分成己分分区和空闲区两部分,而是将整个空闲区都分配给作业。2.3内存分配与回收所使用的结构体: 为便于对内存的分配和回收,建立两张表记录内存的使用情况。一张为记录作业占用分区的“内存分配表”,内容包括分区起始地址、长度、作业名/标志(为0时作为

5、标志位表示空栏目);一张为记录空闲区的“空闲分区表”,内容包括分区起始地址、长度、标志(0表空栏目,1表未分配)。两张表都采用顺序表形式。2.4关于分配留下的内存小碎片问题:当要装入一个作业时,从“空闲分区表”中查找标志为“1”(未分配)且满足作业所需内存大小的最小空闲区,若空闲区的大小与作业所需大小的差值小于或等于minsize,把该分区全部分配给作业,并把该空闲区的标志改为“0”(空栏目)。同时,在已分配区表中找到一个标志为“0”的栏目登记新装人作业所占用分区的起始地址,长度和作业名。若空闲区的大小与作业所需大小的差值大于minsize。则把空闲区分成两部分,一部分用来装入作业,另外一部分

6、仍为空闲区。这时只要修改原空闲区的长度,且把新装人的作业登记到已分配区表中。2.5内存的回收:在可变分区方式下回收内存空间时,先检查是否有与归还区相邻的空闲区(上邻空闲区,下邻空闲区)。若有,则将它们合件成一个空闲区。程序实现时,首先将要释放的作业在“内存分配表”中的记录项的标志改为“0”(空栏目),然后检查“空闲区表”中标志为1(未分配)的栏目,查找是否有相邻的空闲区,若有,将之合并,并修改空闲区的起始地址和长度。3.详细设计3.1:数据结构(1)已分配表的定义:structfloat address; /已分分区起始地址 float length; /已分分区长度,单位为字节 int fl

7、ag; /已分配区表登记栏标志,0表示空栏目,实验中只支持一个字符的作业名used_tablen; /已分配区表(2)空闲分区表的定义:structfloat address;/空闲区起始地址 float length;/空闲区长度,单位为字节 int flag; /空闲区表登记栏标志,用0表示空栏目,用1表示未分配free_tablem; /空闲区表 (3)全局变量float minsize=5; #define n 10 /假定系统允许的最大作业数量为n#define m 10/假定系统允许的空闲区表最大为m下图是空闲链表的示意图。3.2核心算法:/最优分配算法实现的动态分区int dis

8、tribute(int process_name, float need_length)int i, k=-1;/k用于定位在空闲表中选择的未分配栏float ads, len;int count=0;i=0;/核心的查找条件,找到最优空闲区 while(i=m-1) /循环找到最佳的空闲分区if(free_tablei.flag=1 & need_length =free_tablei.length)count+;if(count=1|free_tablei.length free_tablek.length)k=i;i=i+1;if(k!=-1)if(free_tablek.length-

9、need_length)=minsize) /整个分配free_tablek.flag=0;ads=free_tablek.address;len=free_tablek.length;else/切割空闲区ads=free_tablek.address;len=need_length;free_tablek.address+=need_length;free_tablek.length-=need_length;i=0;/循环寻找内存分配表中标志为空栏目的项while(used_tablei.flag!=0) i=i+1;if(i=n-1) /找到,在已分配区表中登记一个表项used_tabl

10、ei.address=ads;used_tablei.length=len;used_tablei.flag=process_name;count1+;else /已分配区表长度不足if(free_tablek.flag = 0) /将已做的整个分配撤销free_tablek.flag=1;free_tablek.address=ads;free_tablek.length=len;else /将已做的切割分配撤销free_tablek.address=ads; free_tablek.length+=len;cout内存分配区已满,分配失败!n; return 0;elsecout 无法为该作业找到合适分区!n;return 0;return process_name;3.3程序流程图作业分配流程图:内存回收流程图:3.4内存分配回收实现截图:1、后台代码的截图:(1)、假定系统内存分配表允许的最大作业项为10,当分配超过10时,提示“内存分配区已满,分配失败”。(2)、回收作业所占内存时,当输入的作业名不存在,回收失败,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号