动态分区存储管理

一、实验目的

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

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


二、实验内容

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

相关推荐
张太行_44 分钟前
C++中的析构器(Destructor)(也称为析构函数)
开发语言·c++
aiweker2 小时前
Selenium 使用指南:从入门到精通
python·selenium·测试工具
SteveKenny3 小时前
Python 梯度下降法(六):Nadam Optimize
开发语言·python
Hello.Reader4 小时前
深入浅出 Rust 的强大 match 表达式
开发语言·后端·rust
dreadp5 小时前
解锁豆瓣高清海报(二) 使用 OpenCV 拼接和压缩
图像处理·python·opencv·计算机视觉·数据分析
Tester_孙大壮5 小时前
第32章 测试驱动开发(TDD)的原理、实践、关联与争议(Python 版)
驱动开发·python·tdd
涛ing5 小时前
32. C 语言 安全函数( _s 尾缀)
linux·c语言·c++·vscode·算法·安全·vim
__雨夜星辰__5 小时前
Linux 学习笔记__Day2
linux·服务器·笔记·学习·centos 7
xrgs_shz6 小时前
MATLAB的数据类型和各类数据类型转化示例
开发语言·数据结构·matlab