一、实验目的
目的:熟悉并掌握动态分区分配的各种算法,熟悉并掌握动态分区中分区回收的各种情况,并能够实现分区合并。
任务:用高级语言模拟实现动态分区存储管理。
二、实验内容
1、实验内容
分区分配算法至少实现首次适应算法、最佳适应算法和最坏适应算法中的至少两种。熟悉并掌握各种算法的空闲区组织方式。
分区的初始化------可以由用户输入初始分区的大小。(初始化后只有一个空闲分区,起始地址为0,大小是用户输入的大小)
分区的动态分配过程:由用户输入作业号和作业的大小,实现分区过程。
分区的回收:用户输入作业号,实现分区回收,同时,分区的合并要体现出来。(注意:不存在的作业号要给出错误提示!)
分区的显示:任何时刻,可以查看当前内存的情况(起始地址是什么,大小多大的分区是空闲的,或者占用的,能够显示出来)。
2、实验要求
(1)内存空间不足的情况,要有相应的显示;
(2)作业不能同名,但是删除后可以再用这个名字;
(3)作业空间回收是输入作业名,回收相应的空间,如果这个作业名不存在,也要有相应的提示;
(4)实现FF、BF、WF内存分配算法中的至少两种。
(5)实验完成后要参加实验答辩。
三、实验代码
python
class MemoryBlock:
def __init__(self, start, size):
self.start = start # 分区的起始地址
self.size = size # 分区的大小
self.process_id = None # 用于标识占用该分区的进程
def __str__(self):
status = "空闲" if self.process_id is None else f"占用(进程ID: {self.process_id})"
return f'起始地址={self.start}, 大小={self.size}, 状态={status}'
class MemoryManager:
def __init__(self, total_size):
self.blocks = [MemoryBlock(0, total_size)] # 初始化一个大分区
self.active_processes = set() # 用于存储当前活动的作业名称
def allocate_ff(self, process_id, process_size):
if process_id in self.active_processes:
print(f'作业 {process_id} 已存在,不能重复分配。')
return False
for block in self.blocks:
if block.process_id is None and block.size >= process_size:
return self._allocate(block, process_id, process_size)
print(f'进程 {process_id} 无法分配内存,原因:内存空间不足或没有合适的分区可用')
return False
def allocate_bf(self, process_id, process_size):
if process_id in self.active_processes:
print(f'作业 {process_id} 已存在,不能重复分配。')
return False
best_fit_block = None
for block in self.blocks:
if block.process_id is None and block.size >= process_size:
if best_fit_block is None or block.size < best_fit_block.size:
best_fit_block = block
if best_fit_block:
return self._allocate(best_fit_block, process_id, process_size)
print(f'进程 {process_id} 无法分配内存,原因:内存空间不足或没有合适的分区可用')
return False
def allocate_wf(self, process_id, process_size):
if process_id in self.active_processes:
print(f'作业 {process_id} 已存在,不能重复分配。')
return False
worst_fit_block = None
for block in self.blocks:
if block.process_id is None and block.size >= process_size:
if worst_fit_block is None or block.size > worst_fit_block.size:
worst_fit_block = block
if worst_fit_block:
return self._allocate(worst_fit_block, process_id, process_size)
print(f'进程 {process_id} 无法分配内存,原因:内存空间不足或没有合适的分区可用')
return False
def _allocate(self, block, process_id, process_size):
print(f'分配给进程 {process_id} 的内存: {block.size}')
if block.size > process_size:
# 分割分区
self.blocks.append(MemoryBlock(block.start + process_size, block.size - process_size))
block.size = process_size
block.process_id = process_id
self.active_processes.add(process_id) # 添加到活动作业列表
return True
def free_memory(self, process_id):
for block in self.blocks:
if block.process_id == process_id:
print(f'释放进程 {process_id} 的内存: {block.size}')
block.process_id = None
self.active_processes.remove(process_id) # 从活动作业列表中移除
self.merge_blocks()
return True
print(f'作业 {process_id} 不存在,无法释放相应的内存空间。')
return False
def merge_blocks(self):
# 合并相邻的空闲分区
self.blocks.sort(key=lambda x: x.start)
merged_blocks = []
for block in self.blocks:
if block.process_id is None:
if merged_blocks and merged_blocks[-1].process_id is None:
# 合并
merged_blocks[-1].size += block.size
else:
merged_blocks.append(block)
else:
merged_blocks.append(block)
self.blocks = merged_blocks
def show_memory(self):
print("当前内存状态:")
for block in self.blocks:
print(block)
if __name__ == "__main__":
total_size = int(input("请输入初始分区大小: "))
mm = MemoryManager(total_size)
while True:
action = input("请选择操作 (1: 分配, 2: 释放, 3: 查看内存, 0: 退出): ")
if action == '1':
process_id = input("请输入作业号: ")
process_size = int(input("请输入作业大小: "))
allocation_method = input("请选择分配算法 (1: FF, 2: BF, 3: WF): ")
if allocation_method == '1':
mm.allocate_ff(process_id, process_size)
elif allocation_method == '2':
mm.allocate_bf(process_id, process_size)
elif allocation_method == '3':
mm.allocate_wf(process_id, process_size)
else:
print("无效的算法选择。")
elif action == '2':
process_id = input("请输入作业号以释放内存: ")
mm.free_memory(process_id)
elif action == '3':
mm.show_memory()
elif action == '0':
break
else:
print("无效输入,请重试。")
四、实验结果
先分配内存空间,当内存空间不足时,给出内存空间不足的提示,当作业1同名分配时,会显示作业已经存在。
作业空间回收是输入作业名,回收相应的空间,如果这个作业名不存在,会显示作业不存在,无法释放相应的内存空间。当作业1删除后再分配时,会显示分配成功。