操作系统 内存管理

实验目的:

  1. 理解虚拟内存在内存管理中的核心作用。
  2. 掌握常见的内存分配回收算法思想。

实验内容:

  1. 编程模拟实现内存伙伴buddy分配器。

实验步骤:

1.理解Buddy分配算法原理:

在开始编码之前,先要深入理解Buddy分配算法的原理。这种算法将系统内存看作一棵二叉树,每个节点表示一块内存区域。空闲的内存区域以二叉树节点的形式组织起来,每个节点要么是未分配的,要么是已分配的。在分配内存时,根据需要分配的大小,选择合适大小的节点进行分割。回收内存时,将相邻的未分配的节点合并成一个更大的节点。

2.实现Buddy分配器:

根据Buddy分配算法的原理,编写代码实现内存的分配和回收功能。这包括分配时的空闲节点查找、节点分割,以及回收时的节点合并操作。

3.编写测试代码:

编写一些测试代码来验证Buddy分配器的功能。这些测试代码可以包括分配不同大小的内存块、回收内存、查看内存分配情况等功能。

源代码:

#include <stdio.h>

#include <stdlib.h>

#include <stdbool.h>

#include <math.h>



#define MEMORY_SIZE 1024

#define MIN_BLOCK_SIZE 16



typedef struct MemoryBlock {

    int size;

    bool free;

    struct MemoryBlock *next;

} MemoryBlock;



MemoryBlock *memory;



void initializeMemory() {

    memory = malloc(sizeof(MemoryBlock));

    memory->size = MEMORY_SIZE;

    memory->free = true;

    memory->next = NULL;

}



void splitBlock(MemoryBlock *block, int size) {

    while (block->size / 2 >= size) {

        MemoryBlock *newBlock = malloc(sizeof(MemoryBlock));

        newBlock->size = block->size / 2;

        newBlock->free = true;

        newBlock->next = block->next;

        block->next = newBlock;

        block->size /= 2;

    }

}



void *allocateMemory(int size) {

    MemoryBlock *current = memory;

    while (current != NULL) {

        if (current->free && current->size >= size) {

            if (current->size / 2 >= size) {

                splitBlock(current, size);

            }

            current->free = false;

            return current + 1;

        }

        current = current->next;

    }

    return NULL;

}



void mergeBlocks() {

    MemoryBlock *current = memory;

    while (current != NULL && current->next != NULL) {

        if (current->free && current->next->free && current->size == current->next->size) {

            current->next = current->next->next;

            current->size *= 2;

        } else {

            current = current->next;

        }

    }

}



void deallocateMemory(void *ptr) {

    MemoryBlock *block = (MemoryBlock *)ptr - 1;

    block->free = true;

    mergeBlocks();

}



void printMemory() {

    MemoryBlock *current = memory;

    while (current != NULL) {

        printf("Block size: %d, Free: %d\n", current->size, current->free);

        current = current->next;

    }

}



int main() {

    initializeMemory();



    void *ptr1 = allocateMemory(64);

    void *ptr2 = allocateMemory(128);

    void *ptr3 = allocateMemory(32);

    printMemory();



    deallocateMemory(ptr2);

    printMemory();



    return 0;

}

实验心得:

本次实验的主要任务是实现Buddy分配器,通过对内存的分割和合并来实现内存的动态分配和回收。在实现过程中,我深入理解了Buddy分配算法的原理,并通过编写代码将其实现出来。在编码过程中,需要注意内存块的分割和合并规则,以及对内存的正确管理,确保分配和回收的正确性。通过编写测试代码,我验证了Buddy分配器的功能,并对其在不同场景下的表现进行了评估。这次实验让我更加深入地理解了内存管理的重要性和原理,为以后深入学习操作系统打下了良好的基础。

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

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

相关文章

Web应用安全测试-综合利用(二)

Web应用安全测试-综合利用&#xff08;二&#xff09; Host头攻击 漏洞描述 Web应用程序获取网站域名一般是依赖HTTP Host header&#xff08;比如在JSP里通过request.getHeader()获取&#xff09;&#xff0c;这里的header很多情况下是不可靠的。 攻击者恶意利用HTTP Host h…

小米HyperOS 澎湃os机型免答题 免社区等级 秒接bl锁操作步骤解析【二】

前面两期博文; 小米HyperOS 澎湃os机型免答题 免社区等级 秒接bl锁操作步骤解析 小米机型解锁bl 绕过社区等级5才可以解锁的限制的教程_没有五级社区怎么解锁bl-CSDN博客 小米对米粉解锁bl是越来越苛刻了。目前社区等级 答题 审核等等步骤越来越繁琐。而且通过率很低。知名开…

细说MCU输出互补型PWM波形时设置死区时间的作用

目录 一、工程背景 二、死区时间的作用 一、工程背景 在作者的文章里建立工程时&#xff0c;为配置输出互补型PWM波形曾经设置了死区时间&#xff0c;DEAD100个定时器的时间周期&#xff08;简称实例1&#xff09;&#xff1a;细说MCU输出互补型PWM波形的实现方法-CSDN博客 …

计算机行业的现状与未来之2024

年年都说编程好&#xff0c;编程工资涨不了。 人家骑车送外卖&#xff0c;月入两万好不好。 一、计算机专业的背景与现状 在过去几十年里&#xff0c;计算机科学相关专业一直是高考考生的热门选择。无论是计算机科学与技术、软件工程&#xff0c;还是人工智能与大数据&#xff…

数据链路层知识分享【计算机网络】【以太网帧 | MTU的影响 | ARP技术】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;Linux_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 前文 一&#xff0c; 以…

《算法笔记》总结No.2——模拟

一.简单模拟 考察代码能力&#xff0c;不涉及算法&#xff1a;一类题目怎么说你就怎么做的类型~ 巴音布鲁克比赛&#xff0c;以车队为基准评选冠军。业务要求是&#xff1a;第一行输入正整数N&#xff0c;代表车手的总个数&#xff1b;接下来的N行每行键入两个数字&#xff1a…

在同一个 Blazor 应用中结合 SQL-DB 和 MongoDB

介绍 传统上&#xff0c;在单应用程序中&#xff0c;我们对整个应用程序使用单个数据库服务器。但是&#xff0c;我将 SQL 数据库和 MongoDB 结合在同一个应用程序中。此应用程序将是 RDBMS 和 No SQL 数据库的组合。我们将从头开始创建一个 Blazor 应用程序&#xff0c;并使用…

全域外卖系统源码部署怎么做,外卖市场新机遇!

随着本地生活下半场的到来&#xff0c;全域外卖逐渐成为众多创业者关注的焦点&#xff0c;再加上抖音关于新增《【到家外卖】内容服务商开放准入公告》的意见征集通知&#xff08;以下简称“通知”&#xff09;的发布&#xff0c;更是将当前全域外卖赛道重点入局方式之一的全域…

《无与伦比》Centos7 扩容到已有逻辑卷

命令可以查找硬盘和分区情况 fdisk -l lsblk

MyBatis的配置文件,即:src->main->resources的配置

目录 1、properties 标签 1.1 mybatis-config.xml 1.2 db.properties 1.3 在SqlMapConfig.xml 中 引入数据库配置信息 2、typeAliases 标签 2.1 定义别名 2.2 使用别名 3、Mappers标签 作用&#xff1a;用来在核心配置文件中引入映射文件 引入方式&#xff0c;有以下…

RocketMQ源码学习笔记:源码启动NameServer,Broker

这是本人学习的总结&#xff0c;主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、Overview2、NameServer2.1、源码启动NameServer 3、Broker启动过程 1、Overview 这篇文章的源码的版本是release-4.9.8。在启动各个模块之前应该先对项目进行打包mvn install -Dmaven.te…

Ubuntu-24.04-live-server-amd64启用ssh

系列文章目录 Ubuntu-24.04-live-server-amd64安装界面中文版 Ubuntu安装qemu-guest-agent Ubuntu乌班图安装VIM文本编辑器工具 文章目录 系列文章目录前言一、输入安装命令二、使用私钥登录&#xff08;可选&#xff09;1.创建私钥2.生成三个文件说明3.将公钥复制到服务器 三…

Android面试题之App的启动流程和启动速度优化

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 App启动流程 ①点击桌面App图标&#xff0c;Launcher进程采用Binder IPC向system_server进程发起startActivity请求&#xff1b; ②system_se…

从零到一:Python自动化测试的详细指南!

引言&#xff1a; Python是一种功能强大且易于学习和使用的编程语言&#xff0c;它非常适合用于自动化测试。本文将从零开始&#xff0c;通过详细的步骤和规范&#xff0c;介绍如何在Python中实施高质量的自动化测试。我们将探讨测试策略的制定、测试框架的选择、测试用例的编…

【质量】软件系统数据质量管理过程(Word原件)

软件系统数据做数据质量管理至关重要&#xff0c;原因有四&#xff1a; 首先&#xff0c;数据质量直接影响软件系统的性能和用户体验。高质量的数据能够确保系统稳定运行&#xff0c;提供准确、可靠的信息支持&#xff0c;从而增强用户的满意度和信任度。 其次&#xff0c;数据…

国际导师上海面授大规模敏捷LeSS认证2024年8月22-24日开班 | 报名享特大福利

课堂互动练习 学员反馈 • “LeSS课我正经听过的有3次&#xff1b;两次Bas Vodde主讲&#xff0c;一次吕毅老师主讲。第一次应该是2015年&#xff0c;这门课中体现的对组织运作和产品开发底层逻辑的洞见令我折服。后来又陆续听了两次&#xff0c;每次都有更多体会。 我试着从一…

计算机网络:运输层 - TCP首部格式 连接的创建与释放

计算机网络&#xff1a;运输层 - TCP首部格式 & 连接的创建与释放 TCP首部格式源端口 目的端口序号确认号数据偏移保留控制位窗口检验和紧急指针 TCP连接创建 - 三次握手TCP传输过程TCP连接释放 - 四次挥手 TCP首部格式 TCP的首部如下&#xff1a; 首部的前20 byte是固定的…

ASM字节码操纵框架实现AOP

前言 使用ASM改写字节码实现Aop&#xff0c;是最快的Aop实现方式。 我猜你肯定懂AOP 凡是学习Spring框架&#xff0c;必然会深入了解AOP的原理以及实现。这里做下简单总结 Spring默认采取的是动态代理机制实现AOP&#xff0c;当动态代理不可用时&#xff08;代理类无接口&a…

未来工牌:蓝牙智联的彩色墨水屏工牌

在快节奏的现代职场中&#xff0c;传统的工牌已无法满足人们对于个性化和智能化的需求。为此&#xff0c;我们创新研发了一款4寸电子墨水屏工牌&#xff0c;它不仅仅是一个身份的象征&#xff0c;更是一个集蓝牙通信、智能显示、节能环保于一体的未来工具。 这款工牌拥有600*4…

通过噪声扰动缓解多模态大型语言模型的幻觉问题

摘要 该论文提出了一种名为NoiseBoost的方法&#xff0c;通过噪声扰动来缓解多模态大语言模型(MLLM)中的幻觉问题。论文分析指出&#xff0c;幻觉主要源于大语言模型固有的总结机制&#xff0c;导致对语言符号的过度依赖&#xff0c;而忽视了视觉信息。NoiseBoost通过在视觉特…