操作系统之内存分配与回收

上传人:枫** 文档编号:562080921 上传时间:2024-03-04 格式:DOC 页数:10 大小:394.50KB
返回 下载 相关 举报
操作系统之内存分配与回收_第1页
第1页 / 共10页
操作系统之内存分配与回收_第2页
第2页 / 共10页
操作系统之内存分配与回收_第3页
第3页 / 共10页
操作系统之内存分配与回收_第4页
第4页 / 共10页
操作系统之内存分配与回收_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《操作系统之内存分配与回收》由会员分享,可在线阅读,更多相关《操作系统之内存分配与回收(10页珍藏版)》请在金锄头文库上搜索。

1、操作系统实验内存的分配与回收 实验报告一、 实验题目:内存的分配与回收二、 实验内容:利用可变分区的首次适应算法,模拟内存的分配与回收。三、 实验目的:掌握可变分区首次适应算法的原理以及其编程实现。四、 实验过程:1、基本思想:可变分区分配是根据进程的实际需求,动态地为之分配内存空间。首次适应算法要求空闲空间链以地址递增的次序链接。进行内存分配时,从链表头部开始依次检索,找到第一个不小于请求空间大小的空闲空间进行分配。分配时需考虑碎片问题,若分配会导致碎片产生则将整块分区分配。内存的回收需要考虑四种情况:回收分区前后两个分区都空闲,则需要和前后两个分区合并;(2)回收分区只有前一分区空闲,则与

2、前一分区合并;(3)回收分区只有后一分区空闲,则和后一分区合并;(4)回收分区独立,不考虑合并.2、主要数据结构:struct FreeArea 链结点包含的数据:分区号、大小、起址、标记 int ID;int size;long address;int sign;struct Node 双链表结点结构体:数据区、前向指针、后继指针FreeArea data;struct Node *prior; struct Node next; DLinkList;3、输入、输出: 输入: I.内存分配时由键盘输入分区ID和大小; II。内存回收时由键盘输入需要回收的分区ID;输出: 输出内存的分配情况(

3、按照地址从低到高)4、 程序流程图:结束合并后回收合并后回收该分区后一个分区空闲该分区前一个分区空闲合并后回收该分区前后都空闲回收分区独立输入分区号显示分区情况结束开始退出Choice=0Choice=3Choice=2将分区从空闲链移出,并修改相应数据结构整块分配判断是否会有碎片内存不足判断剩余空间是否足够输入分区大小输入分区号输入有误验证该分区是否已经被占用Choice=1Choice3或choiceusing namespace std;define Free 0 /空闲状态#define Busy 1 /已用状态define PBusy 2 /碎片已用状态#define FINISH

4、1 /完成define FINISH2 1 /完成define ERROR 0 /出错#define memory 512 /最大内存空间为(单位:KB)#define min 10 /碎片最小值(单位:KB)typedef struct FreeArea/空闲链数据int ID;int size;long address;int sign;;typedef struct Node /空闲连结构 FreeArea data;struct Node *prior; struct Node next; *DLinkList;DLinkList head; /头结点DLinkList tail; /

5、尾结点int Create()/初始化head=(DLinkList)malloc(sizeof(Node));/分配内存tail=(DLinkList)malloc(sizeof(Node));headprior=NULL;head-next=tail;tail-prior=head;tailnext=NULL;tail-data.address=0;tail-data.size=memory;taildata.ID=0;taildata。sign=Free;return FINISH;int FirstFit(int ID,int request)/首次适应算法DLinkList temp

6、=(DLinkList)malloc(sizeof(Node));/新建作业的结点temp-data.ID=ID;tempdata.size=request;tempdata.sign=Busy;Node *p=head;/插入指针P while(p)if(pdata。sign=Free & p-data.size=request)/剩余大小恰好满足pdata.sign=Busy;pdata.ID=ID;return FINISH;break;else if(pdata。sign=Free & p-data.sizerequest & (p-data.sizerequestmin))/满足需求

7、且有剩余且不产生碎片temp-prior=p-prior;temp-next=p;temp-data.address=p-data.address;p-priornext=temp;pprior=temp;pdata.address=tempdata。address+tempdata.size;p-data。size=pdata.size-request;return FINISH;break;else if(p-data.sign=Free & pdata。sizerequest & pdata。size-request=min)/产生碎片时p-data.sign=PBusy;pdata。I

8、D=ID;return FINISH;break;p=p-next;/若前面的分区都已分配,P指针后移return ERROR;int Allocate()/主存分配int ID,request;coutID;coutrequest;if(request0 request=0)cout分配的主存必须是正整数!endl;return ERROR;if(FirstFit(ID,request)=FINISH)cout”分配成功!”endl;elsecout内存不足,分配失败!data。ID=ID)p-data。sign=Free;/pdata。ID=Free;if((p-prior-data.si

9、gn=Free)(pnext-data。sign=Free))/与前后的空闲块相连pprior-data.size=p-prior-data.size+pdata。size+pnextdata。size;ppriornext=pnextnext;if(p-next-next=NULL)/若p-next是最后一个结点p-prior-data.ID=Free;p-next=NULL;elsep-next-next-prior=pprior;break; if(ppriordata。sign=Free)/与前面的空闲块相连ppriordata.size+=p-data。size;p-prior-ne

10、xt=p-next;p-nextprior=p-prior;break;if(p-nextdata.sign=Free)/与后面的空闲块相连pdata.size+=p-nextdata。size;if(pnext-next=NULL)/若p-next是最后一个结点pnext=NULL;elsepnext-nextprior=p;pnext=pnext-next;break;break;p=pnext;cout”分区:ID回收成功next;while(p)cout分区号:”;if(p-data。ID=Free)cout”Freeendl;elsecoutdata.IDendl;cout”起始地址:”pdata。address;cout” 分区大小:data.size KB;cout” 状 态:”;if(pdata.sign=Free)cout”空 闲”data.sign=PBusy)cout”碎片已分配endl;elsecout”已分配next;coutchoice;if(choice=1)/ 分配内存Allocate();else if(choice=2)/ 内存回收 int ID;cout”请输入要释放的分区号:;cinID;Recycle(ID);e

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

当前位置:首页 > 办公文档 > 解决方案

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