首次适应算法实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作操作系统大作业题目:首次适应算法分配内存
学号: **********
学生姓名:***
班级:计科121
首次适应算法分配内存
一、问题描述
在内存分配中,动态分区是根据实际的进程需求,动态地为之分配空间。而首次适应算法分配时从表头指针开始查找可利用空间表,将找到的第一个大小不小于“请求”的空闲块的一部分分配给用户。可利用空间表本身既不按节点的初始地址有序,也不按节点的大小有序。用户释放内存,回收时只是将空闲块插入在链表的表头即可,此算法比较节省时间。
二、运行环境 VC6.0
三、算法思想。
首次适应算法要求空闲分区链以地址递增的次序链接。在分配内存时,从链首开始查找,直到找到一个大小能满足要求的空闲分区为止;然后按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空闲区仍留在空闲链中。若从链首到链尾都不能找到一个能满足要求的分区,则此次分配失败。
四、实验目的
在计算机系统中,为了提高内存区的利用率,必须给电脑内存区进行合理的分配。本实验通过对内存区分配方法首次适应算法的使用,来了解内存分配的模式。
五、首次适应算法分配内存算法概要
(1)结构体
Typedef struct freearea//定义一个空闲区说明表结构
{ long size; //分区大小
long address; //分区地址
int state; //状态
}ElemType; // 线性表的双向链表存储结构
Typedef struct DuLNode
{ ElemType data;
structDuLNode *prior; //前趋指针
structDuLNode *next; //后继指针
} DuLNode,*DuLinkList;
Status Initblock(intMAX_length)//开创带头结点的内存空间链表
{ block_first=(DuLinkList)malloc(sizeof(DuLNode));
block_last=(DuLinkList)malloc(sizeof(DuLNode));
block_first->prior=NULL; //头结点的前驱指针指向空
block_first->next=block_last; //头结点的后继指针指向尾结点
block_last->prior=block_first; //尾结点的前驱指针指向头结点
block_last->next=NULL; //尾结点的后继指针指向空
block_last->data.address=0; //尾结点的地址是0
block_last->data.size=MAX_length; //分区大小是最大分区
block_last->data.state=Free; //状态是空
return OK; }
(2)主要函数说明:
void alloc();进行内存分配的功能函数。
Status free(int flag)将地址为flag的分区的内存回收。
Status First_fit(int request)创建进程空间的子函数;其中,参数request表示空闲分区链的链首指针;要配合函数alloc()使用。
void show()查看内存中的分区情况。
七、代码实现
#include
#include
#include
#define Free 0 //空闲状态
#define Busy 1 //已用状态
#define OK 1 //完成
#define ERROR 0 //出错
//#define MAX_length 640 //最大内存空间为640KB
typedefint Status;
int flag;
typedefstructfreearea//定义一个空闲区说明表结构
{
long size; //分区大小
long address; //分区地址
int state; //状态
}ElemType; // 线性表的双向链表存储结构
typedefstructDuLNode
{
ElemType data;
structDuLNode *prior; //前趋指针
structDuLNode *next; //后继指针
} DuLNode,*DuLinkList;
DuLinkListblock_first; //头结点
DuLinkListblock_last; //尾结点
Status alloc(int);//内存分配
Status free(int); //内存回收
Status First_fit(int);//首次适应算法
void show();//查看分配
Status Initblock();//开创空间表
Status Initblock(intMAX_length)//开创带头结点的内存空间链表
{
block_first=(DuLinkList)malloc(sizeof(DuLNode));
block_last=(DuLinkList)malloc(sizeof(DuLNode));
block_first->prior=NULL; //头结点的前驱指针指向空
block_first->next=block_last; //头结点的后继指针指向尾结点block_last->prior=block_first; //尾结点的前驱指针指向头结点block_last->next=NULL; //尾结点的后继指针指向空
block_last->data.address=0; //尾结点的地址是0
block_last->data.size=MAX_length; //分区大小是最大分区
block_last->data.state=Free; //状态是空
return OK;
}
//分配主存