动态分区存储管理

news2025/3/1 8:21:12

一、实验目的

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

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


二、实验内容

1、实验内容

分区分配算法至少实现首次适应算法、最佳适应算法和最坏适应算法中的至少两种。熟悉并掌握各种算法的空闲区组织方式。

分区的初始化——可以由用户输入初始分区的大小。(初始化后只有一个空闲分区,起始地址为0,大小是用户输入的大小)

分区的动态分配过程:由用户输入作业号和作业的大小,实现分区过程。

分区的回收:用户输入作业号,实现分区回收,同时,分区的合并要体现出来。(注意:不存在的作业号要给出错误提示!)

分区的显示:任何时刻,可以查看当前内存的情况(起始地址是什么,大小多大的分区是空闲的,或者占用的,能够显示出来)。

2、实验要求

1内存空间不足的情况,要有相应的显示;

2作业不能同名,但是删除后可以再用这个名字;

3作业空间回收是输入作业名,回收相应的空间,如果这个作业名不存在,也要有相应的提示;

(4)实现FF、BF、WF内存分配算法中的至少两种。

(5)实验完成后要参加实验答辩。


三、实验代码

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2259612.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JPG 转 PDF:免费好用的在线图片转 PDF 工具

JPG 转 PDF&#xff1a;免费好用的在线图片转 PDF 工具 在日常工作和生活中&#xff0c;我们经常需要将图片转换为 PDF 格式。无论是制作电子文档、准备演示材料&#xff0c;还是整理照片集&#xff0c;将图片转换为 PDF 都是一个常见的需求。今天为大家介绍一款完全免费、无需…

10、C++继承2

本章介绍菱形继承、虚继承和类型适应。 1、菱形继承与虚继承 在多继承中&#xff0c;可能会发生多个父类共基类的问题&#xff0c;即菱形继承。 例如&#xff1a; 解决办法&#xff1a; 父类继承基类时使用虚继承&#xff0c;在继承前加virtual&#xff0c;即&#xff1a;虚…

探索Telnet:实现Windows远程登录Ubuntu的实践指南

前言 在互联网技术日新月异的今天&#xff0c;远程登录已经成为许多开发者和系统管理员日常工作中不可或缺的一部分。虽然SSH已经成为远程登录的首选协议&#xff0c;但了解并掌握Telnet这一经典协议仍然具有重要意义。本文将带您一起探索如何使用Telnet实现Windows远程登录Ub…

字符串的常见操作【C语言】

一、案例内容 字符串的常见操作主要有创建&#xff0c;输出&#xff0c;查找指定字符或查找指定位置的字符、删除指定字符或删除指定位置的字符&#xff0c;在指定位置插入指定字符等。 二、案例代码 #include <stdio.h> #include <stdlib.h> #include <stri…

axios的引入和基本使用

一、axios的引入 使用 pnpm add axios 二、使用axios 三、axios的使用方法补充 axios除了直接使用它实例上的方法&#xff0c;还可以通过配置的方式进行使用axios({})&#xff0c;传入一个对象&#xff0c;这个对象可以有如下属性&#xff1a; url&#xff08;字符串&#…

Dart 3.6 发布,workspace 和 Digit separators

workspace 之前我们就聊过 Flutter 正在切换成 Monorepo 和支持 workspaces &#xff0c;Dart 3.6 开始&#xff0c;Pub 现在正式支持 monorepo 或 workspace 中 package 之间的共享解析。 pub workspaces 功能可确保 monorepo 中的 package 共享一组一致的依赖项&#xff0c…

三、nginx实现lnmp+discuz论坛

lnmp l&#xff1a;linux操作系统 n&#xff1a;nginx前端页面 m&#xff1a;mysql数据库&#xff0c;账号密码&#xff0c;数据库等等都保存在这个数据库里面 p&#xff1a;php——nginx擅长处理的是静态页面&#xff0c;页面登录账户&#xff0c;需要请求到数据库&#…

【MFC】如何读取rtf文件并进行展示

tf是微软的一个带格式的文件&#xff0c;比word简单&#xff0c;我们可以用写字板等程序打开编辑。下面以具体实例讲解如何在自己程序中展示rtf文件。 首先使用VS2022创建一个MFC的工程。 VIEW类需要选择richview类&#xff0c;用于展示&#xff0c;如下图&#xff1a; 运行效…

AudioSegment 将音频分割为指定长度时间片段 - python 实现

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” -------------------------------------------------------------…

【新人系列】Python 入门(十六):正则表达式

✍ 个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4dd; 专栏地址&#xff1a;https://blog.csdn.net/newin2020/category_12801353.html &#x1f4e3; 专栏定位&#xff1a;为 0 基础刚入门 Python 的小伙伴提供详细的讲解&#xff0c;也欢迎大佬们…

Leetcode 每日一题9.回文数

&#x1f308;&#x1f308;&#x1f308;今天给大家分享的是:回文数的解法 目录 ​编辑 问题描述 输入输出格式 示例 约束条件 进阶挑战 解决方案 问题分析 过题图片 字符串转换法 数学方法 算法解释 题目链接 结论 问题描述 给定一个整数 x&#xff0c;我们需要…

Python Turtle 实现动态时钟:十二时辰与星空流星效果

在这篇文章中&#xff0c;我将带你通过 Python 的 turtle 模块构建一个动态可视化时钟程序。这个时钟不仅具备传统的时间显示功能&#xff0c;还融合了中国古代的十二时辰与八卦符号&#xff0c;并通过动态星空、流星效果与昼夜背景切换&#xff0c;为程序增添了观赏性和文化内…

建筑电气火灾是怎么发生的?如何降低电气火灾风险?

电气火灾一直是建筑火灾的主要诱因&#xff0c;占总火灾比例的28.4%。传统的末端配电监控手段存在覆盖范围不足、反应时间滞后等问题&#xff0c;难以及时发现并应对潜在的电气安全隐患。本文提出了一种基于通讯模块、智能微断和智能终端的建筑末端配电解决方案&#xff0c;通过…

Go有限状态机实现和实战

Go有限状态机实现和实战 有限状态机 什么是状态机 有限状态机&#xff08;Finite State Machine, FSM&#xff09;是一种用于建模系统行为的计算模型&#xff0c;它包含有限数量的状态&#xff0c;并通过事件或条件实现状态之间的转换。FSM的状态数量是有限的&#xff0c;因此称…

Qt实现自定义行编辑器

引言 开发环境项目结构ui界面设计示例代码运行效果总结qt中原有的行编辑器无法满足当前的需要,所以需要自定义行编辑器。 通过上下按键切换到不同的行编辑器,在选中的行编辑器中输入数字,编辑器呈现边框,编辑后按下回车键保存之前编辑的数值,没有按下回车键直接切换上下键…

企业级日志分析系统ELK之ELK概述

ELK 概述 ELK 介绍 什么是 ELK 早期IT架构中的系统和应用的日志分散在不同的主机和文件&#xff0c;如果应用出现问题&#xff0c;开发和运维人员想排 查原因&#xff0c;就要先找到相应的主机上的日志文件再进行查找和分析&#xff0c;所以非常不方便&#xff0c;而且还涉及…

2024153读书笔记|《春烂漫:新平摄影作品选》——跳绳酷似人生路,起落平常,进退平常,莫惧征途万里长

2024153读书笔记|《春烂漫&#xff1a;新平摄影作品选》——跳绳酷似人生路&#xff0c;起落平常&#xff0c;进退平常&#xff0c;莫惧征途万里长 《春烂漫&#xff1a;新平摄影作品选》作者新平&#xff0c;2019.12.25年读完的小书&#xff0c;当时就觉得挺不错&#xff0c;今…

每日一站技術架構解析之-cc手機桌布網

# 網站技術架構解析&#xff1a; ## 一、整體架構概述https://tw.ccwallpaper.com是一個提供手機壁紙、桌布免費下載的網站&#xff0c;其技術架構設計旨在實現高效的圖片資源管理與用戶訪問體驗優化。 ### &#xff08;一&#xff09;前端展示 1. **HTML/CSS/JavaScript基礎構…

Nacos 3.0 Alpha 发布,在安全、泛用、云原生更进一步

自 2021 年发布以来&#xff0c;Nacos 2.0 在社区的支持下已走过近三年&#xff0c;期间取得了诸多成就。在高性能与易扩展性方面&#xff0c;Nacos 2.0 取得了显著进展&#xff0c;同时在易用性和安全性上也不断提升。想了解更多详细信息&#xff0c;欢迎阅读我们之前发布的回…

Mybatis -plus -jion的复习

Mybatis -plus -jion 是一个 MyBatis-Plus 的增强工具&#xff0c;在 MyBatis-Plus 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 - **无侵入**&#xff1a;只做增强不做改变&#xff0c;引入它不会对现有工程产生影响&#xff0c;如丝般顺滑 - **损耗小…