最佳适应算法


首次适应算法

例如有4个作业,分别为200k,500k,400k,600k,有如下空闲区(自下往上查找)
|500k|
|200k|
|600k|
|400k|

1.为200k分配空间:
找到400k,剩200k
2.为500k分配空间:
找到600k,剩100k
3.为400k分配空间:
找到500k,剩100k
4.为600k分配空间:
找不到,等待其他作业释放

即在查找的时候碰到合适的空闲区就分配

最佳适应算法

例子同上
1.为200k分配空间:
找到200k,剩0k
2.为500k:
找到500k
3.为400k:
找到400k
4.为600k:
找到600k
即将剩余的空闲区域控制到最小

最坏适应算法

和最佳适应算法相反

C语言实现最佳适应算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

#include <stdio.h>
#include <stdlib.h>
#define minsize 10 /*定义物理块的最小值*/

typedef struct free_table{ /*定义未分配区表*/
long address;
long size;
struct free_table *next;
}Node,*NodeList ;
NodeList head;

void createLink()
{
NodeList p;
int n; //链表长度(节点数目)
head=(NodeList)malloc(sizeof(Node));
p=head;
printf("请输入空闲区域数:");
scanf("%d", &n); //链表长度(节点数目)
while( n-- ) {
p->next = (NodeList)malloc(sizeof(Node)); //创建1个新的链表节点 ///分配一个新的节点,sizeof(Node)控制该节点所占的内存,malloc()返回该节点的指针
p = p->next; //链表游标 -> 后移一个节点
scanf("%d", &p->address);
scanf("%d", &p->size);
}
p->next = NULL; //链表最后一个节点指向下一个节点的指针 --> 指向空NULL
}


void Best_allocate(int request)/*最佳适应分配函数,根据申请的request字节数来分配空间*/
{
NodeList current = head->next; //current 指向头节点后的一个节点
NodeList bestFit = NULL;
long minSize = LONG_MAX; //LONG_MAX是一个常量,值为long类型的最大值

while (current != NULL) {
if (current->size >= request && current->size < minSize) {
// 当遇到更合适的空闲区时对bestFit进行更新
bestFit = current;
minSize = current->size;
}
current = current->next;
}
}

void Link_printf()
{
NodeList temp1;
temp1=head->next;
printf("分配后的空闲表如下:\n" );
while(temp1){
printf("空闲起始地址为:%d;长度为:%d\n",temp1->address,temp1->size );
temp1=temp1->next ;
}
}
main()
{
int a,request;
createLink();
//调用createlink()
printf("请输入作业申请长度:");
scanf("%d",&request);
Best_allocate(request);
Link_printf();
}