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

news2024/12/27 20:06:28

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

实验内容

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

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

实现代码

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

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

#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;
        }
    }
}

运行结果

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

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

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

相关文章

LLama学习记录

学习前&#xff1a; 五大问题&#xff1a; 为什么SwiGLU激活函数能够提升模型性能&#xff1f;RoPE位置编码是什么&#xff1f;怎么用的&#xff1f;还有哪些位置编码方式&#xff1f;GQA&#xff08;Grouped-Query Attention, GQA&#xff09;分组查询注意力机制是什么&…

使用Python发送电子邮件

大家好&#xff0c;当我们需要迅速、方便地与他人沟通时&#xff0c;电子邮件是无疑是一种不可或缺的通信工具。无论是在个人生活中还是工作场合&#xff0c;电子邮件都是我们日常生活中的重要组成部分。它不仅能够传递文字信息&#xff0c;还可以发送附件、链接和嵌入式多媒体…

AJAX基础知识

定义 Ajax 异步 JavaScript 和 XML &#xff08; async javascript and xml &#xff09;&#xff0c;使用 Ajax 技术网页应用能够快速地将数据更新呈现在用户界面上&#xff0c;而不需要重载&#xff08;刷新&#xff09;整个页面&#xff0c;这使得程序能够更快地回应用户的操…

6、xss-labs之level8

1、测试分析 传入123查看页面源码&#xff0c;发现传入的值传给了value和a标签的href&#xff0c;并且对特殊字符<>" 都进行了HTML实体化&#xff0c;对于大小写进行了转化&#xff0c;过滤掉了src、data、onfocus、href、script、"&#xff08;双引号&#…

JAVA学习路线图

计算机网课资料分享群&#xff1a;710895979

每天写两道(二)LRU缓存、

146.LRU 缓存 . - 力扣&#xff08;LeetCode&#xff09; 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存…

蓝桥杯第1022题 玩具蛇 基础DFS C++ Java

题目 思路和解题方法 问题理解&#xff1a;此题要求找出将一条由16节正方形构成的玩具蛇放入4x4的方格中的不同方式数。每节蛇可以是直线或直角转弯&#xff0c;且蛇的形状需要完全覆盖盒子里的16个格子&#xff0c;每个格子仅被蛇的一个部分占据。 状态表示&#xff1a;使用一…

Mesa软件框架以及重要数据结构分析

Mesa软件框架以及重要数据结构分析 引言 Mesa的实现比较复杂&#xff0c;其中还有许多的数据结构之间的关系逻辑还不是很清楚。感觉分析了又没有分析一样&#xff0c;这里我们再理一理&#xff01; 1.1 Mesa下EGL/GL核心数据结构和层级关系 MESA的核心数据结构很多很复杂&#…

猜猜我是谁游戏

猜谜过程 在TabControl控件中&#xff0c;第一个tab中放了一个PictureBox&#xff0c;里面有一张黑色的图片。 玩家点击显示答案按钮&#xff0c;切换图片。 设计器 private void button1_Click(object sender, EventArgs e){this.pictureBox1.Image Image.FromFile(&qu…

多模态大模型:系统、趋势与问题

引言 多模态大模型是当今人工智能领域的热门方向之一。它不仅能处理文本&#xff0c;还能理解和生成图像、视频、语音等多种模态的数据。这种能力使得多模态大模型在自然语言处理、计算机视觉等多个领域展示出巨大的潜力和应用价值。那么&#xff0c;多模态大模型是如何训练出…

【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)

【LeetCode刷题】Day 10 题目1&#xff1a;30. 串联所有单词的子串&#xff08;困难&#xff09;思路分析&#xff1a;思路1&#xff1a;滑动窗口哈希map 题目2&#xff1a;LCR 017.最小覆盖子串思路分析思路1&#xff1a;滑动窗口哈希表 题目1&#xff1a;30. 串联所有单词的子…

MyBatis学习笔记(周五前学完)

MyBatis-Plus是一个MyBatis的增强工具。在MyBatis的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 通过MyBatis-Plus来进行数据插入时&#xff0c;它默认会 使用雪花算法来生成id&#xff0c;长度比较长 增删改的返回值都是统一的&#xff0c;影响的只有行数。…

Matplotlib绘图指南:从基础绘图到多子图展示

目录 前言 导入模块 第一点&#xff1a;绘制图像 第二点&#xff1a;保存图像 第三点&#xff1a;多图形的绘制 第四点&#xff1a;绘制多子图 总结 前言 在数据可视化中&#xff0c;Matplotlib是一款强大的Python库&#xff0c;提供了丰富的功能来绘制各种类型的图表。…

Notepad++不显示CRLF的方法

View -> Show Symbol -> 去掉勾选 Show All Characters

[机缘参悟-191] - 《道家-水木然人间清醒1》读书笔记 -14- 关系界限 - 经济和人格上的独立,走向成熟的必经之路,才能更好的谈其他情感(IT)

目录 前言&#xff1a; 1、“友善的孤独者” 2、“外向的孤独者” 3、道不同不相为谋 4、警惕依赖 5、完整独立的个体 6、不必纠正他人的错误&#xff0c;除非他影响了你 7、不再期待别人能理解自己&#xff0c;只有高维向下兼容你的人才能理解你 8、只有高维和同频的…

有限元之有限元法的实现

目录 一、单元刚度矩阵及单元荷载 二、总刚度矩阵及总荷载的合成 三、边界条件处理 四、算例实现 4.1 C代码 4.2 计算结果 五、结论 前三节我们介绍了有限元的基本概念、变分理论及有限元空间的构造&#xff0c;本节我们探讨如何实现有限元法。我们继续以二维椭圆型方程…

5W 1.5KVDC、3KVDC 宽电压输入 DC/DC 电源模块——TP05DA 系列,广泛应用于通信、铁路等设备中

TP05DA系列电源模块额定输出功率为5W&#xff0c;外形尺寸为31.75*20.32*10.65&#xff0c;应用于2:1及4:1电压输入范围 9V-18V、18V-36V、36V-72V、9V-36V和18V-72VDC的输入电压环境&#xff0c;输出电压精度可达1%&#xff0c;具有输出短路保护等功能&#xff0c;可广泛应用于…

Apache、Nginx、IIS文件解析漏洞

目录 1、文件解析漏洞介绍 2、Apache相关的解析漏洞 &#xff08;1&#xff09;多后缀解析漏洞 &#xff08;2&#xff09;Apache配置问题 &#xff08;3&#xff09;换行符解析漏洞 &#xff08;4&#xff09;罕见后缀解析 3、Nginx相关的解析漏洞 &#xff08;1&…

刷代码随想录有感(82):贪心算法——摆动序列

题干&#xff1a; 代码&#xff1a; class Solution { public:int wiggleMaxLength(vector<int>& nums) {if(nums.size() < 1)return nums.size();int prediff 0;int curdiff 0;int res 1;for(int i 0; i < nums.size() - 1; i){curdiff nums[i 1] - nu…

隆道出席河南ClO社区十周年庆典,助推采购和供应链数字化发展

5月26日&#xff0c;“河南ClO社区十周年庆典”活动在郑州举办&#xff0c;北京隆道网络科技有限公司总裁助理姚锐出席本次活动&#xff0c;并发表主题演讲《数字化采购与供应链&#xff1a;隆道的探索与实践》&#xff0c;分享隆道公司在采购和供应链数字化转型方面的研究成果…