操作系统 内存管理

实验目的:

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

  • 16
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值