实验目的:
- 理解虚拟内存在内存管理中的核心作用。
- 掌握常见的内存分配回收算法思想。
实验内容:
- 编程模拟实现内存伙伴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分配器的功能,并对其在不同场景下的表现进行了评估。这次实验让我更加深入地理解了内存管理的重要性和原理,为以后深入学习操作系统打下了良好的基础。