内存的申请和释放
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机学院网络工程专业
操作系统课程设计
题目:内存的申请和释放
班级:网工11102班
姓名:郭阳学号: 2
同组人姓名:
起迄日期: 第一周,第二周
课程设计地点: E3——A513 指导教师:贺玉才
评阅意见:
成绩评定:
评阅人:日期:
完成日期:2014年3月
目录
一、概述3
1、设计目的3
2、开发环境3
二、设计要求3
三、实验基本原理3
四、程序流程图4
1、整体程序流程图4
2、内存分配ALLOCATE()流程图5
五、源程序6
1、数据结构6
2、主要功能函数6
3、源程序代码7
六、运行结果17
1、测试用例与程序运行结果截图17
2、内存分配正确测试错误!未定义书签。
3、内存回收错误测试错误!未定义书签。
4、内存回收正确测试用例错误!未定义书签。
七、总结18
八、参考文献18
一、概述
1、设计目的
了解操作系统的内存分配的方法
2、开发环境
WINDOWS环境Visual C++6.0
二、设计要求
定义一个自由存储块链表,按块地址排序,表中记录块的大小。当请求分配内存时,扫描自由存储块链表,知道找到一个足够大的可供分配的内存块,若找到的块的大小正好等于所请求的大小时,就把这一块从自由链表中取下来,返回给申请者。若找到的块太大,即对其分割,并从该块的高地址不分往低地址部分分割,取出大小合适的块返还给申请者,愈小的低地址部分留在链表中。若找不到足够大的块,就从操作系统中请求另外一个足够大的内存区域,并把它连接到自由块链表中,然后再继续搜索。
释放存储块也要搜索自由链表,目的是找到适当的位置将要释放的块插进去,如果被释放的块的任何一边与链表中的某一块临接,即对其进行合并操作,直到没有合并的临接块为止,这样可以防止存储空间变得零碎。。
三、实验基本原理
分区存储管理是给内存中的进程划分适当大小的存储区,以连续存储各进程的程序和数据,使各进程能并发地执行。最优适应分配算法扫描整个未分配区表或链表,从空闲区中挑选一个能满足用户进程要求的最小分区进行分配。
在可变分区模式下,在系统初启且用户作业尚未装入主存储器之前,整个用户区是一个大空闲分区,随着作业的装入和撤离,主存空间被分成许多分区,有的分区被占用,而有的分区时空闲的。为了方便主存空间的分配和去配,用于管理的数据结构可由两张表组成:
“已分配区表”和“未分配区表”。在“未分配表中”将空闲区按长度递增顺序排列,当装入新作业时,从未分配区表中挑选一个能满足用户进程要求的最小分区进行分配。这时从已分配表中找出一个空栏目登记新作业的起始地址和占用长度,同时修改未分配区表中空闲区的长度和起始地址。当作业撤离时已分配区表中的相应状态变为“空”,而将收回的分区登记到未分配区表中,若有相邻空闲区再将其连接后登记。可变分区的回收算法较为复杂,当一个作业撤离时,可分为4种情况:其临近都有作业(A和B),其一边有作业(A或B),其两边均为空闲区。尤其重要的是,在程序中利用“new 类型T(初值列表)”申请分配用于存放T类型数据的内存空间,利用“delete 指针名”释放指针所指向的内存空间。
四、程序流程图
1、整体程序流程图
2、内存分配allocate()流程图
五、源程序
1、数据结构
(1)内存块
struct space //定义内存空间结构体
{
long startaddress;
long length;
struct space *next;
};
space *pbc;
(2)、作业块
struct work //定义进程结构体
{
char name[20];
long startaddress;
long length;
struct work *next;
};
work *S;
2、主要功能函数
allocate() :实现内存分配,并在当中调用display(pbc),以及display(S) 两个函数显示内存分配完后的空闲块链表和进程链表情况。
requireback():实现内存回收,在满足情况的条件下调用allocate()对用户申请的内存块进行回收并在当中调用display(pbc),以及display(S)显示内存回收完后的空
闲块链表和进程链表情况。
callback():按内存回收时的四种情况对内存进行回收。
display(pbc):对空闲块链表中的空闲块进行从小到大排序并显示空闲链情况。
display(S):对进程链表中的进程进行从小到大排序并显示进程链情况。
main():创建并初始化空闲块链表和进程链链表,用户选择操作功能3、源程序代码
#include
#include
#include
struct space //定义内存空间结构体{
long startaddress;
long length;
struct space *next;
};
space *pbc; //申明结构体指针
struct work //定义进程结构体
{
char name[20];
long startaddress;
long length;
struct work *next;
};
work *S; //申明结构体指针
void callback(work *r); //申明callback()函数原型void display(space *pbc); //申明display()函数原型