Este proyecto implementa un sistema operativo distribuido desarrollado en Go como parte del trabajo práctico de la materia Sistemas Operativos. El sistema simula los componentes principales de un SO moderno con una arquitectura distribuida que permite ejecutar los módulos en diferentes máquinas virtuales.
El sistema está compuesto por cuatro módulos principales que se comunican mediante APIs HTTP:
┌─────────┐
│ KERNEL │◄─────────────┐
└────┬────┘ │
│ │
┌────▼────┐ ┌────┴────┐
│ CPU │ │ I/O │
└────┬────┘ └─────────┘
│
┌────▼────┐
│ MEMORIA │
└─────────┘
- Función: Gestión de procesos y planificación
- Características:
- Diagrama de 7 estados (NEW, READY, EXEC, BLOCKED, EXIT, SUSP.READY, SUSP.BLOCKED)
- Planificadores de corto, mediano y largo plazo
- Algoritmos: FIFO, SJF, SRT, PMCP
- PCB con métricas de estado y tiempo
- Función: Ejecución de instrucciones
- Características:
- Soporte para múltiples instancias
- TLB (Translation Lookaside Buffer) con algoritmos FIFO/LRU
- Cache de memoria con algoritmos CLOCK/CLOCK-M
- Manejo de interrupciones
- Función: Gestión de memoria virtual y física
- Características:
- Paginación multinivel
- Sistema de SWAP
- Gestión de marcos y páginas
- Métricas de rendimiento
- Función: Simulación de dispositivos de entrada/salida
- Características:
- Dispositivos configurables (DISCO, etc.)
- Operaciones asíncronas
- Múltiples instancias simultáneas
├── bin/ # Ejecutables compilados
├── cmd/ # Código fuente de módulos
│ ├── cpu/ # Módulo CPU
│ ├── io/ # Módulo I/O
│ ├── kernel/ # Módulo Kernel
│ └── memoria/ # Módulo Memoria
├── configs/ # Archivos de configuración
├── scripts/ # Scripts de pseudocódigo
├── swap/ # Archivos de intercambio
└── utils/ # Utilidades compartidas
# Clonar el repositorio
git clone --depth 1 --branch main https://github.com/GonzaloPontnau/SISTEMA-OPERATIVO.go.git.git
cd tp-2025-1c-LosCuervosXeneizes
# Compilar todos los módulos
go build -o ./bin/memoria ./cmd/memoria
go build -o ./bin/kernel ./cmd/kernel
go build -o ./bin/cpu ./cmd/cpu
go build -o ./bin/io ./cmd/ioPara ejecutar en múltiples máquinas, actualizar las IPs en los archivos de configuración:
# Cambiar IPs según la configuración de red
sed -i 's/"IP_CPU": *"127\.0\.0\.1"/"IP_CPU": "192.168.0.127"/g' configs/*.json
sed -i 's/"IP_MEMORIA": *"127\.0\.0\.1"/"IP_MEMORIA": "192.168.0.190"/g' configs/*.json
sed -i 's/"IP_KERNEL": *"127\.0\.0\.1"/"IP_KERNEL": "192.168.0.107"/g' configs/*.json
sed -i 's/"IP_IO": *"127\.0\.0\.1"/"IP_IO": "192.168.0.107"/g' configs/*.jsonEl orden de inicio es importante debido a las dependencias:
- Memoria (debe iniciarse primero)
./bin/memoria configs/memoria-config-EstabilidadGeneral.json- I/O (dispositivos necesarios)
./bin/io DISCO configs/io1-config-EstabilidadGeneral.json- CPU (una o más instancias)
./bin/cpu CPU1 configs/cpu1-config-EstabilidadGeneral.json
./bin/cpu CPU2 configs/cpu2-config-EstabilidadGeneral.json- Kernel (con proceso inicial)
./bin/kernel configs/kernel-config-EstabilidadGeneral.json scripts/ESTABILIDAD_GENERAL 0Evalúa algoritmos FIFO, SJF y SRT con múltiples CPUs:
# Terminal 1: Memoria
./bin/memoria configs/memoria-config-PlaniCorto.json
# Terminal 2: I/O
./bin/io DISCO1 configs/io1-config-PlaniCorto.json
# Terminal 3-4: CPUs
./bin/cpu CPU1 configs/cpu1-config-PlaniCorto.json
./bin/cpu CPU2 configs/cpu2-config-PlaniCorto.json
# Terminal 5: Kernel con FIFO
./bin/kernel configs/kernel-config-PlaniCortoFIFO.json scripts/PLANI_CORTO_PLAZO 0Evalúa algoritmos de admisión FIFO y PMCP:
# Configuración similar pero con configs específicos
./bin/kernel configs/kernel-config-PlaniMedianoLargoFIFO.json scripts/PLANI_LYM_PLAZO 0Evalúa el sistema de memoria virtual:
./bin/memoria configs/memoria-config-MemoriaSWAP.json
./bin/kernel configs/kernel-config-MemoriaSWAP.json scripts/MEMORIA_IO 90Evalúa algoritmos de reemplazo de TLB (FIFO/LRU):
./bin/cpu CPU1 configs/cpu1-config-TLB.json # FIFO
./bin/cpu CPU1 configs/cpu2-config-TLB.json # LRUEvalúa algoritmos de cache (CLOCK/CLOCK-M):
./bin/cpu CPU1 configs/cpu1-config-MemoriaCache.json # CLOCK
./bin/cpu CPU1 configs/cpu2-config-MemoriaCache.json # CLOCK-MALGORITMO_CORTO_PLAZO: FIFO, SJF, SRTALGORITMO_INGRESO_A_READY: FIFO, PMCPGRADO_MULTIPROGRAMACION: Número máximo de procesos en memoriaALFA: Factor de suavizado para SJF/SRTESTIMACION_INICIAL: Estimación inicial para algoritmos predictivos
ENTRADAS_TLB: Número de entradas en TLBREEMPLAZO_TLB: FIFO o LRUENTRADAS_CACHE: Número de entradas en cacheREEMPLAZO_CACHE: CLOCK o CLOCK-M
TAM_MEMORIA: Tamaño total de memoria físicaTAM_PAGINA: Tamaño de cada páginaENTRADAS_POR_TABLA: Entradas por tabla de páginasCANTIDAD_NIVELES: Niveles de paginación
El sistema genera logs detallados con nivel configurable:
- INFO: Información general del sistema
- DEBUG: Información detallada para debugging
- ERROR: Errores del sistema
Al finalizar cada proceso se muestran:
- Conteo de transiciones entre estados
- Tiempo total en cada estado
- Tiempo de espera promedio
- Error de conexión: Verificar que las IPs y puertos sean correctos
- Módulo no responde: Verificar el orden de inicio (Memoria → I/O → CPU → Kernel)
- Falta de memoria: Ajustar
GRADO_MULTIPROGRAMACIONoTAM_MEMORIA
Cambiar LOG_LEVEL a DEBUG en los archivos de configuración para obtener información detallada.
Note
Este proyecto es desarrollado con fines académicos como parte del trabajo práctico de Sistemas Operativos para la UTN.