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
ficheros.c
Ir a la documentación de este archivo.
1#include "ficheros.h"
2#include <stdio.h>
3#include <stdlib.h>
4#include <string.h>
5#include<fcntl.h>
6#include <unistd.h>
8
9#define SIZE_BUFFER_LECTURA 4096 // Asumimos que el archivo de entrada no pesa más de 4KB
10
11int cargar_procesos(const char* ruta, Proceso procesos[]) {
12 // 1. Abrir con open(Unix standard)
13 int fd = open(ruta, O_RDONLY);
14 if (fd == -1) {
15 perror("Error abriendo fichero de entrada");
16 return 0;
17 }
18
19 // 2. Leer TODO el archivo a un buffer usando file_utils.h
20 char buffer_archivo[SIZE_BUFFER_LECTURA];
21 memset(buffer_archivo, 0, SIZE_BUFFER_LECTURA); // Limpiamos el buffer para evitar basura
22
23 ssize_t leidos = read_all(fd, buffer_archivo, SIZE_BUFFER_LECTURA - 1);
24 close(fd); // Ya tenemos los datos y por tanto cerramos el descriptor
25 if (leidos == -1) {
26 perror("Error al leer el fichero");
27 return 0;
28 }
29
30 // 3. Parsear el texto (linea por linea)
31 int count = 0;
32 char *linea = strtok(buffer_archivo, "\n"); // Primera linea
33
34 while(linea != NULL && count < MAX_PROCESOS) {
35 char nombre[10];
36 int llegada, mem, ejec;
37 // Formato fuente: <Proceso> <Instante_llegada> <Memoria_requerida> <Tiempo_de_ejecuccion>
38 if (sscanf(linea, "%s %d %d %d", nombre, &llegada, &mem, &ejec) == 4) {
39 // Copiamos al struct Proceso
40 strcpy(procesos[count].nombre, nombre);
41 procesos[count].t_llegada = llegada;
42
43 // Opcion 1: Aplicamos alinear_size para cumplir con la asignacion de 100 en 100
44 // procesos[count].mem_requerida = alinear_size(mem);
45 // Opcion 2: La memoria ya se aliena a la hora de asignar el proceso
46 procesos[count].mem_requerida = mem;
47
48 procesos[count].t_ejecucion = ejec;
49
50 // Inicializacion del estado del proceso
51 procesos[count].t_restante = ejec;
52 procesos[count].en_memoria = false;
53 procesos[count].finalizado = false;
54
55 count++;
56 }
57 // Siguiente linea
58 linea = strtok(NULL, "\n");
59 }
60
61 return count;
62}
63
64void guardar_estado(const char* ruta, Memoria *m, int instante) {
65 // Abrimos el archivo en modo append y CREAT si no existe
66 int fd = open(ruta, O_WRONLY | O_CREAT | O_APPEND, 0644);
67 if (fd == -1) {
68 perror("Error al abrir o crear el archivo");
69 return;
70 }
71
72 char buffer_linea[1024]; // Buffer temporal
73
74 // Formato fuente: <instante_tiempo> <estado_memoria> \n
75 // 1. Escribimos el instante de tiempo
76 int len = sprintf(buffer_linea, "%d", instante);
77 write_all(fd, buffer_linea, len);
78
79 // 2. Recorremos las particiones
80 for (int i = 0; i < m->cant_particiones; i++) {
81 Particion p = m->particiones[i];
82
83 // Formateamos una particion al formato requerido
84 len = sprintf(buffer_linea, "[%d, %s, %d] ", p.dir_inicio, p.nombre_proceso, p.tamano);
85 write_all(fd, buffer_linea, len);
86 }
87
88 // 3. Salto de linea final
89 write_all(fd, "\n", 1);
90
91 close(fd);
92}
93
94void limpiar_log(const char* ruta) {
95 // O_TRUNC borra el contenido al abrir
96 int fd = open(ruta, O_WRONLY | O_CREAT | O_TRUNC, 0644);
97 if (fd != -1) close(fd);
98}
#define SIZE_BUFFER_LECTURA
Definition ficheros.c:9
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
void guardar_estado(const char *ruta, Memoria *m, int instante)
Guarda el estado actual de la memoria en un archivo de log.
Definition ficheros.c:64
Módulo de entrada/salida para la simulación de memoria.
Librería de utilidades para operaciones de E/S con descriptores de fichero.
#define MAX_PROCESOS
Máximo número de procesos que puede manejar la simulación.
Definition sim_engine.h:45
int write_all(int fd, const void *buffer, size_t size)
Escribe todos los bytes del buffer al descriptor de fichero.
Definition file_utils.c:18
ssize_t read_all(int fd, void *buffer, size_t size)
Lee hasta size bytes de un descriptor a un buffer.
Definition file_utils.c:34
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_llegada
Definition sim_engine.h:59
int t_ejecucion
Definition sim_engine.h:61
int t_restante
Definition sim_engine.h:65
bool finalizado
Definition sim_engine.h:67
int mem_requerida
Definition sim_engine.h:60
bool en_memoria
Definition sim_engine.h:66