操作系统 内存管理

devtools/2024/10/19 7:27:36/

实验目的:

  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 16typedef 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分配器的功能,并对其在不同场景下的表现进行了评估。这次实验让我更加深入地理解了内存管理的重要性和原理,为以后深入学习操作系统打下了良好的基础。


http://www.ppmy.cn/devtools/53464.html

相关文章

PostgreSQL源码分析——启动过程

PostgreSQL可通过pg_ctl start -D pgdata启动节点,我们看一下主节点启动流程。为了便于调试,我们以postgres -D pgdata命令启动数据库并进行调试分析。 启动主流程 我们分析一下启动的时候,需要做那些工作,数据库启动时,需要先判断版本是否兼容,pg_control文件是否存在…

大模型商业化:李开复向左,张亚勤向右

文&#xff5c;白 鸽 “零一万物坚决做To C&#xff0c;不做赔钱的To B&#xff0c;要做能赚钱的To B。”2024年6月14日&#xff0c;在智源大会上&#xff0c;零一万物创始人李开复如此坚定地说道。 而与之相对&#xff0c;中国工程院院士、清华大学智能产业研究院&…

YOLOv8旋转目标检测Yolov8n-obb详细实例+rolabelimg

一、Yolov8环境搭建 首先创建虚拟环境下载安装&#xff08;其实就是yolov8的环境&#xff09;再大概写一下步骤&#xff0c;没有想详细的看本人另外一篇&#xff1a;YOLOv8环境搭建_yolov8环境配置-CSDN博客 1、下载安装anaconda 2、创建虚拟环境 conda create -n my_yolov8…

【问题解决】shell脚本执行错误 $‘\r‘:command not found

shell脚本执行错误 $‘\r’:command not found 问题原因&#xff1a; 在 Windows 中&#xff0c;换行符是由回车符&#xff08;\r&#xff09;和换行符&#xff08;\n&#xff09;组成的&#xff0c;而在 Unix/Linux 等系统中&#xff0c;只使用换行符&#xff08;\n&#xff…

蓝牙耳机怎么连接电脑?轻松实现无线连接

蓝牙耳机已经成为许多人生活中不可或缺的一部分&#xff0c;不仅可以方便地连接手机&#xff0c;还能轻松连接电脑&#xff0c;让我们在工作和娱乐时享受无线的自由。然而&#xff0c;对于一些用户来说&#xff0c;将蓝牙耳机与电脑连接可能会遇到一些问题。本文将介绍蓝牙耳机…

“Redis中的持久化:深入理解RDB与AOF机制“

目录 # 概念 1. RDB持久化 1.1 备份是如何执行的&#xff08;RDB过程&#xff09; 1.2 配置文件信息 1.3 RDB持久化操作 1.4 RDB优势 1.5 RDB劣势 1.6 RDB做备份 2. AOF持久化 2.1 AOF开启及使用 2.2 异常恢复 2.3 配置文件操作 2.4 AOF持久化流程 2.5 优点 2.6…

内江科技杂志内江科技杂志社内江科技编辑部2024年第13期目录

科教兴国 内江市科技局“五个强化”助力“五经普”工作有序推进 本刊通讯员; 1 内江市多措并举融入成渝中线科创走廊建设 本刊通讯员; 2 科学管理《内江科技》投稿&#xff1a;cnqikantg126.com 数字化社会公共图书馆的服务效能提升策略研究 闫永凤;臧萌;王亚博;王…

如何用python调用C++处理图片

一. 背景 用pyhton可直接调用C&#xff0c;减少重写的工作量&#xff1b;部分逻辑运算&#xff0c;C的执行效率高&#xff0c;可进行加速。 下面就一个简单的C滤镜&#xff08;彩色图转灰度图&#xff09;为例&#xff0c;展示python调用C 二. 代码实现 代码结构如下&#x…