操作系统的内存管理主要包括内存分配、内存回收、内存保护等方面。以下是一个简单的内存分配和释放的示例代码:
// 定义内存块结构体
struct mem_block {
struct mem_block *next; // 指向下一个内存块
size_t size; // 内存块大小
bool is_free; // 是否空闲
};
// 定义链表头节点
struct mem_block *head = NULL;
// 分配内存
void *malloc(size_t size) {
struct mem_block *curr, *prev;
void *res = NULL;
// 遍历链表查找空闲内存块
for (curr = head, prev = NULL; curr != NULL; prev = curr, curr = curr->next) {
if (curr->is_free && curr->size >= size) {
// 找到合适的内存块
curr->is_free = false;
res = (void *)(curr + 1);
if (curr->size - size > sizeof(struct mem_block)) {
// 如果剩余空间可以分配一个新的内存块,则创建新的内存块
struct mem_block *new_block = (struct mem_block *)((char *)res + size);
new_block->next = curr->next;
new_block->size = curr->size - size - sizeof(struct mem_block);
new_block->is_free = true;
if (prev) {
prev->next = new_block;
} else {
head = new_block;
}
curr->next = new_block;
curr->size = size;
}
break;
}
}
return res;
}
// 释放内存
void free(void *ptr) {
struct mem_block *block = (struct mem_block *)ptr - 1;
block->is_free = true;
// 合并相邻的空闲内存块
struct mem_block *curr, *prev;
for (curr = head, prev = NULL; curr != NULL; prev = curr, curr = curr->next) {
if (curr->is_free && curr->next && curr->next->is_free) {
curr->size += curr->next->size + sizeof(struct mem_block);
curr->next = curr->next->next;
}
if (prev && prev->is_free && curr->is_free) {
prev->size += curr->size + sizeof(struct mem_block);
prev->next = curr->next;
curr = prev;
}
}
}
该示例代码通过维护一个链表来管理内存块,每个内存块包含一个头部结构体和一个数据区域。内存分配时遍历链表查找空闲内存块,如果找到则分配内存并将剩余空间分割成一个新的内存块。内存释放时将对应内存块标记为空闲状态,并合并相邻的空闲内存块以减少内存碎片。