OS 最先适应算法、最优适应算法、最坏适应算法的解释

思维图

0

一、最先(首次)适应算法(first fit,FF

通俗来讲就是:把进程尽量往低地址空闲区域放,放不下的话在更加地址慢慢升高。
每一次存放,都从最低地址开始寻找满足的空闲区域,直至最高地址。即每次存放都从0开始。

特点

  • 算法优先使用 低地址 部分空闲区,在低址空间造成许多小的空闲区,在高地址空间保留大的空闲区。
  • 选取满足申请长度要求且起始地址最小的空闲区域。
  • 空闲区域按照 起始地址 从小到大 的次序以此记录在空闲区域表中。

优点

  • 尽量使用低地址空间,使在高地址可能形成较大的空闲区域。为以后到达的大作业分配大的内存空间创造了条件。

缺点

  • 可能会分隔位于低地址的较大空闲区域。
  • 低址部分不断被划分,会留下许多难以利用的,很小的空闲分区,称为碎片。

二、下次适应算法(next fit,NF

该算法是在FF算法的基础上进行改进的,大体上与FF算法相似,而不同点就是:
FF算法每次存储都是从0开始寻找符合要求的空闲区域;
NF算法每次存储都是接着上次分配区域的下一个地址;

特点

  • 该算法是对FF算法的一种改进。
  • 自上次分配空闲空间区域的下一个位置开始,选取第一个可满足的空闲区域。

优点

  • 空闲区域分布和分配更加均匀。

缺点

  • 可能会分隔大的空闲区域,导致以后到达的大作业无较大的空闲区域。

三、最佳适应算法(best fit,BF

该算法和FF算法相似,每当进程申请空间的时候,系统都是从头部开始查找。
空闲区域是从小到大记录的,每次查找都从最小的开始,直到查找的满足要求的最小空闲区域。

特点

  • 在分配内存空间时取满足申请要求且长度最小的空闲区域。
  • 空闲区域按照长度“由小到大”的次序以此记录于空闲区域表中。

优点

  • 尽量不分割大的空闲区域。

缺点

  • 可能会形成许多非常小以致以后无法使用的的空闲空间,即外部碎片。

四、最坏适应算法(worst fit,WF

该算法与BF算法相反,BF是用最小的空闲区域来存储东西,而WF是用最大的空闲区域来存储。

特点

  • 在分配空间时选取满足申请要求且长度“最大”的空闲区域。
  • 空闲区域按照长度“由大到小”的次序以此记录于空闲区域表中。

优点

  • 避免形成外部碎片

缺点

  • 会分隔大的空闲区域,可能当遇到较长存储空间的进程时无法满足其要求。

例题

下图中,最左边的是内存的初始情况,现在需要将4个进程依次放入输入井中,等待系统放入内存。
JOB1 30K
JOB2 50K
JOB3 20K
JOB4 60K
红色:已经占用的空间。
绿色:空闲空间。
黄色:上述4个进程占用的空间。

02

资料参考

  • 39
    点赞
  • 231
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
最先适应算法是一种内存分配算法,它选择第一个可用的空闲内存块来分配给进程,因此它的实现比较简单,但是可能会造成内存碎片问题。 以下是最先适应算法的C语言实现: ```c #include <stdio.h> #include <stdlib.h> #define MEM_SIZE 1024 int mem[MEM_SIZE]; // 内存数组 int alloc_pos = 0; // 内存分配指针 // 分配内存 int mem_alloc(int size) { int start = -1; for (int i = alloc_pos; i < MEM_SIZE; i++) { if (mem[i] == 0) { // 找到空闲块 int j = i; while (j < MEM_SIZE && mem[j] == 0 && j - i + 1 < size) j++; if (j - i + 1 == size) { // 找到满足大小的空闲块 start = i; break; } i = j - 1; // 跳过已经检查过的空闲块 } } if (start != -1) { // 分配成功 for (int i = start; i < start + size; i++) { mem[i] = 1; } alloc_pos = start + size; return start; } return -1; // 分配失败 } // 释放内存 void mem_free(int pos, int size) { for (int i = pos; i < pos + size; i++) { mem[i] = 0; } } int main() { int pos1 = mem_alloc(100); // 分配100字节内存 int pos2 = mem_alloc(200); // 分配200字节内存 int pos3 = mem_alloc(300); // 分配300字节内存 printf("pos1=%d, pos2=%d, pos3=%d\n", pos1, pos2, pos3); mem_free(pos2, 200); // 释放200字节内存 int pos4 = mem_alloc(150); // 分配150字节内存 printf("pos4=%d\n", pos4); return 0; } ``` 以上代码演示了如何使用最先适应算法分配和释放内存。在内存分配时,程序从分配指针位置开始,寻找第一个空闲块,然后检查这个空闲块是否足够大,如果满足大小要求,则分配这个空闲块,并将分配指针位置更新为分配结束位置。在内存释放时,程序将内存块中的所有字节设置为0。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MoMing丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值