首次适应算法和最佳适应算法
最佳匹配(最佳适应算法)
最坏匹配(最坏适应算法)
介绍了这么多,下面具体说说代码实现空闲区动态分配回收的具体过程。
首先是一些宏的定义:
#define Free 0 //空闲状态
#define Busy 1 //已用状态
#define OK 1 //完成
#define ERROR 0 //出错
#define MAX_length 640 //定义最大主存信息640KB
六大函数:
①status Alloc(int):内存分配函数,对于选择的首次适应算法或者是最佳适应算法判断分配完成状态,说明是否实现分配或者是分配错误。
②Status free(int):内存回收函数,主要涉及合并内存的三种情况
该空闲块与前面的空闲块相连的主存回收,表示为:
if (p->prior != block_first && p->prior->data.state == Free)
{
p->prior->data.size += p->data.size;//空间扩充,合并为一个
p->prior->next = p->next;//去掉原来被合并的p
p->next->prior = p->prior;
p = p->prior;
}
该空闲块与后面的空闲块相连,表示为:
if (p->next != block_last && p->next->data.state == Free){
p->data.size += p->next->data.size;//空间扩充,合并为一个
p->next->next->prior = p;
p->next = p->next->next;
}
该空闲块与该空闲块与与最后的空闲块相连,表示为:
if (p->next == block_last && p->next->data.state == Free)
{
p->data.size += p->next->data.size;
p->next = NULL;
}
③Status First_fit(int):首次适应算法,只需要将地址由小到大排列好,从头指针开始遍历,逐个检验,找到第一个空间>=所申请的空间时,给予分配。
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 -= request;
④Status Best_fit(int):对由小到大的空闲区排列的空闲区,与所申请的内存大小相比,取两者差最小的给予分配,插入。
初始化最小空间和最佳位置,用ch来记录最小位置。
⑤void show():查看分配。
⑥Status Initblock():开创带头结点的内存空间链表。
完整的代码请下载:
链接:https://pan.baidu.com/s/1D9nTBGEqPKlgrH_rlceiYA 密码:v4di
对最终的结果进行测试:
假设初始状态下,可用的内存空间为640KB,并有下列的请求序列:
•作业1申请130KB •作业2申请60KB。•作业3申请100KB •作业2释放60KB。
•作业4申请200KB •作业3释放100KB。
•作业1释放130KB •作业5申请140KB。
•作业6申请60KB •作业7申请50KB •作业6释放60KB。
首次适应算法:
验证无误!