#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
typedef struct MemoryBlock {
void* start_addr;
size_t size;
struct MemoryBlock* next;
} MemoryBlock;
MemoryBlock* free_list = NULL;
void initialize_memory(void* base_addr, size_t total_size) {
free_list
= (MemoryBlock
*)malloc(sizeof(MemoryBlock
)); free_list->start_addr = base_addr;
free_list->size = total_size;
free_list->next = NULL;
}
void print_free_list() {
MemoryBlock* current = free_list;
printf("Free Memory Blocks:\n"); while (current != NULL) {
printf(" Address: %p, Size: %zu\n", current
->start_addr
, current
->size
); current = current->next;
}
}
// Hàm cấp phát bộ nhớ First Fit
void* firstfit_malloc(size_t size) {
MemoryBlock *prev = NULL, *curr = free_list;
while (curr != NULL) {
if (curr->size >= size) {
void* alloc_addr = curr->start_addr;
if (curr->size == size) {
if (prev == NULL) free_list = curr->next;
else prev->next = curr->next;
} else {
curr->start_addr = (char*)curr->start_addr + size;
curr->size -= size;
}
return alloc_addr;
}
prev = curr;
curr = curr->next;
}
return NULL;
}
// Hàm cấp phát bộ nhớ Best Fit
void* bestfit_malloc(size_t size) {
MemoryBlock *best_fit = NULL, *best_fit_prev = NULL;
MemoryBlock *prev = NULL, *curr = free_list;
while (curr != NULL) {
if (curr->size >= size) {
if (best_fit == NULL || curr->size < best_fit->size) {
best_fit = curr;
best_fit_prev = prev;
}
}
prev = curr;
curr = curr->next;
}
if (best_fit == NULL) return NULL;
void* alloc_addr = best_fit->start_addr;
if (best_fit->size == size) {
if (best_fit_prev == NULL) free_list = best_fit->next;
else best_fit_prev->next = best_fit->next;
} else {
best_fit->start_addr = (char*)best_fit->start_addr + size;
best_fit->size -= size;
}
return alloc_addr;
}
// Hàm giải phóng và hợp nhất khối liền kề
void free_mem(void* addr, size_t size) {
MemoryBlock
* new_block
= (MemoryBlock
*)malloc(sizeof(MemoryBlock
)); new_block->start_addr = addr;
new_block->size = size;
new_block->next = NULL;
if (free_list == NULL || free_list->start_addr > addr) {
new_block->next = free_list;
free_list = new_block;
} else {
MemoryBlock* curr = free_list;
while (curr->next != NULL && curr->next->start_addr < addr) {
curr = curr->next;
}
new_block->next = curr->next;
curr->next = new_block;
}
// Hợp nhất khối liền kề
MemoryBlock* curr = free_list;
while (curr != NULL && curr->next != NULL) {
void* curr_end = (char*)curr->start_addr + curr->size;
if (curr_end == curr->next->start_addr) {
curr->size += curr->next->size;
MemoryBlock* temp = curr->next;
curr->next = temp->next;
} else {
curr = curr->next;
}
}
}
int main() {
void* memory_pool
= malloc(2048); // Giả lập bộ nhớ ban đầu
initialize_memory(memory_pool, 2048);
print_free_list();
void* ptr1 = firstfit_malloc(256);
printf("\nAfter allocating 256 bytes:\n"); print_free_list();
void* ptr2 = bestfit_malloc(128);
printf("\nAfter allocating 128 bytes:\n"); print_free_list();
free_mem(ptr1, 256);
printf("\nAfter freeing 256 bytes:\n"); print_free_list();
// Đừng quên giải phóng vùng memory_pool nếu không dùng nữa
return 0;
}