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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统实验

内存的分配与回收

实验报告

一、实验题目:内存的分配与回收

二、实验内容:利用可变分区的首次适应算法,模拟内存的分配与回收。

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

四、实验过程:

1、基本思想:可变分区分配是根据进程的实际需求,动态地为之分配内存空间。首次适应算法要求空闲空间链以地址递增的次序链接。进行内存分配时,从链表头部开始依次检索,找到第一个不小于请求空间大小的空闲空间进行分配。分配时需考虑碎片问题,若分配会导致碎片产生则将整块分区分配。内存的回收需要考虑四种情况:⑴回收分区前后两个分区都空闲,则需要和前后两个分区合并;(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;

输出:输出内存的分配情况(按照地址从低到高)

4、程序流程图:

5、实验结果截屏:

6、源程序代码:

#include

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//空闲链数据

{

int ID;

int size;

long address;

int sign;

};

typedef struct Node//空闲连结构

{

FreeArea data;

struct Node *prior;

struct Node *next;

}*DLinkList;

DLinkList head; //头结点

DLinkList tail; //尾结点

int Create()//初始化

{

head=(DLinkList)malloc(sizeof(Node));//分配内存

tail=(DLinkList)malloc(sizeof(Node));

head->prior=NULL;

head->next=tail;

tail->prior=head;

tail->next=NULL;

tail->data.address=0;

tail->data.size=memory;

tail->data.ID=0;

tail->data.sign=Free;

return FINISH;

}

int FirstFit(int ID,int request)//首次适应算法

{

DLinkList temp=(DLinkList)malloc(sizeof(Node));//新建作业的结点

temp->data.ID=ID;

temp->data.size=request;

temp->data.sign=Busy;

Node *p=head;//插入指针P

while(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指针后移

}

return ERROR;

}

int Allocate()//主存分配

{

int ID,request;

cout<<"请输入作业所在分区号:";

cin>>ID;

cout<<"请输入分配的主存(单位:KB):";

cin>>request;

if(request<0 ||request==0)

{

cout<<"分配的主存必须是正整数!"<

return ERROR;

}

if(FirstFit(ID,request)==FINISH)

cout<<"分配成功!"<

else

cout<<"内存不足,分配失败!"<

}

int Recycle(int ID)//回收

{

Node *p=head;

while(p)

{

if(p->data.ID==ID)

{

相关文档
最新文档