实验内容
编写程序完成动态分区存储管理方式的主存分配回收的实现。实验具体包括:首先确定主存空间分配表;然后采用最佳适应算法完成主存空间的分配和回收;最后编写主函数对所做工作进行测试。
实验代码
"""操作系统动态分区存储管理方式的主存分配与回收"""
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就将整个空闲区分配给作业