按书上的,算法有五种,最先适应、最佳适应、最坏适应、下次适应、快速适应(或者说是伙伴算法,其实linux的伙伴算法复杂很多)。只是作业的一次记录,写的比较臃肿
代码:
import math import operator import numpy class FreeAreaTable: # 空闲区表 def __init__(self, start, length): """ :param start: 起址 :param length: 长度 """ self.start = start self.length = length class AllocatedTable: # 已分配表 def __init__(self, start, length, name, mem_length): """ :param start: 起址 :param length: 长度 :param name: 名称 :param mem_length: 实际分配的内存长度 """ self.start = start self.length = length self.name = name self.mem_length = mem_length class MemHandle: free_table_list = [] # 空闲区列表 allocated_table_list = [] # 已分配区列表 next_location = 0 # 下次适应的位置 @classmethod def insert_free_table(cls, start, length): """ 为空闲区表插入一个表项 :param start: 起址 :param length: 长度 :return: """ free_table = FreeAreaTable(start, length) cls.free_table_list.append(free_table) @classmethod def insert_allocated_table(cls, start, length, name): """ 为已分配表插入一个表项 :param start: 起址 :param length: 长度 :param name: 名称 :return: """ allocated_table = AllocatedTable(start, length, name, mem_length=length) cls.allocated_table_list.append(allocated_table) @classmethod def recovered_memory(cls, start, length): """ 回收内存并合并相邻的内存,修改后,空闲分区表的排序是按照地址排序 :param start: 起址 :param length: 长度 :return:True or False """ state = 0 for i in range(len(cls.allocated_table_list)): if cls.allocated_table_list[i].start == start: # 移除已分配表 项 cls.allocated_table_list.pop(i) state = 1 break if state == 0: return False # 将回收的内存插入空闲分区表 cls.insert_free_table(start, length) # 将空闲分区表先按地址小到大排序 cmpfun = operator.attrgetter('start') cls.free_table_list.sort(key=cmpfun) # 内存合并,倒序遍历 for i in range(len(cls.free_table_list) - 1, 0, -1): if cls.free_table_list[i - 1].start + cls.free_table_list[i - 1].length == cls.free_table_list[i].start: cls.free_table_list[i - 1].length += cls.free_table_list[i].length cls.free_table_list.pop(i) return True @classmethod def recovered_memory(cls, name): """ 回收内存并合并相邻的内存,修改后,空闲分区表的排序是按照地址排序 :param name: 作业名称 :return:True or False """ for i in cls.allocated_table_list: if i.name==name: start=i.start length=i.length state = 0 for i in range(len(cls.allocated_table_list)): if cls.allocated_table_list[i].start == start: # 移除已分配表 项 cls.allocated_table_list