Tarea #3 para el curso Principios de Sistemas Operativos — Simulación de administración dinámica de memoria utilizando un heap personalizado, con soporte para malloc, calloc, realloc, free, y tres algoritmos de asignación: First-Fit, Best-Fit, y Worst-Fit.
-
Steven Sequeira Araya
-
Jefferson Salas Cordero
Nota: se debe usar una terminal compatible con Linux
Desde la raíz del repositorio:
makeEsto genera el ejecutable memsim.
./memsim tests/basic_test.txt./memsim tests/edge_cases.txt./memsim tests/realloc_test.txtEl programa:
- Inicializa la arena de memoria
- Lee y ejecuta cada comando del archivo (
ALLOC,FREE,REALLOC,PRINT) - Muestra el estado del heap
- Detecta fugas de memoria al finalizar mediante
var_print_leaks()
En src/main.c, después de iniciar las variables vars_init():
allocator_set_algorithm(ALLOC_FIRST_FIT);
allocator_set_algorithm(ALLOC_BEST_FIT);
allocator_set_algorithm(ALLOC_WORST_FIT);Descomenta el algoritmo que deseas usar
Nota: En caso de no descomentar alguno, se asume por defecto el algoritmo de First Fit
La arquitectura se diseñó siguiendo principios SOLID, alta modularidad, separación de responsabilidades y claridad estructural.
memsim/
│
├── src/
│ ├── main.c
│ │
│ ├── core/
│ │ ├── memory.c
│ │ ├── allocator.c
│ │ ├── blocks.c
│ │ ├── variables.c
│ │ ├── memory_ops.c
│ │ ├── print.c
│ │ └── parser.c
│ │
│ └── utils/
│ ├── list.c
│ ├── string_utils.c
│ └── log.c
│
├── include/
│ ├── memory.h
│ ├── allocator.h
│ ├── blocks.h
│ ├── variables.h
│ ├── parser.h
│ ├── list.h
│ ├── string_utils.h
│ ├── memory_ops.h
│ ├── print.h
│ └── log.h
│
├── tests/
│ ├── basic_input.txt
│ ├── fragmentation_cases.txt
│ └── realloc_edge_cases.txt
│
├── Makefile
└── README.mdCódigo fuente principal del simulador.
Punto de entrada del programa. Inicializa memoria, variables, selecciona algoritmo y ejecuta un archivo de comandos mediante el parser.
Componentes centrales del simulador: arena, bloques, asignador, operaciones de alto nivel y parser.
Implementa:
- Inicialización y destrucción de la arena simulada (
memory_init,memory_destroy) - Manejo del bloque inicial
- Acceso al puntero de arena
Implementa los algoritmos de asignación:
- First-Fit
- Best-Fit
- Worst-Fit
Se encarga de seleccionar el bloque libre más adecuado para ALLOC/REALLOC.
Administra la lista doblemente enlazada de bloques. Funciones principales:
block_create()block_split()block_merge()blocks_first()blocks_destroy()
Responsable de la estructura del heap y fragmentación.
Implementa la tabla hash simple (lista enlazada) que asocia:
nombre de variable → bloque asignado
Soporta:
- Registrar variable (
var_set) - Eliminar variable (
var_remove) - Obtener bloque (
var_get) - Detectar fugas (
var_print_leaks)
Capa de operaciones de alto nivel:
mem_allocmem_freemem_realloc
Coordina allocator, bloques, arena y tabla de variables.
Genera una visualización del heap:
- Lista completa de bloques
- Resumen: memoria total / libre / usada / bloques libres
Lee archivos de comandos y ejecuta:
ALLOC <nom> <size>
FREE <nom>
REALLOC <nom> <size>
PRINT
Gestiona errores de sintaxis y líneas inválidas.
Funciones utilitarias independientes.
Implementación simple de listas enlazadas. Usada para tablas intermedias si se requieren.
Funciones auxiliares para:
- Trim de espacios
- Detección de prefijos
- Normalización de líneas
Sistema básico de logging vía:
log_infolog_error
Headers del proyecto.
Cada archivo .h declara la interfaz pública del módulo correspondiente:
- memory.h — API para la arena simulada
- allocator.h — enum y funciones de asignación
- blocks.h — estructuras y operaciones sobre bloques
- variables.h — tabla nombre → bloque
- parser.h — ejecución de archivos
- list.h — utilidades de lista
- string_utils.h — utilidades de string
- memory_ops.h — ALLOC, FREE, REALLOC
- print.h — visualización del heap
- log.h — logging
Colección de archivos de prueba diseñados para demostrar cada aspecto del simulador.
Prueba simple de ALLOC/FREE/PRINT.
Crea fragmentación real y demuestra el efecto de liberar bloques intermedios.
Prueba los 5 casos de REALLOC:
- Igual tamaño
- Reducir
- Expandir in-place
- Mover a nuevo bloque
- Tamaño cero
Nota Por cada uno se puede ajustar cual algoritmo usar. Para más detalles ver la la sección de compilación y ejecución.
Sistema de compilación.
Genera memsim, compila cada módulo y gestiona reglas:
makemake clean
Este archivo: documentación completa del proyecto.