Gestor de Memoria - Práctica 3 OS 1.0
Simulador de gestión de memoria con algoritmos de Primer Hueco y Siguiente Hueco.
Cargando...
Buscando...
Nada coincide
main.c
Ir a la documentación de este archivo.
1
15
16#include <raylib.h>
17
18#include "sim_engine.h"
19#include "ficheros.h"
20
21#include <stdio.h>
22#include <stdlib.h>
23#include <string.h>
24#include <unistd.h>
25#include <sys/wait.h>
26
28#define WIN_WIDTH 1200
30#define WIN_HEIGHT 750
32#define Y_BARRA 250
34#define ALTO_BARRA 100
36#define MARGEN_IZQ 50
38#define MARGEN_DER 50
39
40/* Declaraciones adelantadas */
41void test_sim();
42void run_gui(Memoria *m, Proceso *procesos, int num_procesos);
43
57int main(int argc, char const* argv[])
58{
59 pid_t pid = fork();
60
61 if (pid < 0) {
62 perror("Error en fork");
63 return -1;
64 }
65 else if (pid == 0) {
66 // Proceso Hijo: GUI (Raylib)
67 Memoria m;
69
70 Proceso procesos[MAX_PROCESOS];
71 int num_procesos = cargar_procesos("entrada.txt", procesos);
72
73 run_gui(&m, procesos, num_procesos);
74 _exit(0); // El hijo termina después de cerrar la GUI
75 } else {
76 // Proceso Padre: TUI (Terminal)
77 test_sim();
78 // Esperar a que el hijo (GUI) termine
79 waitpid(pid, NULL, 0);
80 }
81
82 return 0;
83}
84
95void test_sim() {
96 system("clear"); // Limpiamos la consola al iniciar
97
98 Memoria m;
100
101 TipoAlgo algoritmo_actual = ALGO_SIGUIENTE_HUECO;
102
103 limpiar_log("particiones_tui.txt");
104
105
106 // // Simulamos procesos falsos para probar
107 // Proceso procesos[2] = {
108 // {"P1", 0, 243, 5, 5, false, false}, // ID, Llegada, Tam, Duracion, Restante...
109 // {"P2", 1, 45, 2, 2, false, false}
110 // // {"P3", 2, 500, 5, 5, false, false},
111 // // {"P4", 3, 800, 3, 3, false, false}
112 // };
113
114 // Ahora con argumento de fichero
115 Proceso procesos[MAX_PROCESOS]; // Maximo 100 procesos
116 int num_procesos = cargar_procesos("entrada.txt", procesos);
117
118 int reloj_sim = 0;
119
120 int tiempo_total = 0; // Simulamos 20 instantes
121
122 for (int i = 0; i < num_procesos; i++) {
123 tiempo_total += procesos[i].t_ejecucion;
124 }
125
126 // --- BUCLE DE SIMULACIÓN ---
127 printf("=== INICIO DE LA SIMULACIÓN COMPLEJA ===\n");
128 printf("Memoria Total: %d\n\n", MEMORIA_TOTAL);
129
130 for (int i = 0; i < tiempo_total; i++) {
131 // Llamamos al motor de tiempo
132 avanzar_tiempo(&m, procesos, num_procesos, &reloj_sim, algoritmo_actual, "particiones_tui.txt");
133
134 // Visualizamos la memoria
135 printf("MEMORIA: ");
136 mostrar_estado(&m); // Mostramos el estado de la memoria con el formato adecuado [0 P1 500]...
137
138 // Visualizamos quién está esperando (Cola de espera)
139 printf("COLA ESPERA: ");
140 int esperando = 0;
141 for(int j=0; j<4; j++) {
142 if (!procesos[j].en_memoria && !procesos[j].finalizado && procesos[j].t_llegada <= reloj_sim-1) {
143 printf("[%s req:%d] ", procesos[j].nombre, procesos[j].mem_requerida);
144 esperando++;
145 }
146 }
147 if(esperando == 0) printf("(Nadie)");
148 printf("\n----------------------------------------------------\n");
149
150 printf("Presiona ENTER para continuar..."); // <-- AÑADE ESTO
151 fflush(stdout); // <-- Asegura que se muestre antes del getchar
152 getchar(); // Descomenta para ir paso a paso con ENTER
153 }
154}
155
177void run_gui(Memoria *m, Proceso *procesos, int num_procesos) {
178 InitWindow(WIN_WIDTH, WIN_HEIGHT, "Gestomemoria - Memory Simulator");
179 SetTargetFPS(60); // Set our game to run at 60 frames-per-second
180
181 limpiar_log("particiones.txt");
182
183 int reloj_sim = 0;
184 TipoAlgo algoritmo_actual = ALGO_SIGUIENTE_HUECO;
185
186 //Variables para repro automatica
187 bool auto_play = false;
188 float tiempo_acumulado = 0.0f;
189 float velocidad = 1.0f; // 1 segundo por tick
190
191 // Variables para los colores de los procesos
192 Color colores_prcesos[] = {
193 SKYBLUE,
194 PINK,
195 ORANGE,
196 LIME,
197 GOLD,
198 GREEN,
199 VIOLET,
200 MAROON,
201 BLUE,
202 RED,
203 PURPLE
204 };
205 int num_colores = sizeof(colores_prcesos) / sizeof(colores_prcesos[0]);
206
207 // Main app loop
208 while (!WindowShouldClose()) // Detect window close button or ESC key
209 {
210
211 // Opcion A: Paso Manual(Tecla espacio)
212 if (IsKeyPressed(KEY_SPACE))
213 avanzar_tiempo(m, procesos, num_procesos, &reloj_sim, algoritmo_actual, "particiones.txt");
214
215 // Opcion B: Auto Play(Tecla P)
216 if (IsKeyPressed(KEY_P))
217 auto_play = !auto_play;
218
219 // Logica del auto play
220 if (auto_play) {
221 tiempo_acumulado += GetFrameTime();
222 if (tiempo_acumulado >= velocidad) {
223 avanzar_tiempo(m, procesos, num_procesos, &reloj_sim, algoritmo_actual, "particiones.txt");
224 tiempo_acumulado = 0.0f;
225 }
226 }
227
228 // Opcion C: Resetear (Tecla R)
229 if (IsKeyPressed(KEY_R)) {
231 num_procesos = cargar_procesos("entrada.txt", procesos);
232 reloj_sim = 0;
233 limpiar_log("particiones.txt");
234 auto_play = false;
235 }
236
237 // Draw
238 //----------------------------------------------------------------------------------
239 BeginDrawing();
240
241 ClearBackground(RAYWHITE);
242
243 // 1. Textos de informacion
244 DrawText("Simulador de Gestion de Memoria", 20, 20, 30, DARKGRAY);
245 DrawText(TextFormat("Instante Actual: %d", reloj_sim), 20, 60, 20, BLACK);
246
247 DrawText("Pulsa ESPACIO para avanzar, P para auto play, R para resetear", 20, 90, 20, DARKGRAY);
248 DrawText("Pulsa ESC para salir", 20, 120, 20, DARKGRAY);
249
250 if (auto_play) DrawText("Auto Play: ON (P para Desactivar)", 20, 150, 20, DARKGREEN);
251 else DrawText("Auto Play: OFF (P para Activar)", 20, 150, 20, RED);
252
253 DrawText(TextFormat("Procesos Cargados: %d", num_procesos), 20, 180, 15, DARKGRAY);
254
255 // 2. Dibujar la barra de memoria
256 // Escala: Pantalla / Memoria -> WIN_WIDTH / MEMORIA_TOTAL
257 float ancho_util = WIN_WIDTH - MARGEN_IZQ - MARGEN_DER;
258 float escala = ancho_util / MEMORIA_TOTAL;
259
260 for (int i = 0; i < m->cant_particiones; i++) {
261 Particion p = m->particiones[i];
262
263 // Coordenadas
264 float x = MARGEN_IZQ + (p.dir_inicio * escala);
265 float ancho = p.tamano * escala;
266
267 // Colores de los bloques
268 Color colorBloque;
269 Color colorHueco = (Color){227, 217, 132, 255};
270
271 // Determinar color segun estado
272 // Si es hueco, colorHueco, si es proceso, color segun indice de color_procesos
273 if (p.estado == 0) {
274 colorBloque = colorHueco;
275 } else {
276 // Buscar indice del proceso por nombre para asignar color
277 int indice_color = 0;
278 for (int j = 0; j < num_procesos; j++) {
279 if (strcmp(procesos[j].nombre, p.nombre_proceso) == 0) {
280 // Si hay mas procesos que colores, reutilizamos por ejemplo, con 6 colores en 15 procesos, el 15 usará el color 3
281 indice_color = j % num_colores;
282 break;
283 }
284 }
285 colorBloque = colores_prcesos[indice_color];
286 }
287
288 // Dibujar el rectangulo
289 DrawRectangle(x, Y_BARRA, ancho, ALTO_BARRA, colorBloque);
290 DrawRectangleLines(x, Y_BARRA, ancho, ALTO_BARRA, Fade(BLACK, 0.5f));
291
292 // Informacion del bloque (si cabe)
293 if (ancho > 40) {
294 DrawText(p.nombre_proceso, x + 5, Y_BARRA + 35, 15, BLACK);
295 DrawText(TextFormat("%d", p.tamano), x + 5, Y_BARRA + 50, 15, DARKGRAY);
296 }
297
298 // Direccion de memoria (arriba del bloque)
299 DrawText(TextFormat("%d", p.dir_inicio), x, Y_BARRA - 15, 15, BLACK);
300 }
301
302 // Marca final (2000)
303 DrawText("2000", MARGEN_IZQ + ancho_util - 30, Y_BARRA - 15, 15, BLACK);
304
305 // Tablas de procesos
306 // -------------------------------------------------------------
307 // 3. DIBUJAR TABLA DE PROCESOS (Debajo de la barra de memoria)
308 // -------------------------------------------------------------
309 int y_inicio_tabla = Y_BARRA + ALTO_BARRA + 40; // Empezamos 40px debajo de la barra
310 int x_columna = 20;
311 int ancho_columna = 120; // Espacio entre columnas
312
313 DrawText("ESTADO DE PROCESOS:", x_columna, y_inicio_tabla - 25, 20, DARKGRAY);
314
315 // Cabecera simple
316 // DrawText("ID Mem Vida Estado", x_columna, y_inicio_tabla, 10, BLACK);
317
318 for (int i = 0; i < num_procesos; i++) {
319 // Solo dibujamos si cabe en pantalla, si hay muchos habría que hacer paginación
320 if (y_inicio_tabla + (i * 20) > WIN_HEIGHT - 20) break;
321
322 // Determinar Color y Estado Texto
323 Color colorEstado = LIGHTGRAY;
324 const char* textoEstado = "FUTURO";
325
326 if (procesos[i].finalizado) {
327 colorEstado = GRAY; // Gris oscuro para acabados
328 textoEstado = "FIN";
329 }
330 else if (procesos[i].en_memoria) {
331 colorEstado = GREEN; // Verde para activos
332 textoEstado = "ACTIVO";
333 }
334 else if (procesos[i].t_llegada <= reloj_sim) {
335 colorEstado = RED; // Rojo para cola de espera
336 textoEstado = "COLA DE ESPERA";
337 }
338 else {
339 colorEstado = LIGHTGRAY; // Gris claro para los que aun no llegan
340 textoEstado = TextFormat("T=%d", procesos[i].t_llegada);
341 }
342
343 // Dibujamos la fila del proceso
344 // Calculamos posición (hacemos varias columnas si hay muchos, opcional)
345 int fila_y = y_inicio_tabla + (i * 20);
346
347 // 1. ID y Tamaño
348 DrawText(TextFormat("%s (%d)", procesos[i].nombre, procesos[i].mem_requerida),
349 x_columna, fila_y, 20, BLACK);
350
351 // 2. Barra de vida (Pequeña barrita visual)
352 if (procesos[i].en_memoria) {
353 // Vida restante vs Total
354 float porcentaje = (float)procesos[i].t_restante / procesos[i].t_ejecucion;
355 DrawRectangle(x_columna + 100, fila_y + 5, 50 * porcentaje, 10, BLUE);
356 DrawRectangleLines(x_columna + 100, fila_y + 5, 50, 10, BLACK);
357 }
358
359 // 3. Estado (Texto coloreado)
360 DrawText(textoEstado, x_columna + 160, fila_y, 20, colorEstado);
361 }
362
363 EndDrawing();
364 //----------------------------------------------------------------------------------
365 }
366
367 // De-Initialization
368 //--------------------------------------------------------------------------------------
369 CloseWindow(); // Close window and OpenGL context
370 //--------------------------------------------------------------------------------------
371}
void limpiar_log(const char *ruta)
Limpia el contenido de un archivo de log.
Definition ficheros.c:94
int cargar_procesos(const char *ruta, Proceso procesos[])
Carga los procesos desde un archivo de texto.
Definition ficheros.c:11
Módulo de entrada/salida para la simulación de memoria.
#define MEMORIA_TOTAL
Tamaño total de la memoria simulada (en unidades).
Definition sim_engine.h:36
#define MAX_PROCESOS
Máximo número de procesos que puede manejar la simulación.
Definition sim_engine.h:45
#define MARGEN_DER
Margen derecho de la interfaz.
Definition main.c:38
void test_sim()
Ejecuta la simulación en modo terminal (TUI).
Definition main.c:95
#define WIN_HEIGHT
Alto de la ventana gráfica en píxeles.
Definition main.c:30
#define WIN_WIDTH
Ancho de la ventana gráfica en píxeles.
Definition main.c:28
#define Y_BARRA
Posición Y de la barra de memoria.
Definition main.c:32
#define ALTO_BARRA
Alto de la barra de memoria.
Definition main.c:34
void run_gui(Memoria *m, Proceso *procesos, int num_procesos)
Ejecuta la interfaz gráfica con Raylib.
Definition main.c:177
int main(int argc, char const *argv[])
Punto de entrada principal del programa.
Definition main.c:57
#define MARGEN_IZQ
Margen izquierdo de la interfaz.
Definition main.c:36
void avanzar_tiempo(Memoria *m, Proceso procesos[], int num_procesos, int *reloj_actual, TipoAlgo algo, const char *ruta_log)
Avanza un tick en la simulación.
Definition sim_engine.c:189
void mostrar_estado(Memoria *m)
Muestra el estado actual de la memoria en consola.
Definition sim_engine.c:23
void inicializar_memoria(Memoria *m)
Inicializa la memoria con un único hueco libre.
Definition sim_engine.c:7
Motor de simulación de gestión de memoria con particiones variables.
TipoAlgo
Algoritmos de asignación de memoria disponibles.
Definition sim_engine.h:102
@ ALGO_SIGUIENTE_HUECO
Definition sim_engine.h:104
Estructura principal que representa la memoria del sistema.
Definition sim_engine.h:90
Particion particiones[MAX_PARTICIONES]
Definition sim_engine.h:91
int cant_particiones
Definition sim_engine.h:92
Estructura que representa una partición de memoria.
Definition sim_engine.h:77
char nombre_proceso[10]
Definition sim_engine.h:81
int dir_inicio
Definition sim_engine.h:78
Estructura que representa un proceso en el simulador.
Definition sim_engine.h:57
int t_ejecucion
Definition sim_engine.h:61