当前位置:文档之家› 操作系统之内存分配与回收

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

操作系统实验内存的分配与回收实验报告一、实验题目:内存的分配与回收二、实验内容:利用可变分区的首次适应算法,模拟内存的分配与回收。

三、实验目的:掌握可变分区首次适应算法的原理以及其编程实现。

四、实验过程:1、基本思想:可变分区分配是根据进程的实际需求,动态地为之分配内存空间。

首次适应算法要求空闲空间链以地址递增的次序链接。

进行内存分配时,从链表头部开始依次检索,找到第一个不小于请求空间大小的空闲空间进行分配。

分配时需考虑碎片问题,若分配会导致碎片产生则将整块分区分配。

内存的回收需要考虑四种情况:⑴回收分区前后两个分区都空闲,则需要和前后两个分区合并;(2)回收分区只有前一分区空闲,则与前一分区合并;(3)回收分区只有后一分区空闲,则和后一分区合并;(4)回收分区独立,不考虑合并。

2、主要数据结构:struct FreeArea{ 链结点包含的数据:分区号、大小、起址、标记i nt ID;i nt size;l ong address;i nt sign;};struct Node { 双链表结点结构体:数据区、前向指针、后继指针F reeArea data;s truct Node *prior;s truct Node *next;}*DLinkList;3、输入、输出:输入: I.内存分配时由键盘输入分区ID和大小;II.内存回收时由键盘输入需要回收的分区ID;输出:输出内存的分配情况(按照地址从低到高)4、程序流程图:5、实验结果截屏:6、源程序代码:#include<iostream>using namespace std;#define Free 0 //空闲状态#define Busy 1 //已用状态#define PBusy 2 //碎片已用状态#define FINISH 1 //完成#define FINISH2 1 //完成#define ERROR 0 //出错#define memory 512 //最大内存空间为(单位:KB)#define min 10 //碎片最小值(单位:KB)typedef struct FreeArea//空闲链数据{i nt ID;i nt size;l ong address;i nt sign;};typedef struct Node//空闲连结构{F reeArea data;s truct Node *prior;s truct Node *next;}*DLinkList;DLinkList head; //头结点DLinkList tail; //尾结点int Create()//初始化{h ead=(DLinkList)malloc(sizeof(Node));//分配内存t ail=(DLinkList)malloc(sizeof(Node));h ead->prior=NULL;h ead->next=tail;t ail->prior=head;t ail->next=NULL;t ail->data.address=0;t ail->data.size=memory;t ail->data.ID=0;t ail->data.sign=Free;r eturn FINISH;}int FirstFit(int ID,int request)//首次适应算法{D LinkList temp=(DLinkList)malloc(sizeof(Node));//新建作业的结点t emp->data.ID=ID;t emp->data.size=request;t emp->data.sign=Busy;N ode *p=head;//插入指针Pw hile(p){if(p->data.sign==Free && p->data.size==request)//剩余大小恰好满足{ p->data.sign=Busy;p->data.ID=ID;return FINISH;break;}else if(p->data.sign==Free&& p->data.size>request&& (p->data.size-request>min))//满足需求且有剩余且不产生碎片{temp->prior=p->prior;temp->next=p;temp->data.address=p->data.address;p->prior->next=temp;p->prior=temp;p->data.address=temp->data.address+temp->data.size;p->data.size=p->data.size-request;return FINISH;break;}else if(p->data.sign==Free&& p->data.size>request&& p->data.size-request<=min)//产生碎片时{p->data.sign=PBusy;p->data.ID=ID;return FINISH;break;}p=p->next;//若前面的分区都已分配,P指针后移}r eturn ERROR;}int Allocate()//主存分配{i nt ID,request;c out<<"请输入作业所在分区号:";c in>>ID;cout<<"请输入分配的主存(单位:KB):";c in>>request;if(request<0 ||request==0){cout<<"分配的主存必须是正整数!"<<endl;return ERROR;}i f(FirstFit(ID,request)==FINISH)cout<<"分配成功!"<<endl;e lsecout<<"内存不足,分配失败!"<<endl;}int Recycle(int ID)//回收{N ode *p=head;w hile(p){if(p->data.ID==ID){p->data.sign=Free;//p->data.ID=Free;if((p->prior->data.sign==Free)&&(p->next->data.sign==Free))//与前后的空闲块相连{p->prior->data.size=p->prior->data.size+p->data.size+p->next->data.size;p->prior->next=p->next->next;if(p->next->next==NULL)//若p->next是最后一个结点{p->prior->data.ID=Free;p->next=NULL;}else{p->next->next->prior=p->prior;}break;}if(p->prior->data.sign==Free)//与前面的空闲块相连{p->prior->data.size+=p->data.size;p->prior->next=p->next;p->next->prior=p->prior;break;}if(p->next->data.sign==Free)//与后面的空闲块相连{p->data.size+=p->next->data.size;if(p->next->next==NULL)//若p->next是最后一个结点p->next=NULL;else{p->next->next->prior=p;p->next=p->next->next;}break;}break;}p=p->next;}c out<<"分区:"<<ID<<"回收成功"<<endl;r eturn FINISH;}void show()//显示{c out<<" 主存分配情况 \n";N ode *p=head->next;w hile(p){cout<<"分区号:";if(p->data.ID==Free)cout<<"Free"<<endl;elsecout<<p->data.ID<<endl;cout<<"起始地址:"<<p->data.address;cout<<" 分区大小:"<<p->data.size<<" KB";cout<<" 状态:";if(p->data.sign==Free)cout<<"空闲"<<endl;else if(p->data.sign==PBusy)cout<<"碎片已分配"<<endl;elsecout<<"已分配"<<endl;p=p->next;}c out<<endl;}void main(){C reate();i nt choice;i nt i;f or(i=0;;i++){cout<<"请输入操作:";cout<<"1.分配内存 2.回收内存 3.显示主存 0.退出";cout<<endl;cin>>choice;if(choice==1)// 分配内存Allocate();else if(choice==2)// 内存回收{ int ID;cout<<"请输入要释放的分区号:";cin>>ID;Recycle(ID);}else if(choice==3)//显示主存show();else if(choice==0)//退出break;else//非法输入{cout<<"输入有误!"<<endl;continue;}}}。

相关主题