操作系统实验三 可变分区内存分配首次适应算法模拟

实验三 可变分区内存分配首次适应算法模拟

实验内容

模拟内存分配,了解并掌握动态分区分配中所用的数据结构、分区分配算法,深刻理解首次适应内存分配算法。

  • 模拟实现可变分区内存分配首次适应算法;
  • 空闲分区表要求有空闲块的起始地址、大小、状态等信息;
  • 设计一个功能函数,实现已分配块的回收及空闲块合并功能。

实现代码

这个原本的实验描述给的很模糊,也没有输入示例,只能从示例代码里猜一猜要实现什么效果。所以这里就按自己想法做了。

由于可变内存分区的数据用链表来存储比较合适,这里引入了一个链表类。

#include <iostream>
using namespace std;

class LinkedList {
public:
    struct LinkedNode {
        int memorySize;
        int usedMemorySize;
        int beginAddress;
        bool isUsed;
        LinkedNode* next;
        
        LinkedNode() : memorySize(0), beginAddress(0), usedMemorySize(0), isUsed(false), next(nullptr) {}
        explicit LinkedNode(int memorySize,int beginAddress) : memorySize(memorySize), beginAddress(beginAddress), usedMemorySize(0), isUsed(false), next(nullptr){}
    };

    LinkedList() {
        _dummyHead = new LinkedNode();
        _size = 0;
    }

    void insertAtTail(int memorySize,int beginAddress) {
        LinkedNode* newNode = new LinkedNode(memorySize, beginAddress);
        LinkedNode* cur = _dummyHead;
        while(cur->next != nullptr){
            cur = cur->next;
        }
        cur->next = newNode;
        _size++;
    }

    void AllocateAtIndex(int index) {
        if (index >= _size || index < 0) {
            return;
        }
        LinkedNode* cur = _dummyHead;
        while(index--) {
            cur = cur ->next;
        }
        cur->isUsed=true;
    }

    //分配内存
    void allocateMemory(int requiredMemorySize) {
        LinkedNode* cur = _dummyHead;
        if(cur->next== nullptr){
            cout<<"无可分配内存!\n";
        }
        while(cur!= nullptr) {
            if(cur->memorySize>requiredMemorySize){
                cur->isUsed=true;
                cur->usedMemorySize=requiredMemorySize;
                cout<<"分配成功";
                return;
            } else {
                cur = cur->next;
            }
        }
        cout<<"无可分配内存!\n";
   }

   void revokeMemory(int index) {
       if (index >= _size || index < 0) {
           cout<<"不存在该内存块\n";
           return;
       }
       LinkedNode* cur = _dummyHead;
       while(index--) {
           cur = cur ->next;
       }
       cur->isUsed=false;
       cur->usedMemorySize=0;
    }

   //整理内存
   void reshuffleMemory() {
        LinkedNode* cur = _dummyHead;
        while (cur != nullptr && cur->next != nullptr) {
            //如果当前节点内存已经分配过,且下一个节点是空的,就把内存移到下一个空节点去
            if(cur->next->usedMemorySize==0) {
                int leftMemory = cur->memorySize - cur->usedMemorySize;
                cur->memorySize=cur->usedMemorySize;
                cur->next->memorySize+=leftMemory;
            }
            cur=cur->next;
        }
    }
    
    void printMemoryUse() {
        LinkedNode* cur = _dummyHead;
        int index=0;
        while (cur->next != nullptr) {
            cout << "内存块号: "<<index<<" 起始地址: "<<cur->next->beginAddress<<" 内存用量: " <<cur->next->usedMemorySize<<" 内存总量: " <<cur->next->memorySize<<" 分配状态: "  <<cur->next->isUsed<<endl;
            index++;
            cur = cur->next;
        }
        cout << endl;
    }

    void printFreeMemory() {
        LinkedNode* cur = _dummyHead;
        int index=0;
        while (cur->next != nullptr ) {
            if(cur->next->isUsed==false){
                cout << "内存块号: "<<index<<" 起始地址: "<< cur->next->beginAddress <<" 内存总量: " <<cur->next->memorySize << endl;
                index++;
            }
            cur = cur->next;
        }
        cout << endl;
    }

private:
    int _size;
    LinkedNode* _dummyHead;
};

int main() {
    LinkedList memoryList;
    while(true) {
        int operation;
        cout<<"输入操作, 1输入内存块数据, 2分配内存, 3回收内存, 4自动整理内存, 5查看全部内存分配情况, 6查看空闲内存分区, 7退出: ";
        cin>>operation;
        switch (operation) {
            case 1:
                cout<<"输入内存大小及内存起始地址: ";
                int memorySize,beginAddress;
                cin>>memorySize>>beginAddress;
                memoryList.insertAtTail(memorySize,beginAddress);
                break;
            case 2:
                int requiredMemorySize;
                cout<<"输入需求内存大小: ";
                cin>>requiredMemorySize;
                memoryList.allocateMemory(requiredMemorySize);
                break;
            case 3:
                int index;
                cout<<"输入要回收的内存块号: ";
                cin>>index;
                memoryList.revokeMemory(index);
                break;
            case 4:
                memoryList.reshuffleMemory();
                break;
            case 5:
                memoryList.printMemoryUse();
                break;
            case 6:
                memoryList.printFreeMemory();
                break;
            default:
                return 0;
        }
    }
}

运行结果

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

6.2 Go 切片(Slice)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

惠海半导体 30V-60V-100V-150VMOS管 打火机、加湿器NMOS管 高耐压

MOS管的工作原理 MOS管&#xff0c;即金属-氧化物-半导体场效应晶体管&#xff0c;是一种重要的电子元件&#xff0c;在电路中起着关键的作用。其工作原理主要基于半导体材料的特性以及电场对电荷的控制。 首先&#xff0c;MOS管的基本结构包括源极、栅极和漏极。其中&#xf…

JUC框架(Future CompletableFuture详解)

文章目录 FutureFuture介绍Future原理Future代码示例 CompletableFutureCompletableFuture特点应用场景方法特性方法刨析supplyAsync/runAsyncthenApply / thenApplyAsync异步回调thenAccept / thenRunexceptionallywhenCompletehandle 实现场景 更多相关内容可查看 Future Fu…

实操专区-第15周-课堂练习专区-漏斗图与金字塔图

实操专区-第15周-课堂练习专区-漏斗图 下载安装ECharts&#xff0c;完成如下样式图形。 代码和截图上传 基本要求&#xff1a;下图3选1&#xff0c;完成代码和截图 完成 3.1.3.16 漏斗图中的任务点 基本要求&#xff1a;2个选一个完成&#xff0c;多做1个加2分。 请用班级学号姓…

有趣的css - 列表块加载动效

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是用 css 打造一个极简的列表块加载动效。 最新文章通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面css 样式页面渲染效果 整…

Linux shell命令

cat 文件名 查看文件内容&#xff0c; tac文件名 倒着显示。 more 文件名 显示内容 less文件名 和more的功能一样&#xff0c;按上下左右键&#xff0c;按Q键结束。 head文件名&#xff0c;只显示前10行内容。 ln是一个默认创建硬链接的命令 ln 文件名 ls -i文件名…

【每日力扣】300. 最长递增子序列 与 139. 单词拆分

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害 300. 最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&…

JEPaaS 低代码平台 accessToTeanantInfo SQL注入漏洞复现

0x01 产品简介 JEPaaS低代码开发平台开源版 旨在帮助企业快速实现信息化和数字化转型。该平台基于可视化开发环境,让软件开发人员和业务用户通过直观的可视化界面来构建应用程序 ,而不是传统的编写代码方式。 用户可以在开发平台灵活各个图形化控件,以构建业务流程、逻辑和…

Linux基础学习笔记

目录 1、Linux安装 1.1 安装教程 1.2 Linux目录结构 2、Linux常用命令 2.1 ls 2.2 命令分类 2.3 目录处理命令 2.4 操作文件命令 2.5 查找文件命令 2.6 ln链接命令 2.7 进程相关命令 ​编辑3、配置网络 3.1 关闭windows防火墙 3.2 配置好虚拟机的局域网 3.3 配置…

电焰灶:引领未来厨房烹饪革命,创“灶”家庭幸福感和安全感

随着科技的飞速发展&#xff0c;厨房灶具也迎来了前所未有的革新。电焰灶&#xff0c;这一新型的灶具&#xff0c;正以其独特的优势&#xff0c;逐渐取代传统的燃气灶和电磁炉&#xff0c;开启了一场灶具的新时代。它以其方便、节能的特点&#xff0c;让烹饪变得更加轻松高效&a…

ITIL4认证考试这么贵,还值得考证吗,有必要学吗?

从2023年4月1日开始&#xff0c;ITIL 4是Foundation认证将会捆绑OTM(Official Training Materials),这样在一次ITIL4的考试费中将会捆绑&#xff1a;试卷费电子教材书费监考费OTM费&#xff0c;每一种考试费都相较于2022年有涨幅&#xff0c;再加上PeopleCert收取的授权机构的授…

【喜报】科大睿智多家服务企业上榜2024年第四批DCMM名单

近日&#xff0c;DCMM官方平台发布通知公告&#xff0c;根据《数据管理能力成熟度评估工作管理办法(暂行)》的有关规定&#xff0c;经单位自愿申请&#xff0c;评估机构评估、专家评审及公示&#xff0c;下列27单位获得数据管理能力成熟度等级证书。小编祝贺多家服务企业上榜20…

神经网络不确定性综述(Part V)——Uncertainty measures and quality

相关链接&#xff1a; 神经网络不确定性综述(Part I)——A survey of uncertainty in deep neural networks-CSDN博客 神经网络不确定性综述(Part II)——Uncertainty estimation_Single deterministic methods-CSDN博客 神经网络不确定性综述(Part III)——Uncertainty est…

探索 ChatboxAI:智能对话的新时代

在人工智能迅速发展的今天&#xff0c;智能对话已经成为了我们日常生活中不可或缺的一部分。从智能助理到聊天机器人&#xff0c;AI 技术正在改变我们与世界互动的方式。今天&#xff0c;我们要介绍的是一个全新且功能强大的平台——ChatboxAI。 什么是 ChatboxAI&#xff1f;…

PyTorch自定义张量操作开发指南【CFFI+CUDA】

PyTorch 与 TensorFlow 一起成为深度学习研究人员和从业者的标准。虽然 PyTorch 在张量运算或深度学习层方面提供了多种选择&#xff0c;但一些专门的操作仍然需要手动实现。在运行时至关重要的情况下&#xff0c;应使用 C 或 CUDA 来完成此操作&#xff0c;以支持 CPU 和 GPU …

智能除螨—wtn6040-8s语音芯片方案引领除螨仪新时代

语音螨仪开发背景&#xff1a; 随着物联网技术的快速发展&#xff0c;除螨仪作为家庭清洁的重要工具&#xff0c;其智能化、人性化的设计成为提升市场竞争力的关键。置入语音芯片的除螨仪&#xff0c;通过开机提示、工作状态反馈、操作指引、故障提醒等内容。用户可以更加直观…

.NET 某和OA办公系统全局绕过漏洞分析

转自先知社区 作者&#xff1a;dot.Net安全矩阵 原文链接&#xff1a;.NET 某和OA办公系统全局绕过漏洞分析 - 先知社区 0x01 前言 某和OA协同办公管理系统C6软件共有20多个应用模块&#xff0c;160多个应用子模块&#xff0c;从功能型的协同办公平台上升到管理型协同管理平…

腾讯社招测试岗有点奇葩的面试,被问抽奖程序的测试用例设计

今天腾讯网上预约社会招聘&#xff0c;我是前天才看到这条消息&#xff0c;前天投了简历&#xff0c;还叫别人内推了我一把&#xff0c;但是悲剧的我把简历上的号码写成了原来在北京的号码&#xff0c;所以我也不知道是别人觉得我简历不合适还是因为联系不上我所以没有邀请我参…

View->Bitmap缩放到自定义ViewGroup的任意区域

Bitmap缩放和平移 加载一张Bitmap可能为宽高相同的正方形&#xff0c;也可能为宽高不同的矩形缩放方向可以为中心缩放&#xff0c;左上角缩放&#xff0c;右上角缩放&#xff0c;左下角缩放&#xff0c;右下角缩放Bitmap中心缩放&#xff0c;包含了缩放和平移两个操作&#xf…

数据要素的大海,如何流向千行百业?

文&#xff5c;白 鸽 编&#xff5c;王一粟 当数智化的风吹向银行业&#xff0c;是从底层数据的融合开始的。 在银行风控场景中&#xff0c;一个人想要进行风险投资或借贷&#xff0c;银行往往会评估这个人的信贷和风控策略。在以往的办理模式中&#xff0c;会需要办理人…