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

实验内容

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

实验代码

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


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就将整个空闲区分配给作业

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值