python实现操作系统学习中的动态内存分配算法

按书上的,算法有五种,最先适应、最佳适应、最坏适应、下次适应、快速适应(或者说是伙伴算法,其实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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值