【操作系统】动态分区存储管理方式的主存分配回收

实验内容

编写程序完成动态分区存储管理方式的主存分配回收的实现。实验具体包括:首先确定主存空间分配表;然后采用最佳适应算法完成主存空间的分配和回收;最后编写主函数对所做工作进行测试。

实验代码

"""操作系统动态分区存储管理方式的主存分配与回收"""


import copy


class process(object):
    def __init__(self, address, length, flag=1, name='无'):
        self.name = name  # 进程名称
        self.address = address  # 起始地址
        self.length = length  # 占用空间大小
        self.flag = flag  # flag为1表示空闲,flag为0表示已分配


def show_all(list):
    """展示全部内存分配"""
    print("全部内存分配表:")
    for i in range(0, len(list)):
        p = list[i]
        print('\t名称:', p.name, ' 起始地址:', p.address, " 空间大小:",
              p.length, "状态:", "已分配" if p.flag == 0 else "空闲")


def allocate(name, length, list):
    """采用最佳适应算法分配内存"""
    min = 5
    q = copy.copy(list)
    q.sort(key = lambda x: x.length)
    a1 = -1
    a2 = -1
    # 先找到要分配的起始地址
    for i in range(0, len(q)):
        p = q[i]
        if p.flag == 1 and p.length == length:
            a1 = p.address
            break
        elif p.flag == 1 and p.length > length and p.length - length <= min:
            a1 = p.address
            break
        elif p.flag == 1 and p.length > length and p.length - length > min:
            a2 = p.address
            break
    # 再进行分配
    if a1 == -1 and a2 == -1:
        print("内存空间不足!")
        return
    for i in range(0, len(list)):
        p = list[i]
        if p.address == a1:
            p.name = name
            p.flag = 0
            print(p.name, "分配成功!")
            return
        elif p.address == a2:
            new_process = process(p.address, length, 0, name)
            list.insert(i, new_process)
            p.address += length
            p.length -= length
            print(new_process.name, "分配成功!")
            return


def free(name, list):
    """"回收内存"""
    for i in range(0, len(list)):
        p = list[i]
        if p.name == name:
            print(p.name, "回收成功!")
            p.name = '无'
            p.flag = 1
            cur = i
            break
    # 如果有上邻空闲区,向上合并
    if cur - 1 >= 0:
        if list[cur - 1].flag == 1:
            list[cur - 1].length += list[cur].length
            del list[cur]
            cur = cur - 1
    # 如果有下邻空闲区,向下合并
    if cur + 1 < len(list):
        if list[cur + 1].flag == 1:
            list[cur].length += list[cur + 1].length
            del list[cur + 1]


if __name__ == "__main__":
    adr = int(input('请初始化内存起始地址:'))
    le = int(input('请初始化内存空间大小:'))
    list = [process(adr, le)]
    while True:
        try:
            select = int(input("请选择:1、分配内存 2、回收内存 3、退出程序:"))
            if select == 1:
                num = int(input("请输入待分配的进程个数:"))
                for i in range(num):
                    name = input("进程名称:")
                    length = int(input("所需内存:"))
                    allocate(name, length, list)
                show_all(list)
            elif select == 2:
                name = input("请输入要回收的进程名称:")
                free(name, list)
                show_all(list)
            elif select == 3:
                break
            else:
                print("输入不正确!")
        except:
            print("输入不正确!")

实验结果

在这里插入图片描述
图1 初始化内存起始地址和内存空间大小

在这里插入图片描述
图2 分配7个内存后的内存分配表

在这里插入图片描述

图3 回收p1、p3,归还区既无上邻空闲区又无下邻空闲区

在这里插入图片描述

图4 回收p2,归还区既有上邻空闲区又有下邻空闲区

在这里插入图片描述

图5 回收p4,归还区有上邻空闲区

在这里插入图片描述
图6 回收p7,归还区有下邻空闲区

在这里插入图片描述

图7 分配p8,挑选一个能满足作业要求的最小空闲区

在这里插入图片描述

图8 分配p9,差距小于min就将整个空闲区分配给作业

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值