动态分区存储管理系统分解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统原理
课程设计报告
题目:动态分区分配存储管理系统
所在学院:计算机科学与技术学院
班级: 11级计算机科学与技术(非师) 学号: 20111202052
姓名:吴创连
指导教师:黄侠剑
2014年3月18
目录
1 引言 (1)
2 需求分析 (1)
3 概要设计 (1)
4 详细设计 (1)
4.1问题描述和分析 (1)
4.2程序流程图 (2)
4.3数据结构体分析 (3)
4.4主要程序代码分析 (4)
5 调试与操作说明 (11)
5.1初始界面 (11)
5.2模拟内存分配 (12)
5.3回收内存界面 (12)
5.4最佳适应算法的实现 (13)
5.5最坏适应算法的实现 (13)
6总结与体会 (13)
1 引言
操作系统是最重要的系统软件,同时也是最活跃的学科之一。我们通过操作系统可以理解计算机系统的资源如何组织,操作系统如何有效地管理这些系统资源,用户如何通过操作系统与计算机系统打交道。
存储器是计算机系统的重要组成部分,近年来,存储器容量虽然一直在不断扩大,但仍不能满足现代软件发展的需要,因此,存储器仍然是一种宝贵而又紧俏的资源。如何对它加以有效的管理,不仅直接影响到存储器的利用率,而且还对系统性能有重大影响。而动态分区分配属于连续分配的一种方式,它至今仍在内存分配方式中占有一席之地。
2 需求分析
动态分区分配是根据进程的实际需要,动态地为之分配内存空间。在实现动态分区分配时,将涉及到分区分配中所用的数据结构、分区分配算法和分区的分配和回收操作这样三个问题。常用的数据结构有动态分区表和动态分区链。在对数据结构有一定掌握程度的情况下设计合理的数据结构来描述存储空间,实现分区存储管理的内存分配功能,应该选择最合适的适应算法(最佳适应算法,最坏适应算法),在动态分区存储管理方式中主要实现内存分配和内存回收算法,在这些存储管理中间必然会有碎片的产生,当碎片产生时,进行碎片的拼接等相关的内容。
3 概要设计
本程序采用机构化模块化的设计方法,共分为两大模块。
1.最佳适应算法实现
它从全部空闲区中找出能满足作业要求的、且大小最小的空闲分区,这种方法能使碎片尽量小。为适应此算法,空闲分区表(空闲区链)中的空闲分区要按从小到大进行排序,自表头开始查找到第一个满足要求的自由分区分配。
2.最坏算法实现
最坏适应分配算法要扫描整个空闲分区或链表,总是挑选一个最大的空闲分区分割给作业使用。该算法要求将所有的空闲分区按其容量从大到小的顺序形成一空闲分区链,查找时只要看第一个分区能否满足作业要求。
4 详细设计
4.1 问题描述和分析
系统应利用某种分配算法,从空闲分区链表中找到所需大小的分区,如果空闲分区大小
大于请求分区大小,则从该分区中按改请求的大小划分出一块内存空间大小划分出一块内存空间分配出去,余下的部分仍留在空闲链表中。然后,将分配区的首址返回给调用者。
当进程运行完毕师范内存时,系统根据回收区的首址,从空闲区中找到相应的插入点,此时可能出现以下四种情况之一:
⑴该空闲区的上下两相邻分区都是空闲区:将三个空闲区合并为一个空闲区。新空闲区的起始地址为上空闲区的起始地址,大小为三个空闲区之和。空闲区合并后,取消可用表或自由链中下空闲区的表目项或链指针,修改上空闲区的对应项。
⑵该空闲区的上相邻区是空闲区:将释放区与上空闲区合并为一个空闲区,其起始地址为上空闲区的起始地址,大小为上空闲区与释放区之和。合并后,修改上空闲区对应的可用表的表目项或自由链指针。
⑶该空闲区的下相邻区是空闲区:将释放区与下空闲区合并,并将释放区的起始地址作为合并区的起始地址。合并区的长度为释放区与下空闲区之和。同理,合并后修改可用表或自由链中相应的表目项或链指针。
⑷两相邻区都不是空闲区:释放区作为一个新空闲可用区插入可用表或自由链。
4.2 程序流程图
内存分配流程图,如图4-1所示。
从头开始查表
检索完否?
分区大小>所需大小
分区大小-所需大小<=
不可再分割大小
从该分区中划出所需大小的新分区
将该分区分配给请求者修改有关数
据结构
返回
继续检索下一个表项
将该分区从链中移出
返回
Y
Y
Y N
N
N
内存回收流程图,如图4-2所示。
开始
判断空闲区上下内存情况
上为空下为空上下都为空上下都不为空
将上面的空闲区合并,并回收将下面的空闲区
合并,并回收
将上下的空闲区
合并,并回收
直接将其回收
结束
4.3 数据结构体分析
⑴进程属性结构体
typedef struct readyque
{
char name[10];
int size;
}readyque,*readyqueue;
⑵空闲链表结构体
typedef struct idlyspace
{
int from;
int size;
idlyspace * next;
}idlyspace,*idly;
⑶已分配链表结构体
typedef struct busyspace
{