Sistemas Operativos (Operating Systems) — Programa del curso

Docente: Gerson Garrido

1. Descripción

Este curso estudia cómo un sistema operativo (operating system, OS) convierte un hardware limitado y compartido en una plataforma cómoda, segura y eficiente para los programas. Seguimos la estructura del libro Operating Systems: Three Easy Pieces (OSTEP), organizada en tres grandes ideas:

  1. Virtualización (virtualization) — de la CPU y de la memoria.
  2. Concurrencia (concurrency) — hilos (threads), locks, variables de condición, semáforos.
  3. Persistencia (persistence) — dispositivos de E/S (I/O), discos, sistemas de archivos (file systems).

Además, cerramos con sistemas distribuidos (distributed systems), seguridad (security) y máquinas virtuales (virtual machines).

Los términos técnicos se presentan en español con el término en inglés entre paréntesis la primera vez; el glosario los reúne todos. Las lecturas y la documentación de las herramientas están en inglés.

2. Carga horaria

Componente Horas/semana Formato
Teoría 4 h Dos sesiones de 2 h (Sesión A y Sesión B)
Laboratorio 2 h Una sesión práctica guiada

3. Resultados de aprendizaje

Al finalizar el curso, el estudiante será capaz de:

  1. Explicar cómo el OS virtualiza la CPU mediante procesos, ejecución directa limitada (limited direct execution) y planificación (scheduling), y comparar políticas de planificación.
  2. Explicar la traducción de direcciones (address translation), segmentación, paginación (paging), TLB y reemplazo de páginas, y calcular traducciones a mano.
  3. Escribir programas concurrentes correctos en C con pthreads, identificar condiciones de carrera (race conditions) y deadlocks, y elegir la primitiva de sincronización adecuada.
  4. Describir cómo funcionan los discos, RAID, SSDs y los sistemas de archivos, incluyendo la consistencia ante fallos (crash consistency) mediante journaling.
  5. Explicar los principios de sistemas de archivos distribuidos (NFS, AFS) y los mecanismos básicos de seguridad de un OS.
  6. Modificar un kernel real pequeño (xv6-riscv) agregando llamadas al sistema, cambiando su planificador, su manejo de memoria virtual y su sistema de archivos.

4. Bibliografía

Texto principal (gratuito en línea): Remzi H. Arpaci-Dusseau y Andrea C. Arpaci-Dusseau. Operating Systems: Three Easy Pieces. Arpaci-Dusseau Books. https://pages.cs.wisc.edu/~remzi/OSTEP/

El libro se puede leer gratis en línea, pero no se redistribuye: este repositorio enlaza los capítulos, no los copia. Si alguien quiere apoyar a los autores, la página ofrece versiones impresas y en PDF.

Material de apoyo:

5. Calendario

Este es el calendario oficial del curso. Cada semana enlaza a su guía con lecturas, objetivos y actividades de laboratorio. Las sesiones marcadas con ✂️ se pueden comprimir o pasar a lectura autónoma si se pierden clases por feriados.

Sem. Sesión A (2 h) Sesión B (2 h) Laboratorio (2 h) Entregas
1 Presentación del curso · Introducción · Estructura del kernel Procesos Entorno: Docker, C, gdb, make P0 publicado
2 API de procesos (fork/exec/wait) Ejecución directa limitada Código: API de procesos
3 Planificación: FIFO, SJF, STCF, RR MLFQ · Tiempo real (RM, EDF) Simuladores de planificación P0 entrega · P1 publicado
4 Lotería y stride Planificación multiprocesador · Cierre CPU xv6: arranque, gdb, primera syscall
5 Espacios de direcciones · API de memoria Traducción de direcciones · Segmentación xv6: planificador por dentro P2 publicado
6 Gestión de espacio libre Paginación Simuladores de relocalización y segmentación P1 entrega
7 TLB Tablas de páginas avanzadas Simuladores de paginación · medir la TLB
8 Swapping: mecanismos y políticas · VM completa Examen parcial (virtualización) Repaso y mem.c P2 entrega · P3 publicado
9 ✂️ Máquinas virtuales (apéndice) Hilos · API de hilos Simulador x86.py · pthreads
10 Locks Estructuras de datos con locks Locks en x86.py · escalabilidad P3 entrega · P4 publicado
11 Variables de condición Semáforos · Inversión de prioridad Productor/consumidor · lectores/escritores
12 Bugs de concurrencia · Deadlock: banquero y detección · Concurrencia por eventos Dispositivos de E/S · Discos duros Deadlocks · disk.py
13 RAID Archivos y directorios raid.py · API de archivos P4 entrega · P5 publicado
14 Implementación de un FS FFS · Journaling vsfs.py, ffs.py, fsck.py · FS de xv6
15 LFS · SSDs · Integridad de datos Distribuidos: intro, NFS, AFS lfs.py, ssd.py, checksum.py, afs.py
16 Seguridad: intro, autenticación, control de acceso Explotación de software y endurecimiento (✂️ criptografía y seguridad distribuida, de lectura) Laboratorio de permisos y contraseñas P5 entrega
— Examen final en el período de exámenes

Sobre el examen final: el calendario asume que la universidad tiene un período de exámenes después de la semana 16. Si no lo tiene, el final se toma en la Sesión B de la semana 16: la explotación de software se da en versión corta y los temas ✂️ pasan a lectura autónoma.

6. Proyectos

Seis proyectos que combinan programación de sistemas en C (espacio de usuario, de ostep-projects) y modificaciones al kernel xv6-riscv (un proyecto propio del curso y tres laboratorios de MIT 6.1810). El detalle, las reglas de entrega y los criterios de revisión están en projects/README.md.

# Proyecto Tipo Publicado Entrega
P0 Utilidades Unix (wcat, wgrep, wzip, wunzip) C Sem. 1 Sem. 3
P1 Shell (wish) C Sem. 3 Sem. 6
P2 Planificador por lotería en xv6 xv6-riscv Sem. 5 Sem. 8
P3 Tablas de páginas (lab pgtbl del MIT) xv6-riscv Sem. 8 Sem. 10
P4 Compresión paralela (pzip) C + pthreads Sem. 10 Sem. 13
P5 Archivos grandes y enlaces simbólicos (lab fs del MIT) xv6-riscv Sem. 13 Sem. 16
Bono fork con copy-on-write (lab cow del MIT) xv6-riscv Sem. 11 Sem. 16

7. Políticas

  • Trabajo en parejas: P0 es individual. P1–P5 y el bono se pueden hacer en parejas.
  • Integridad académica: se puede discutir ideas, pero el código entregado debe ser propio. Se usarán herramientas de detección de similitud. Copiar soluciones publicadas en internet cuenta como plagio.

Uso de herramientas e IA

Herramienta ¿Se permite en este curso?
Diagnósticos del compilador y sanitizers (gcc -Wall, -fsanitize=address,undefined, Valgrind, Helgrind, gdb) Sí, en todo el trabajo del curso. Leer y entender sus mensajes es parte del curso.
Documentación oficial (páginas man, OSTEP, libro de xv6, documentación del kernel de Linux) y búsquedas en la web Sí. Se cita la fuente cuando se usa una idea o un fragmento de código que no es propio.
Autocompletado del editor que no genera soluciones enteras (nombres, firmas, cierre de llaves) Sí.
Corrector ortográfico, traductores y herramientas de accesibilidad Sí.
Formateadores y linters de código (por ejemplo, clang-format) Sí.
IA generativa para pedir explicaciones de conceptos, sin código generado Sí, para estudiar y entender los temas. La respuesta no se copia en ninguna entrega.
IA generativa que escribe código (asistentes de chat o de editor que completan funciones o programas) No, en ningún proyecto ni laboratorio. Entregar código producido con ella cuenta como plagio.

Quien use una herramienta permitida más allá de la documentación y el compilador (por ejemplo, IA generativa para que le explique un tema) lo declara en el README.md de la entrega: qué herramienta, para qué y qué cambió en su trabajo a partir de eso. En cualquier proyecto o laboratorio se puede pedir a cada estudiante que explique su código de forma oral: cada integrante responde por todo lo que entrega.

8. Entorno de trabajo

Todo el trabajo práctico se hace en Linux. El curso ofrece un contenedor Docker que funciona igual en Linux, Windows (WSL2) y macOS (incluido Apple Silicon). Instrucciones en labs/README.md.