用Python模拟实现动态分区存储管理

实验目的:

    1、熟悉并掌握动态分区分配的各种算法。

    2、熟悉并掌握动态分区中分区回收的各种情况,并能够实现分区合并。

实验内容及要求:

    用高级语言模拟实现动态分区存储管理

    分区分配算法至少实现首次适应算法或最坏适应算法中的至少1种。熟悉并掌握各种算法的空闲区组织方式。
    分区的初始化-可以由用户输入初始分区的大小。(初始化后只有一个空闲分区,起始地址为0,大小是用户输入的大小)
    分区的动态分配过程:由用户输入作业号和作业的大小,实现分区过程。
    分区的回收:用户输入作业号,实现分区回收,同时,分区的合并要体现出来。(注意:不存在的作业号要给出错误提示!)
    分区的显示:任何时刻,可以查看当前内存的情况(起始地址是什么,大小多大的分区时空闲的,或者占用的,能够显示出来)。

代码(首次适应和最坏适应):

import copy
import operator

class node(object):
    def __init__(self, start, end, length, state=1, ID=0):
        self.start = start
        self.end = end
        self.length = length
        self.state = state  #state为1:内存未分配
        self.Id = ID  #ID为0是未分配,其余为任务编号

#展示所有区块信息
def show_memory(list):
    print("分配状态    分区号    起始地址   终止地址  分区大小")
    for i in range(0,len(list)):
        p=list[i]
        if p.state==1:
            print("%s%s%s%11.d%11.d%10.d"%('空闲',"          ", p.Id,  p.start, p.end, p.length))
        else:
            print("%s%s%s%11.d%11.d%10.d"%('已分配',"        ", p.Id,  p.start, p.end, p.length))

#回收区块
def free_k(taskID, list_FREE):
    target=-1
    for i in range(0, len(list_FREE)):
        p = list_FREE[i]
        if p.Id == taskID:
            p.state = 1
            p.Id = 0
            target = i
            print("已回收:", taskID, '  start:', p.start, "  end:", p.end, "  length:", p.length)
            break
    if target == -1:
        print('不存在的作业号!请检查后重新输入。')
        return
    if target - 1 >= 0:
        if list_FREE[target - 1].state == 1:
            a = node(list_FREE[target - 1].start, list_FREE[target].end, list_FREE[target - 1].length + list_FREE[target].length, 1, 0)
            del list_FREE[target - 1]
            del list_FREE[target - 1]
            list_FREE.insert(target - 1, a)
            target = target - 1
    if target + 1 <= len(list_FREE):
        if list_FREE[target + 1].state == 1:
            a = node(list_FREE[target].start, list_FREE[target + 1].end, list_FREE[target].length + list_FREE[target + 1].length, 1, 0)
            del list_FREE[target]
            del list_FREE[target]
            list_FREE.insert(target, a)

#首次适应算法
def FF(taskID, Tasklength, list_FF):
    for i in range(0, len(list_FF)):
        p = list_FF[i]
        if p.state == 1 and p.length > Tasklength:
            node_bk = node(p.start + Tasklength, p.end, p.length - Tasklength, 1, 0)
            a = node(p.start, p.start + Tasklength - 1, Tasklength, state=0, ID=taskID)
            print("已分配:",a.Id, '  start:', a.start, "  end:", a.end, "  length:", a.length)
            del list_FF[i]
            list_FF.insert(i, node_bk)
            list_FF.insert(i, a)
            return
        if p.state == 1 and p.length == Tasklength:
            print("已分配:",taskID, '  start:', p.start, "  end:", p.end, "  length:", p.length)
            p.Id = taskID
            p.state = 0
            return
    print("内存空间不足")

#最坏适应算法
def BF(taskID, Tasklength, list_BF):
    q = copy.copy(list_BF)
    cmpfun = operator.attrgetter('length')
    q.sort(key=cmpfun,reverse=False)
    adr_1 = -1
    adr_2 = -1
    for i in range(0, len(q)):
        p = q[i]
        if p.state == 1 and p.length > Tasklength:
            adr_1 = p.start
        elif p.state == 1 and p.length == Tasklength:
            adr_2 = p.start
    if adr_1 == -1 and adr_2 == -1:
        print("内存空间不足")
        return
    for i in range(0, len(list_BF)):
        p = list_BF[i]
        if p.start == adr_1:
            node_bk = node(p.start + Tasklength, p.end, p.length - Tasklength, 1, 0)
            a = node(p.start, p.start + Tasklength - 1, Tasklength, state=0, ID=taskID)
            print("已分配:",a.Id, ' start:', a.start, " end:", a.end, " length:", a.length)
            del list_BF[i]
            list_BF.insert(i, node_bk)
            list_BF.insert(i, a)
            return
        elif p.start == adr_2:
            print("已分配:",taskID, ' start:', p.start, " end:", p.end, " length:", p.length)
            p.Id = taskID
            p.state = 0
            return

if __name__ == "__main__":
    while True:
        try:
            memory_size = int(input("请输入您想要的初始分区的大小 --> "))
            a = node(0, memory_size-1, memory_size, state=1, ID=0)
            b = []
            b.append(a)  #存放所有分区块的信息
            pd_num1 = int(input("请选择:0、首次适应算法 1、最坏适应算法 2、退出程序 --> "))
            if pd_num1 == 0:
                while True:
                    pd_num2 = int(input("请选择:1、分配内存 2、回收分区 3、展示分区表 4、退出 --> "))
                    if pd_num2 == 1:
                        task_id = int(input("请输入要分配任务的ID --> "))
                        task_size = int(input("请输入要该任务需要的内存大小 --> "))
                        FF(task_id, task_size, b)
                    elif pd_num2 == 2:
                        free_task_id = int(input("请输入要回收任务的ID --> "))
                        free_k(free_task_id, b)
                    elif pd_num2 == 3:
                        show_memory(b)
                    elif pd_num2 == 4:
                        break
                    else:
                        print("请重新输入 --> ")
            elif pd_num1 == 1:
                while True:
                    pd_num2 = int(input("请选择:1、分配内存 2、回收分区 3、展示分区表 4、退出 --> "))
                    if pd_num2 == 1:
                        task_id = int(input("请输入要分配任务的ID --> "))
                        task_size = int(input("请输入要该任务需要的内存大小 --> "))
                        BF(task_id, task_size, b)
                    elif pd_num2 == 2:
                        free_task_id = int(input("请输入要回收任务的ID --> "))
                        free_k(free_task_id, b)
                    elif pd_num2 == 3:
                        show_memory(b)
                    elif pd_num2 == 4:
                        break
                    else:
                        print("请重新输入 --> ")
            elif pd_num1 == 2:
                break
            else:
                print("请输入正确的选项!")
                continue
        except:
            print("请输入正确的选项!")

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值