动态分区分配算法

引言

为了实现下列的代码,首先要写下列的代码:

import random
from matplotlib import pyplot as plt
Request_list=[random.randint(1,1000) for i in range(100)]

1.首次适应(first fit, FF)算法

1.1.分配策略

要求空闲分区按地址递增的次序链接起来。在分配的时候,从链首开始寻找,直至找到一个大小能容纳作业的空闲分区,然后按照作业的大小,从该空闲分区中划分一块内存空间,分配给作业,剩下的继续留在空闲链内。

1.2.代码实现

def fisrt_fit():
    Memory_list = [random.randint(1, 1000) for i in range(500)]
    Vision=[0 for i in range(len(Memory_list))]
    for i in range(len(Request_list)):
        for j in range(len(Memory_list)):
            if Memory_list[j]>=Request_list[i]:
                Vision[j]=1
                Memory_list[j]-=Request_list[i]
                break
    plt.figure(0)
    plt.plot(list(range(len(Memory_list))),Vision)
    plt.show()
    plt.figure(1)
    plt.plot(list(range(len(Memory_list))),Memory_list)
    plt.show()
fisrt_fit()

1.3.结果与讨论

空闲分区使用情况
在这里插入图片描述
可以看到该算法倾向使用低地址的空闲分区,因此保留了高地址的大空闲分区,这为以后的大作业分配创造了条件。
剩下碎片分布情况
在这里插入图片描述
可以看出其生成的碎片也主要存在于低地址处。

2.循环首次适应(next fit, NF)算法

2.1.分配策略

要求空闲分区按地址递增的次序链接起来。在分配的时候,不再每次从链首开始寻找,而是从上次分配的空闲分区的下一个开始寻找,直至找到一个大小能容纳作业的空闲分区,然后按照作业的大小,从该空闲分区中划分一块内存空间,分配给作业,剩下的继续留在空闲链内。

2.2.代码实现

def best_fit():
    Memory_list = [random.randint(1, 1000) for i in range(500)]
    Memory_list.sort()
    print(Memory_list)
    Vision = [0 for i in range(len(Memory_list))]
    for i in range(len(Request_list)):
        for j in range(len(Memory_list)):
            if Memory_list[j] >= Request_list[i]:
                Vision[j] = 1
                Memory_list[j]-=Request_list[i]
                break
    plt.figure(4)
    plt.plot(list(range(len(Memory_list))), Vision)
    plt.show()
    plt.figure(5)
    plt.plot(list(range(len(Memory_list))), Memory_list)
    plt.show()
best_fit()

2.3.结果与讨论

空闲分区使用情况
在这里插入图片描述

可以看到该算法不再倾向使用低地址的空闲分区,而是比较均匀地使用空闲分区。但这样会缺乏大的空闲分区。
剩下碎片分布情况
在这里插入图片描述

可以看出其生成的碎片也分布比较均匀。

3.最佳适应(best fit, BF)算法

3.1.分配策略

要求空闲分区按空闲分区大小递增的次序链接起来。在分配的时候,从链首开始寻找,直至找到一个大小能容纳作业的空闲分区,然后按照作业的大小,从该空闲分区中划分一块内存空间,分配给作业,剩下的继续留在空闲链内。

3.2.代码实现

def best_fit():
    Memory_list = [random.randint(1, 1000) for i in range(500)]
    Memory_list.sort()
    print(Memory_list)
    Vision = [0 for i in range(len(Memory_list))]
    for i in range(len(Request_list)):
        for j in range(len(Memory_list)):
            if Memory_list[j] >= Request_list[i]:
                Vision[j] = 1
                Memory_list[j]-=Request_list[i]
                break
    plt.figure(4)
    plt.plot(list(range(len(Memory_list))), Vision)
    plt.show()
    plt.figure(5)
    plt.plot(list(range(len(Memory_list))), Memory_list)
    plt.show()
best_fit()

3.3.结果与讨论

空闲分区使用情况
在这里插入图片描述

可以看到该算法总是利用最小、最适合的空闲分区来分配,使用的空闲分区分布最为均匀。
剩下碎片分布情况
在这里插入图片描述

可以看出其生成的碎片总是最小的。

4.最坏适应(worst fit, WF)算法

4.1.分配策略

要求空闲分区按空闲分区大小递减的次序链接起来。在分配的时候,从链首开始寻找,直至找到一个大小能容纳作业的空闲分区,然后按照作业的大小,从该空闲分区中划分一块内存空间,分配给作业,剩下的继续留在空闲链内。

4.2.代码实现

def worst_fit():
    Memory_list = [random.randint(1, 1000) for i in range(500)]
    Memory_list.sort()
    Memory_list.reverse()
    Vision = [0 for i in range(len(Memory_list))]
    for i in range(len(Request_list)):
        for j in range(len(Memory_list)):
            if Memory_list[j] >= Request_list[i]:
                Vision[j] = 1
                Memory_list[j]-=Request_list[i]
                break
    plt.figure(6)
    plt.plot(list(range(len(Memory_list))), Vision)
    plt.show()
    plt.figure(7)
    plt.plot(list(range(len(Memory_list))), Memory_list)
    plt.show()
worst_fit()

4.3.结果与讨论

空闲分区使用情况
在这里插入图片描述

可以看到该算法每次都使用最大的空闲分区。这样会缺乏大的空闲分区。但这样不会产生过多的碎片,对中、小作业有利。
剩下碎片分布情况
在这里插入图片描述

可以看出其生成的碎片不至于太小,产生碎片的可能小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值