可变分区内存管理实验.doc

上传人:11****ws 文档编号:3273955 上传时间:2019-05-28 格式:DOC 页数:15 大小:777KB
下载 相关 举报
可变分区内存管理实验.doc_第1页
第1页 / 共15页
可变分区内存管理实验.doc_第2页
第2页 / 共15页
可变分区内存管理实验.doc_第3页
第3页 / 共15页
可变分区内存管理实验.doc_第4页
第4页 / 共15页
可变分区内存管理实验.doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

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

2、是可变的。显然可变分区有较大的灵活性,较之固定分区能获得好的内存利用率。关键词:目 录1 需求分析 .21.1 确定目标系统的功能.22 总体设计.32.1 整体思路 .32.2 设计所采用的算法.32.3 内存的分配与回收所采用的结构体.32.4 关于内存分配留下的小碎片问题.32.5 内存的回收.43 详细设计 .43.1 系统采用的数据结构 .43.2 系统的核心算法 .53.3 流程图.83.4 内存的分配与回收截图.104 总结 .154.1 设计体会. .15 4.2 系统改进.15参考文献.151 需求分析1.1 确定目标系统功能实现一个完整的可变分区管理器,包括分配,回收,分区

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

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

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

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

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

8、闲区表最大为 m 下图是空闲链表的示意图。系统区空闲块分 配区1空闲块分 配区2空闲 链节点空闲 链节点空闲表头3.2 核心算法:/最优分配算法实现的动态分区int distribute(int process_name, float need_length)int i, k=-1; /k 用于定位在空闲表中选择的未分配栏float ads, len;int count=0;i=0;6/核心的查找条件,找到最优空闲区while(i=m-1) /循环找到最佳的空闲分区if(free_tablei.flag=1 if(count=1|free_tablei.length free_tablek.l

9、ength)k=i;i=i+1;if(k!=-1)if(free_tablek.length-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.fla

10、g!=0) i=i+1;if(i=n-1) /找到,在已分配区表中登记一个表项used_tablei.address=ads;used_tablei.length=len;used_tablei.flag=process_name;count1+;7else /已分配区表长度不足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 程序流程图作业分配流程图:89内存回收流程图:103.4 内存分配回收实现截图:1、后台代码的截图:(1)、假定系统内存分配表允许的最大作业项为 10,当分配超过 10 时,提示“内存分配区已满,分配失败” 。(2)、回收作业所占内存时,当输入的作业名不存在,回收失败,提示“该作业不存在” 。

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

当前位置:首页 > 重点行业资料库 > 医药卫生

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。