动态分区存储管理

一、实验目的

目的:熟悉并掌握动态分区分配的各种算法,熟悉并掌握动态分区中分区回收的各种情况,并能够实现分区合并。

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


二、实验内容

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删除后再分配时,会显示分配成功。

相关推荐
丈剑走天涯28 分钟前
基于 Python 3 语法的 PyCharm 练习示例,涵盖列表操作、类型判断及数据清洗等核心知识点
windows·python·pycharm
吃好睡好便好39 分钟前
查找函数的使用
学习·算法·matlab·生活·查找函数
学习星球41 分钟前
单调栈——从“找下一个更大的“到柱状图中的最大矩形
数据库·c++·算法·leetcode·xcode
————A1 小时前
Agent 接收用户上传文件
人工智能·笔记·python·状态模式
奔跑的痕迹1 小时前
如何删除引力画报?
笔记
可乐鸡翅yeah_1 小时前
hls.js 内存泄漏实战排查,直播 M3U8 长时间播放异常定位方案
开发语言·javascript·python·django·ecmascript·m3u8·m3u8在线
可乐鸡翅yeah_1 小时前
第三方接口对接 M3U8 流媒体排坑实战,解决外部服务商流兼容难题
前端·javascript·python·django·html·m3u8·m3u8在线
2601_962203511 小时前
Java进阶07集合(续)
java·开发语言
金融小师妹1 小时前
多因子智能推演:黄金震荡回升,杰克逊霍尔“沃什首秀”政策如何重塑金价路径的AI预测框架
大数据·人工智能·python·线性回归
阿童木写作1 小时前
跨马翻译:AI批量图片翻译与视频字幕翻译工具推荐
人工智能·python·音视频