一、 实验目的:
目的:熟悉并掌握动态分区分配的各种算法,熟悉并掌握动态分区中分区回收的各种情况,并能够实现分区合并。
任务:用高级语言模拟实现动态分区存储管理。
二、实验内容:
1、实验内容
分区分配算法至少实现首次适应算法、最佳适应算法和最坏适应算法中的至少一种。熟悉并掌握各种算法的空闲区组织方式。
分区的初始化——可以由用户输入初始分区的大小。(初始化后只有一个空闲分区,起始地址为0,大小是用户输入的大小)
分区的动态分配过程:由用户输入作业号和作业的大小,实现分区过程。
分区的回收:用户输入作业号,实现分区回收,同时,分区的合并要体现出来。(注意:不存在的作业号要给出错误提示!)
分区的显示:任何时刻,可以查看当前内存的情况(起始地址是什么,大小多大的分区时空闲的,或者占用的,能够显示出来)。
2、实验要求
(1)内存空间不足的情况,要有相应的显示;
(2)作业不能同名,但是删除后可以再用这个名字;
(3)作业空间回收是输入作业名,回收相应的空间,如果这个作业名不存在,也要有相应的提示。
(4)要求实现FF,BF,WF算法中至少两种算法
实现代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | import copy class Memory(object): def __init__(self, start, end, length, state=1, ID=0):#__init__()方法是一种特殊的方法,被称为类的初始化方法,当创建这个类的实例时就会调用该方法 # self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数 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 FF(work_id, work_length, list): for i in list: if i.Id == work_id: print('作业已存在') return for i in range(0, len(list)): p = list[i] if p.state == 1 and p.length > work_length: # p是当前未分配内存的大小 node2 = Memory(p.start + work_length, p.end, p.length - work_length, 1, 0) # 剩下的未分配的 a = Memory(p.start, p.start + work_length - 1, work_length, state=0, ID=work_id) # a是已分配的 del list[i] list.insert(i, node2) list.insert(i, a) show_memory(list) return if p.state == 1 and p.length == work_length: p.state = 0 show_memory(list) return print("内存空间不足") def free1(work_id, li): for i in range(0, len(li)): p = li[i] if p.Id == work_id: p.state = 1 target = i p.Id=0 break # 向前合并空闲块 if target - 1 > 0: if li[target - 1].state == 1: a = Memory(li[target - 1].start, li[target].end, li[target - 1].length + li[target].length, 1, 0) del li[target - 1] del li[target - 1] li.insert(target - 1, a) target = target - 1 # 向后合并空闲块 if target + 1 < len(li): if li[target + 1].state == 1: a = Memory(li[target].start, li[target + 1].end, li[target].length + li[target + 1].length, 1, 0) del li[target] del li[target] li.insert(target, a) show_memory(li) ##最佳适应算法 def bubble_sort(list): # 冒泡排序 count = len(list) for i in range(0, count): for j in range(i + 1, count): if list[i].length < list[j].length: list[i], list[j] = list[j], list[i] return list def BF(work_id, work_length, li): for i in li: if i.Id == work_id: print('作业已存在') return q = copy.copy(li) q = bubble_sort(q) # 从小到大排序,给所有已分配和未分配的排序 s = -1 ss12 = -1 for i in range(0, len(q)): p = q[i] if p.state == 1 and p.length > work_length: # p.state == 1 已分配的不参与分配 s = p.start # s得到起始位置 elif p.state == 1 and p.length == work_length: ss12 = p.start if s == -1 and ss12 == -1: print("内存空间不足") return for i in range(0, len(li)): p = li[i] if p.start == s: node2 = Memory(p.start + work_length, p.end, p.length - work_length, 1, 0) # 未分配 a = Memory(p.start, p.start + work_length - 1, work_length, state=0, ID=work_id) del li[i] li.insert(i, node2) li.insert(i, a) show_memory(li) return elif p.start == ss12: p.state = 0 show_memory(li) return if __name__ == '__main__': print("输入内存大小:") size = int(input()) a = Memory(0, size - 1, size, state=1, ID=0) b = [] b.append(a) print('*******1:初始化******') print('*******2:分配空间****') print('*******3:回收********') print('*******4:查看********') print('*******5:退出********') while (True): select = input('请输入想要执行的功能:') if select == '5': break elif select == '1': print("输入内存大小:") size = int(input()) a = Memory(0, size - 1, size, state=1, ID=0) b = [] b.append(a) elif select == '2': print("1.首次适应算法:FF") print("2.最佳适应算法:BF") x = input("请输入分配执行的算法:") x = float(x) repit = 'Y' while (repit == 'Y'): if x == 1: work_size = input('请输入作业id和大小:').split() FF(work_size[0], int(work_size[1]), b) repit = input('是否继续Y/N') elif x == 2: work_size = input('请输入作业id和大小:').split() BF(work_size[0], int(work_size[1]), b) repit = input('是否继续Y/N') elif select == '3': id_delete = input('请输入删除作业id:') free1(id_delete, b) else: show_memory(b) |