《内存的申请和释放》由会员分享,可在线阅读,更多相关《内存的申请和释放(20页珍藏版)》请在金锄头文库上搜索。
1、计算机学院网络工程专业操作系统课程设计题目:内存的申请和释放班级:网工11102班姓名:郭阳学号:2同组人姓名:起迄日期:第一周,第二周 课程设计:t 13指导教师:贺评阅意见:成绩评定:评阅人:日期:完成日期:2014年3月目录一、概述31、设计目的32、开发环境3二、设计要求3三、实验基本原理3四、程序流程图41、整体程序流程图42、内存分配ALLOCATE:)流程图5五、源程序61、数据结构 62、主要功能函数 63、源程序代码 7六、运行结果 171、测试用例与程序运行结果截图 172、内存分配正确测试错误!未定义书签。3、内存回收错误测试错误!未定义书签。4、内存回收正确测试用例错误
2、!未定义书签。七、总结 18八、参考文献 18一、概述1、设计目的了解操作系统的内存分配的方法2、开发环境WINDOWS 环境 Visual C+6.0二、设计要求定义一个自由存储块链表,按块地址排序,表中记录块的大小。当请求分配内存时,扫描 自由存储块链表,知道找到一个足够大的可供分配的内存块,若找到的块的大小正好等于所 请求的大小时,就把这一块从自由链表中取下来,返回给申请者。若找到的块太大,即对其 分割,并从该块的高地址不分往低地址部分分割,取出大小合适的块返还给申请者,愈小的 低地址部分留在链表中。若找不到足够大的块,就从操作系统中请求另外一个足够大的内存 区域,并把它连接到自由块链表
3、中,然后再继续搜索。释放存储块也要搜索自由链表,目的是找到适当的位置将要释放的块插进去,如果被释 放的块的任何一边与链表中的某一块临接,即对其进行合并操作,直到没有合并的临接块为 止,这样可以防止存储空间变得零碎。三、实验基本原理分区存储管理是给内存中的进程划分适当大小的存储区,以连续存储各进程的程序和数 据,使各进程能并发地执行。最优适应分配算法扫描整个未分配区表或链表,从空闲区中挑 选一个能满足用户进程要求的最小分区进行分配。在可变分区模式下,在系统初启且用户作业尚未装入主存储器之前,整个用户区是一 个大空闲分区,随着作业的装入和撤离,主存空间被分成许多分区,有的分区被占用,而有 的分区时
4、空闲的。为了方便主存空间的分配和去配,用于管理的数据结构可由两张表组成: “已分配区表”和“未分配区表”。在“未分配表中”将空闲区按长度递增顺序排列,当装 入新作业时,从未分配区表中挑选一个能满足用户进程要求的最小分区进行分配。这时从已 分配表中找出一个空栏目登记新作业的起始地址和占用长度,同时修改未分配区表中空闲区 的长度和起始地址。当作业撤离时已分配区表中的相应状态变为“空”,而将收回的分区登 记到未分配区表中,若有相邻空闲区再将其连接后登记。可变分区的回收算法较为复杂,当 一个作业撤离时,可分为4种情况:其临近都有作业(A和B),其一边有作业(A或B), 其两边均为空闲区。尤其重要的是,
5、在程序中利用“new类型T(初值列表)”申请分配用 于存放T类型数据的内存空间,利用“delete指针名”释放指针所指向的内存空间。四、程序流程图1、整体程序流程图2、内存分配allocate ()流程图返回开始否是是否否是是習否否处于空闲链讎是程大外是否合程名是否已经存右否存在満足大小空两空间块是否有剰i调用display函数对进程链 进行排序,并显示进程铤调用display函数对空闲链 进行排序,并显示空闲链用户输入进程名与夫朮h更新空闲链,餐放空司修改空闲块起始地址宣接更新空闲链分配失取L释放空低T进程夭小不合袪进行内存分配逬程名已存在五、1、数据结构/定义内存空间结构体/定义进程结构体
6、(1)内存块struct spacelong startaddress; long length;struct space *next;space *pbc;(2)、作业块struct workchar name20;long startaddress; long length;struct work *next;work *S;2、主要功能函数allocate() :实现内存分配,并在当中调用display(pbc),以及display(S)两个函数显示内存分配完后的空闲块链表和进程链表情况。requireback():实现内存回收,在满足情况的条件下调用allocate)对用户申请的内存块
7、进行回收并在当中调用display(pbc),以及display(S)显示内存回收完后的空闲块链表和进程链表情况。callback(): 按内存回收时的四种情况对内存进行回收。display(pbc): 对空闲块链表中的空闲块进行从小到大排序并显示空闲链情况 display(S): 对进程链表中的进程进行从小到大排序并显示进程链情况。 main():创建并初始化空闲块链表和进程链链表,用户选择操作功能3、源程序代码#include #include#include struct spacelong startaddress; long length;struct space *next;spa
8、ce *pbc;struct workchar name20;long startaddress; long length;struct work *next;work *S;void callback(work *r); void display(space *pbc);/定义内存空间结构体/申明结构体指针/定义进程结构体/申明结构体指针申明callback()函数原型申明display()函数原型void display(work *S);void allocate()/内存分配函数实现work *q,*w;q=new work;/申请分配用于存放 work 类型的数据的内存空间coutv
9、v请输入进程名和占用空间大小:vvendl;cinq-nameq-length;if(q-lengthv=0)coutvv进程错误.vvendl;delete q;return;w=S;while(w-next!=NULL)if(strcmp(w-next-name, q-name)=0)coutvv此进程名已经存在!vvendl;/判断输入进程的合法性/进程错误,释放内存空间/进程链不为空/判断进程名是否已经存在/进程名已经存在,返回return;w=w-next;if(w-next=NULL) /进程名不存在,继续进行内存分配 space *p,*r;p=pbc;r=p;while(p-n
10、ext!=NULL&p-next-lengthvq-length) /在空间链中寻找第一个大于所输入的进程大小的空闲块r=p;p=p-next;if(p-next=NULL)/空闲链中无大于所输入进程空间大小的空闲块coutvv空间不足,分配失败! vvendl;delete q;/空间不足,分配失败,释放空间return;else/找到第一个满足要求的空闲块q-startaddress=p-next-startaddress; /将该空闲块的起始地址赋给所输入的进程q-next=S-next;S-next=q;/将所输入的进程插入 work 链首。p-next-length-=q-lengt
11、h;if(p-next-length!=0)/该空闲块空间有剩余,改变该空闲块的起始地址p-next-startaddress+=q-length;elseif(p-next-next!=NULL)p-next=p-next-next;elser-next=NULL;delete p-next;/该空闲块空间无剩余/该空闲块不处于空闲链链尾/删除该空闲块,修改空闲链/该空闲块处于空闲链链尾,修改空闲链/释放该空闲块的空间display(pbc);display(S);/显示空闲链情况/显示进程链情况void requireback()char name20;coutvv输入要回收的进程名:”;
12、cinname;work *p;p=S;while(p-next!=NULL)if(strcmp(p-next-name, name)=0)/用户申请进程回收函数/进程链不为空/寻找与用户要求回收的进程名相同的进程callback(p); /调用进程回收函数,回收进程 return;p=p-next;if(p-next=NULL)coutvv此进程不存在!vvendl; /进程链中无与用户要求回收的进程名相同的进程void callback(work *t)/利用最佳适应算法实现进程回收work *w;w=t-next;space *p=NULL,*q=NULL;long n;n=w-leng
13、th;if(pbc-next=NULL)/空闲链为空space *f=new space;/申请分配用于存放 space 类型的数据的内/初始该空间首地址存空间,并将首地址赋给指针ff-startaddress=0;f-length=n;/将所要回收的进程大小赋给该空间f-next=NULL;pbc-next=f;/将该空间块插入空闲链中t-next=w-next;delete w;/释放空间coutvv回收完毕!vvendl;display(pbc);display(S);/在空闲链表中寻找插入新的空闲区的合适位置/显示回收完后的空闲链 /显示回收完后的进程链return;p=pbc-next;while(p!=NULL&p-startaddressstartaddress)q=p;p=p-next;if(q=NULL)&(w-startaddress+n=p-startaddress)/修改下邻起始地址p-startaddress-=n;p-length+=n;/将该空闲块与下邻合并t-next=w-next;修改进程链,删除进程链中所要回收的进程delete