Nota de estudio: Este tema es la base conceptual de toda la asignatura. Dominar estos conceptos permite responder correctamente preguntas como la 1 (comandos Linux), la 9 (permisos NTFS), y entender los fundamentos de seguridad, redes y almacenamiento que aparecen en el resto del examen.
Un sistema operativo (SO) es el conjunto de programas que gestiona los recursos hardware de un ordenador y proporciona servicios comunes a los programas de aplicación. Es el intermediario entre el hardware físico y el software que ejecutan los usuarios.
Tiene tres roles simultáneos e inseparables:
Gestor de recursos: controla y distribuye de forma eficiente la CPU, la memoria RAM, el almacenamiento y los dispositivos de E/S entre todos los procesos que compiten por ellos, evitando conflictos.
Máquina extendida (o máquina virtual): oculta la complejidad del hardware real y ofrece a los programadores una interfaz abstracta, uniforme y más sencilla de usar. Un programa no necesita saber si el disco es NVMe, SATA o una unidad en red; el SO presenta una misma interfaz de ficheros.
Árbitro: resuelve conflictos entre procesos que quieren acceder al mismo recurso, garantizando aislamiento, seguridad y equidad.
Analogía: El SO es como el director de un aeropuerto: los aviones (aplicaciones) no se comunican directamente con las pistas, el combustible o el control de tráfico (hardware); el director (SO) coordina todo para que cada avión despegue y aterrice sin colisiones.
Un proceso es un programa en ejecución. No es lo mismo que el programa (fichero en disco, estático); el proceso es ese programa cargado en memoria con su estado de ejecución, sus variables, su contador de programa y sus recursos asignados.
Componentes de un proceso:
- Código (text segment): instrucciones del programa.
- Datos (data segment): variables globales y estáticas.
- Heap: memoria dinámica asignada en tiempo de ejecución (malloc, new).
- Stack (pila): variables locales, parámetros de funciones y direcciones de retorno.
- PCB (Process Control Block): estructura de datos del SO que almacena toda la información del proceso (PID, estado, registros de CPU, prioridad, recursos asignados...).
Un proceso pasa por los siguientes estados a lo largo de su vida:
admitido
[ NUEVO ] ─────────────────► [ LISTO ] ◄──────────── interrupción
│ │
despachado │
│ │
▼ │
[ EJECUTANDO ] ────────────────┘
│
┌───────────────┴──────────────┐
E/S o evento termina
│ │
▼ ▼
[ BLOQUEADO ] [ TERMINADO ]
│
E/S o evento completado
│
└──────────────► [ LISTO ]
| Estado | Descripción |
|---|---|
| Nuevo | El proceso acaba de ser creado pero aún no está listo para ejecutar |
| Listo | El proceso espera a que la CPU quede libre para asignársela |
| Ejecutando | El proceso está usando la CPU activamente |
| Bloqueado | El proceso espera un evento externo (E/S, señal, temporizador) |
| Terminado | El proceso ha finalizado; el SO libera sus recursos |
Ejemplo práctico: Cuando abres un navegador web (nuevo → listo → ejecutando), haces clic en un enlace y el navegador espera la respuesta del servidor (ejecutando → bloqueado), cuando llega la respuesta (bloqueado → listo → ejecutando) y cuando cierras el navegador (ejecutando → terminado).
Un hilo (thread o proceso ligero) es la unidad mínima de ejecución dentro de un proceso. Un proceso puede contener múltiples hilos que comparten el mismo espacio de memoria (heap, código, datos globales) pero cada uno tiene su propio stack y sus propios registros de CPU.
| Proceso | Hilo | |
|---|---|---|
| Espacio de memoria | Propio e independiente | Compartido con el proceso padre |
| Recursos | Propios (ficheros, sockets...) | Compartidos con el proceso |
| Creación | Costosa (requiere copiar espacio de memoria) | Barata (solo se crea un stack) |
| Comunicación | Mediante IPC (costoso) | Directamente mediante memoria compartida |
| Aislamiento | Alto: un proceso no afecta a otro | Bajo: un hilo que falla puede tumbar el proceso |
Modelos de hilos:
Modelo 1:1 (un hilo de usuario por un hilo de kernel): usado en Linux y Windows. Cada hilo de usuario tiene un hilo de kernel correspondiente. El SO gestiona directamente cada hilo, lo que permite aprovechar múltiples núcleos. Ejemplo: pthreads en Linux.
Modelo N:1 (muchos hilos de usuario por un hilo de kernel): todos los hilos de usuario se mapean a un único hilo de kernel. Ventaja: gestión muy rápida. Inconveniente: si un hilo se bloquea en E/S, se bloquean todos. No aprovecha múltiples núcleos.
Modelo N:M (hilos de usuario por M hilos de kernel): híbrido. El sistema puede mapear varios hilos de usuario a varios hilos de kernel. El más flexible pero el más complejo de implementar.
La planificación decide qué proceso usa la CPU en cada instante. Es una de las funciones más críticas del SO porque impacta directamente en el rendimiento percibido.
Ejemplo:
| Proceso | Llegada | Ráfaga CPU |
|---|---|---|
| P1 | 0 | 24 ms |
| P2 | 1 | 3 ms |
| P3 | 2 | 3 ms |
Con FCFS: P1 ejecuta de t=0 a t=24, P2 de t=24 a t=27, P3 de t=27 a t=30.
- Tiempo de espera: P1=0, P2=23, P3=25. Media = 16 ms. (muy alto por el efecto convoy)
Ejemplo con quantum = 4 ms:
| Proceso | Llegada | Ráfaga |
|---|---|---|
| P1 | 0 | 10 ms |
| P2 | 0 | 4 ms |
| P3 | 0 | 5 ms |
Orden: P1(4ms) → P2(4ms) → P3(4ms) → P1(4ms) → P3(1ms) → P1(2ms)
Todos los procesos avanzan equitativamente.
Los procesos necesitan a veces comunicarse o sincronizarse. El SO proporciona mecanismos de IPC (Inter-Process Communication):
| Mecanismo | Descripción | Uso típico |
|---|---|---|
| Pipes (tuberías) | Canal unidireccional entre procesos. El SO crea un buffer en kernel. | ls \| grep .txt en bash |
| Colas de mensajes | Los procesos envían y reciben mensajes discretos a través de una cola gestionada por el kernel | Comunicación entre servicios |
| Memoria compartida | El SO mapea la misma región de RAM en el espacio de dos procesos. El más rápido, pero requiere sincronización | Bases de datos, procesamiento paralelo |
| Semáforos | Variables de control que permiten sincronizar acceso a recursos compartidos | Control de acceso a secciones críticas |
| Sockets | Canal de comunicación bidireccional, puede ser local (Unix socket) o en red (TCP/IP) | Comunicación cliente-servidor |
| Señales | Notificaciones asíncronas enviadas a un proceso | kill -9 PID en Linux envía la señal SIGKILL |
Relevancia para el examen: El comando
killde Linux envía señales a procesos.kill -9 PIDenvía SIGKILL (terminación forzosa);kill -15 PIDenvía SIGTERM (petición de terminación elegante).
Cuando múltiples procesos o hilos comparten datos, pueden surgir problemas graves.
Ocurre cuando el resultado de una operación depende del orden de ejecución de los procesos, y ese orden no está controlado.
Ejemplo: Dos procesos leen una variable saldo=100, ambos suman 50, ambos escriben. El resultado debería ser 200, pero como ambos leyeron 100 y sumaron sobre ese valor, ambos escriben 150. Se pierde una actualización.
Fragmento de código que accede a datos compartidos y que solo puede ejecutar un proceso a la vez. Para protegerla se necesitan tres condiciones:
Situación en que dos o más procesos esperan indefinidamente un recurso que sostiene el otro, por lo que ninguno puede avanzar.
Condiciones de Coffman (se deben cumplir las cuatro simultáneamente para que ocurra un deadlock):
Estrategias frente al deadlock:
Un proceso espera indefinidamente porque siempre hay otros de mayor prioridad que se adelantan. No es un bloqueo pero el proceso nunca progresa. Solución: envejecimiento (aging).
El gestor de memoria del SO tiene que conseguir simultáneamente:
- Relocalización: un proceso puede ejecutarse en cualquier parte de la RAM sin importar en qué dirección fue compilado.
- Protección: un proceso no puede acceder a la memoria de otro.
- Compartición: a veces se quiere que dos procesos compartan código (librerías compartidas) sin duplicarlo.
- Organización lógica: los programas se organizan en módulos; la memoria debe soportar esta estructura.
La memoria no es un bloque homogéneo. Existe una jerarquía ordenada por velocidad y coste:
Más rápido, más caro, menos capacidad
┌──────────────┐
│ Registros │ ~1 ns ~KB
├──────────────┤
│ Caché L1/L2 │ ~5 ns ~MB
├──────────────┤
│ RAM (DRAM) │ ~100 ns ~GB
├──────────────┤
│ Disco │ ~10 ms ~TB
└──────────────┘
Más lento, más barato, más capacidad
La memoria virtual es la ilusión creada por el SO de que cada proceso tiene acceso a una cantidad de memoria mucho mayor que la RAM física disponible. Los procesos trabajan con direcciones virtuales que el hardware (MMU) traduce a direcciones físicas.
Ventajas:
- Cada proceso cree tener para sí toda la memoria del sistema.
- Los procesos están protegidos entre sí.
- Se pueden ejecutar procesos más grandes que la RAM física.
La memoria se divide en bloques de tamaño fijo llamados páginas (en el espacio del proceso) y marcos de página (en la RAM física). El tamaño típico es 4 KB.
El SO mantiene una tabla de páginas por proceso que mapea cada página virtual a su marco físico:
Dirección virtual: [ número de página | desplazamiento ]
│
tabla de páginas
│
▼
Dirección física: [ número de marco | desplazamiento ]
La MMU (Memory Management Unit) es el componente hardware que realiza esta traducción en cada acceso a memoria.
El TLB (Translation Lookaside Buffer) es una caché hardware muy rápida de las traducciones más recientes de la tabla de páginas. Si la dirección buscada está en el TLB (TLB hit), la traducción es instantánea. Si no (TLB miss), hay que consultar la tabla de páginas en RAM, lo que es más lento.
Si la página a la que accede el proceso no está en RAM (está en disco, en el área de intercambio o swap), se produce un fallo de página. El SO:
Este mecanismo permite que procesos más grandes que la RAM puedan ejecutarse, pero si hay demasiados fallos de página el sistema se ralentiza enormemente (thrashing: el SO pasa más tiempo gestionando páginas que ejecutando código).
Cuando no hay marcos libres y hay que cargar una página, el SO debe elegir qué página expulsar:
| Algoritmo | Descripción | Problema |
|---|---|---|
| FIFO | Se expulsa la página que lleva más tiempo en memoria | Anomalía de Belady: más marcos puede dar más fallos |
| LRU (Least Recently Used) | Se expulsa la página menos recientemente usada | Costoso de implementar con precisión |
| LFU (Least Frequently Used) | Se expulsa la página usada con menos frecuencia | Puede retener páginas antiguas muy usadas en el pasado |
| Clock (Segunda Oportunidad) | Aproximación eficiente de LRU. Cada página tiene un bit de referencia; se recorre circular y se expulsa la primera con bit=0 | El más usado en la práctica |
Alternativa a la paginación donde la memoria se divide en segmentos de tamaño variable con significado lógico (segmento de código, de datos, de pila). Las direcciones virtuales tienen la forma [segmento:desplazamiento].
Diferencia clave con paginación:
- Paginación: bloques de tamaño fijo, transparente al programador, eficiente.
- Segmentación: bloques de tamaño variable, visible al programador, permite protección por segmento.
Los procesadores x86 modernos combinan ambos (segmentación + paginación), aunque en la práctica los SO modernos usan paginación plana (segmentos que cubren todo el espacio de direcciones).
El SO puede mover un proceso completo desde RAM al disco para liberar espacio, y traerlo de vuelta cuando sea necesario. Diferente del paging (que trabaja con páginas individuales); el swapping trabaja con procesos completos. Es muy lento y solo se usa en situaciones de emergencia de memoria.
Un driver es software específico para un dispositivo hardware que traduce las llamadas genéricas del SO (read, write, open...) a los comandos específicos del hardware. Corre en modo kernel.
El SO presenta a las aplicaciones una interfaz uniforme (las mismas llamadas al sistema para cualquier dispositivo), mientras que cada driver implementa internamente esa interfaz de forma específica para su hardware.
La CPU espera activamente a que el dispositivo termine (comprueba repetidamente un registro de estado). Muy ineficiente: la CPU no puede hacer otra cosa mientras espera. Solo aceptable para dispositivos muy rápidos.
El proceso que pide la E/S se bloquea. Cuando el dispositivo termina, genera una interrupción hardware que fuerza al procesador a ejecutar una rutina de servicio de interrupción (ISR). La ISR desbloquea el proceso. La CPU queda libre para ejecutar otros procesos mientras tanto. Eficiente para la mayoría de los casos.
Para transferencias grandes de datos (lectura de un fichero grande del disco), hacer que la CPU transfiera byte a byte es ineficiente incluso con interrupciones.
El controlador DMA es hardware especializado que puede transferir bloques de datos directamente entre el dispositivo y la RAM sin intervención de la CPU. La CPU solo inicia la transferencia y recibe una interrupción al final.
Sin DMA: Disco → CPU → RAM (la CPU trabaja todo el tiempo)
Con DMA: Disco → DMA → RAM (la CPU solo interviene al inicio y al final)
Buffering: almacén temporal en RAM para suavizar diferencias de velocidad entre el SO y los dispositivos. Ejemplo: al leer un fichero, el SO lee un bloque mayor del necesario y lo guarda en buffer; las siguientes lecturas pueden servirse del buffer sin ir a disco.
Spooling (Simultaneous Peripheral Operations Online): técnica donde los trabajos destinados a un dispositivo lento (como una impresora) se almacenan en disco. El SO los va enviando a la impresora de uno en uno en segundo plano. Permite que varios usuarios "impriman" a la vez sin bloquearse.
Caching de E/S: copias en RAM de datos recientemente accedidos del disco (page cache en Linux). Si el mismo dato se vuelve a pedir, se sirve desde la caché sin acceder al disco.
/.| Sistema | SO | Características clave |
|---|---|---|
| FAT32 | Windows antiguo, memorias USB | Sin permisos, tamaño máximo de fichero 4 GB, compatible universalmente |
| exFAT | Windows, memorias grandes | FAT32 sin el límite de 4 GB; sin permisos |
| NTFS | Windows moderno | Journaling, permisos ACL, cifrado (EFS), compresión, ficheros grandes, streams alternativos |
| ext4 | Linux | Journaling, inodos, extents, soporte hasta 1 EB de volumen |
| XFS | Linux (Red Hat) | Alto rendimiento con ficheros grandes, journaling |
| Btrfs | Linux | Copy-on-write, snapshots, RAID integrado, checksums de datos |
| ZFS | Solaris, FreeBSD, Linux | Integridad total con checksums, RAID-Z, desduplicación, snapshots |
| APFS | macOS, iOS | Copy-on-write, snapshots, cifrado nativo, optimizado para SSD |
El journaling (registro en diario) protege la integridad del sistema de archivos ante fallos inesperados (corte de luz, cuelgue del sistema). Antes de escribir los datos definitivamente, el SO registra la operación pendiente en un área especial (el journal). Si el sistema falla a mitad de la escritura, al reiniciar el SO puede revisar el journal y completar o deshacer la operación incompleta.
Sin journaling (FAT32): un apagado brusco puede dejar el sistema de archivos corrupto e inconsistente.
Con journaling (NTFS, ext4): la recuperación es mucho más rápida y fiable.
En Linux, cada archivo tiene tres conjuntos de permisos:
-rwxr-xr-- 1 usuario grupo 1234 Jun 9 2025 fichero.txt
│└──┴──┴──┘
│ │ │ └── Otros (others): r-- = solo lectura
│ │ └───── Grupo (group): r-x = lectura y ejecución
│ └──────── Propietario (owner): rwx = lectura, escritura, ejecución
└─────────── Tipo: - fichero regular, d directorio, l enlace simbólico
El comando chmod modifica estos permisos. Se puede usar notación simbólica o numérica (octal):
chmod 755 fichero # rwxr-xr-x
chmod u+x fichero # añade ejecución al propietario
chmod go-w fichero # quita escritura a grupo y otros
Relevancia para el examen:
chmodes exactamente la pregunta 1.d del examen de la Politécnica.
Proceso de verificar la identidad de un usuario o proceso. Métodos:
La autenticación multifactor (MFA) combina dos o más de estos factores, como explora la pregunta 2 del examen.
Una vez autenticado, la autorización determina qué puede hacer el usuario. Se implementa mediante:
Registro de eventos relevantes de seguridad: accesos, modificaciones de ficheros, cambios de configuración. Fundamental para la detección de intrusiones y la investigación forense.
Relevancia para el examen: El comando
sudo(pregunta 1.b) es el mecanismo de Linux para ejecutar comandos con privilegios de superusuario de forma controlada y auditada. Cada uso desudoqueda registrado en/var/log/auth.log.
El procesador opera en dos modos distintos:
Modo usuario (user mode): nivel de privilegios restringido. Las aplicaciones no pueden acceder directamente al hardware ni a la memoria de otros procesos. Un fallo en este modo solo afecta al proceso que lo causó.
Modo kernel (kernel mode / supervisor mode): nivel de privilegios máximo. El SO puede ejecutar cualquier instrucción y acceder a cualquier dirección de memoria. Un fallo en este modo puede tumbar todo el sistema (pantalla azul en Windows, kernel panic en Linux).
Las llamadas al sistema son la interfaz entre las aplicaciones (modo usuario) y el kernel (modo kernel). Cuando una aplicación necesita un servicio del kernel (leer un fichero, crear un proceso, abrir un socket...), realiza una system call.
Mecanismo:
Aplicación (modo usuario)
│
│ 1. La aplicación invoca la system call con sus parámetros
│ (p.ej. read(fd, buffer, size))
▼
Instrucción TRAP (syscall / int 0x80)
│ 2. El procesador cambia a modo kernel y salta al manejador de syscalls
▼
Kernel del SO (modo kernel)
│
│ 3. El kernel verifica los parámetros y ejecuta la operación solicitada
│ (lee del disco, comprueba permisos, etc.)
▼
Retorno al modo usuario
│ 4. El kernel devuelve el resultado y el procesador vuelve a modo usuario
▼
Aplicación (modo usuario) — continúa con el resultado
Tipos de llamadas al sistema:
| Tipo | Ejemplos |
|---|---|
| Gestión de procesos | fork() (crea proceso), exec() (ejecuta programa), exit() (termina), wait() (espera hijo) |
| Gestión de memoria | mmap() (mapea memoria), brk() (ajusta heap), munmap() |
| Gestión de ficheros | open(), read(), write(), close(), stat(), chmod() |
| Gestión de dispositivos | ioctl() (control de dispositivo), read()/write() sobre devices |
| Comunicación | socket(), bind(), connect(), send(), recv(), pipe() |
| Gestión del sistema | getpid(), getuid(), uname(), reboot() |
Los comandos Linux
touch,pwd,chmodykillde la pregunta 1 del examen son programas de usuario que internamente realizan estas llamadas al sistema.
Todo el código del SO (gestión de procesos, memoria, sistemas de archivos, drivers, redes) reside en un único bloque que ejecuta completamente en modo kernel.
┌─────────────────────────────────────────────┐
│ KERNEL MONOLÍTICO │
│ Procesos | Memoria | FS | Drivers | Redes │
└─────────────────────────────────────────────┘
Hardware
El kernel solo incluye las funciones más esenciales: gestión básica de memoria (espacio de direcciones) y comunicación entre procesos (IPC). Todo lo demás (drivers, sistema de archivos, pila de red) corre en modo usuario como procesos servidores.
┌──────────────────────────────────────────┐ Modo usuario
│ Servidor FS | Servidor Red | Drivers │
└──────────────────────────────────────────┘
┌──────────────────────────────────────────┐ Modo kernel
│ Micro-kernel: IPC + memoria básica │
└──────────────────────────────────────────┘
Hardware
Combina el núcleo pequeño del microkernel con algunos servicios en modo kernel por rendimiento. En la práctica, la mayoría de los SO modernos son híbridos.
Arquitectura experimental donde el kernel apenas abstrae el hardware: lo expone directamente a las aplicaciones con controles de seguridad mínimos. Las aplicaciones gestionan directamente sus propios recursos. Máximo rendimiento teórico pero enorme complejidad para el programador. Principalmente en investigación.
Interfaz de texto donde el usuario introduce comandos. El componente que interpreta estos comandos se llama shell.
Ventajas del CLI:
- Mucho más potente para administración: scripts, automatización, acceso remoto (SSH).
- Menor consumo de recursos.
- Precisión y reproducibilidad (un script hace exactamente lo mismo siempre).
Inconvenientes:
- Curva de aprendizaje pronunciada.
- No intuitivo para usuarios no técnicos.
Interfaz gráfica con ventanas, iconos y ratón. Más accesible para el usuario general.
Ventajas del GUI:
- Intuitivo y accesible.
- Adecuado para tareas creativas (edición de imágenes, video...).
Inconvenientes:
- Mayor consumo de recursos.
- Menos eficiente para administración masiva.
- Difícil de automatizar.
El shell es el intérprete de comandos que lee las instrucciones del usuario, las analiza y las ejecuta llamando a los programas correspondientes mediante system calls.
| Shell | Descripción |
|---|---|
| sh (Bourne Shell) | El shell original de Unix. Base de todos los demás. |
| bash (Bourne Again Shell) | El más extendido en Linux. Compatible con sh, con mejoras (historial, autocompletado, arrays). Es el shell por defecto en la mayoría de distribuciones Linux. |
| zsh | Moderno, muy configurable. Autocompletado avanzado. Default en macOS desde Catalina. |
| ksh (Korn Shell) | Popular en entornos Unix comerciales (Solaris, AIX). |
| fish | Shell con sintaxis moderna y autocompletado inteligente. No compatible con bash. |
| Shell | Descripción |
|---|---|
| CMD (Command Prompt) | Heredero del MS-DOS. Comandos básicos (dir, copy, del...). Limitado para administración moderna. |
| PowerShell | Shell moderno orientado a objetos. Los comandos (cmdlets) devuelven objetos .NET, no texto. Multiplataforma (también en Linux/macOS). Herramienta de administración estándar en entornos Windows/Azure. |
Tal y como aparece en la pregunta 1 del examen de la Politécnica, estos son sus significados:
| Comando | Función |
|---|---|
pwd |
(Print Working Directory) Muestra la ruta absoluta del directorio de trabajo actual. Internamente realiza la syscall getcwd(). |
sudo |
(Substitute User Do) Ejecuta un comando con los privilegios de otro usuario, normalmente root. El usuario debe estar en el fichero /etc/sudoers. Cada uso queda registrado en el log de auditoría. El mecanismo usa el bit SUID del ejecutable /usr/bin/sudo. |
touch |
Actualiza la marca de tiempo de acceso y modificación de un fichero. Si el fichero no existe, lo crea vacío. Utiliza las syscalls utimes() o open(). |
chmod |
(Change Mode) Modifica los permisos de acceso de ficheros y directorios. Usa la syscall chmod(). Ejemplo: chmod 755 script.sh → rwxr-xr-x. |
kill |
Envía una señal a un proceso identificado por su PID. Por defecto envía SIGTERM (señal 15, terminación elegante). Con -9 envía SIGKILL (terminación forzosa e inmediata). Ejemplo: kill -9 1234. |
Cuando enciendes un ordenador, antes de que el SO arranque, hay un firmware que inicializa el hardware.
BIOS (Basic Input/Output System):
- Firmware tradicional, existe desde los años 80.
- Almacenado en un chip ROM de la placa base.
- Limitado a discos de hasta 2 TB (usa tablas de partición MBR con direcciones de 32 bits).
- Solo puede arrancar desde el primer sector del disco (MBR, 512 bytes).
- Sin interfaz gráfica, solo texto.
UEFI (Unified Extensible Firmware Interface):
- Sucesor moderno de BIOS, estándar desde ~2010.
- Soporte para discos mayores de 2 TB (usa GPT, tabla de particiones GUID con 64 bits).
- Interfaz gráfica, soporte para ratón.
- Secure Boot: verifica criptográficamente la firma digital del bootloader antes de ejecutarlo, impidiendo la ejecución de malware en el arranque (bootkits).
- Arranque más rápido.
| MBR | GPT | |
|---|---|---|
| Máximo disco | 2 TB | 9.4 ZB (prácticamente ilimitado) |
| Particiones primarias | 4 | 128 (en Windows) |
| Redundancia | Sin backup | La tabla se replica al final del disco |
| Compatibilidad | Universal (incluso BIOS) | Requiere UEFI (o BIOS con soporte especial) |
| Integridad | Sin verificación | CRC32 en cada entrada |
1. [ENCENDIDO] La CPU empieza a ejecutar desde la dirección del firmware (BIOS/UEFI)
2. [POST] Power-On Self Test: el firmware verifica la RAM, CPU, dispositivos...
3. [LOCALIZA EL BOOTLOADER]
- BIOS: lee el primer sector del disco (MBR) donde está el código de arranque
- UEFI: busca en la partición EFI (ESP) el bootloader registrado
4. [BOOTLOADER] (GRUB en Linux, Windows Boot Manager en Windows)
- Presenta menú de arranque si hay varios SO
- Carga el kernel del SO en memoria y lo ejecuta
5. [KERNEL]
- Inicializa los subsistemas internos (memoria, procesos, drivers)
- Monta el sistema de archivos raíz
- Lanza el primer proceso de usuario
6. [INIT / SYSTEMD] (Linux) o [Session Manager] (Windows)
- Lanza todos los servicios y daemons del sistema
- Presenta la pantalla de login
7. [LOGIN] El usuario se autentica y accede al escritorio o shell
Los primeros ordenadores (ENIAC, UNIVAC) se programaban directamente en hardware mediante conexión de cables (plugboards) o tarjetas perforadas. No existía el concepto de SO. Cada programa tenía control absoluto del hardware. Un solo trabajo a la vez. Enormes y carísimos.
Aparecen los transistores y los primeros ordenadores comerciales (IBM 701, 1401). Los trabajos (jobs) se agrupan en lotes de tarjetas perforadas y se procesan secuencialmente. Surge el monitor residente: un pequeño programa que carga automáticamente el siguiente trabajo cuando el anterior termina. Es el precursor del SO. Problema: la CPU queda ociosa mientras el lector de tarjetas o la impresora trabajan.
IBM lanza el System/360 (1964): la primera familia de ordenadores con una arquitectura unificada. El SO OS/360 introduce la multiprogramación: varios trabajos residen en memoria, y cuando uno espera E/S, la CPU ejecuta otro. Aprovechamiento radical de la CPU.
El tiempo compartido (time-sharing) lleva esto más lejos: múltiples usuarios conectados por terminales (teletipo) usan el mismo ordenador de forma interactiva, con la ilusión de que cada uno tiene el ordenador para sí. El SO de referencia de esta era es MULTICS (1969), y de él nace UNIX ese mismo año, creado por Ken Thompson y Dennis Ritchie en los laboratorios Bell de AT&T. UNIX sentará las bases de todos los SO modernos.
Los microprocesadores hacen los ordenadores accesibles para particulares. Apple presenta el Apple II (1977) y el Macintosh (1984), con interfaz gráfica revolucionaria. Microsoft lanza MS-DOS (1981) para el IBM PC, un SO simple de línea de comandos.
En 1991 Linus Torvalds publica el kernel Linux, que junto con las herramientas GNU de Richard Stallman forma el primer SO libre y de código abierto completo. Windows NT (1993) introduce una arquitectura moderna de 32 bits con kernel híbrido, que es la base de todos los Windows actuales.
Los SO se rediseñan para la era en red. Windows Server, distribuciones Linux para servidores (Red Hat, Debian). La virtualización con VMware (1998) y luego KVM y Hyper-V revolucionan los centros de datos. Android (2008, basado en Linux) e iOS (2007, basado en Darwin/BSD) crean el ecosistema móvil. Docker (2013) y Kubernetes (2014) transforman el despliegue de aplicaciones. El SO se convierte en infraestructura efímera y automatizable.
Diseñados para ejecutar una gran variedad de aplicaciones. Optimizan el throughput medio y la experiencia interactiva. Ejemplos: Windows 11, Ubuntu Linux, macOS.
Hard real-time: las respuestas deben producirse dentro de plazos estrictos e inviolables. Un fallo en el plazo es un fallo del sistema. Ejemplos de uso: sistemas de control de aviones, centralitas nucleares, frenos ABS, marcapasos.
Soft real-time: se prefiere respetar los plazos pero ocasionalmente superarlos no es catastrófico. Ejemplos: streaming de vídeo, videoconferencia, sistemas de audio.
Características de un RTOS: planificador determinista, latencias predecibles, sin paginación (podría causar fallos de página impredecibles), sin garbage collection.
Ejemplos: FreeRTOS, VxWorks, QNX, Zephyr.
Diseñados para dispositivos con recursos muy limitados (microcontroladores, electrodomésticos, impresoras). Muy ligeros, a menudo sin interfaz de usuario. Pueden ser RTOS o no. Ejemplos: Linux embebido (OpenWRT en routers), RTOS FreeRTOS.
El SO gestiona un conjunto de máquinas interconectadas como si fueran un único sistema. El usuario no sabe en qué máquina se ejecuta su proceso. Transparencia total. Ejemplos históricos: Plan 9, Amoeba. En la práctica moderna: los clústeres de Kubernetes son una forma de computación distribuida, aunque el SO subyacente sigue siendo Linux en cada nodo.
Creado en 1969 por Ken Thompson y Dennis Ritchie en los Bell Labs de AT&T. Escrito en C (lenguaje creado por los mismos autores), lo que le dio portabilidad entre arquitecturas hardware: algo revolucionario para la época.
Filosofía UNIX:
- Cada programa hace una sola cosa y la hace bien.
- Los programas se pueden encadenar mediante tuberías (pipes): la salida de uno es la entrada del siguiente (ls -l | grep .txt | wc -l).
- Todo es un fichero (dispositivos, procesos en /proc, sockets...).
- Preferencia por interfaces de texto.
Kernel creado por Linus Torvalds en 1991, publicado bajo licencia GPL (software libre). Combinado con las herramientas GNU de Richard Stallman, forma el sistema GNU/Linux.
Arquitectura: kernel monolítico modular. El núcleo es monolítico en arquitectura, pero los drivers y módulos pueden cargarse y descargarse en caliente (insmod, rmmod, modprobe) sin reiniciar. Esto combina el rendimiento del monolítico con la flexibilidad de los módulos.
Principales distribuciones:
| Distribución | Base | Uso principal |
|---|---|---|
| Ubuntu | Debian | Escritorio y servidores. La más popular en la nube (AWS, GCP, Azure). |
| Debian | — | Estabilidad extrema. Base de Ubuntu, Raspbian, etc. |
| Red Hat Enterprise Linux (RHEL) | Red Hat | Entornos empresariales críticos. Con soporte comercial. |
| Rocky Linux / AlmaLinux | RHEL | Alternativas comunitarias y gratuitas a RHEL tras el fin de CentOS. |
| SUSE Linux Enterprise | SUSE | Entornos empresariales, especialmente SAP. |
| Fedora | Red Hat | Distribución de vanguardia; prueba las novedades que llegan a RHEL. |
| Kali Linux | Debian | Seguridad ofensiva y pentesting. |
Arquitectura NT: el kernel de Windows NT (y todos sus sucesores: XP, Vista, 7, 8, 10, 11, Server) está basado en un diseño híbrido inspirado en los microkernels. Tiene:
Active Directory (AD): servicio de directorio de Microsoft para gestionar centralizadamente usuarios, equipos y políticas de seguridad en redes corporativas. Es la pieza central de la administración de entornos Windows empresariales. Permite autenticación centralizada (Kerberos), políticas de grupo (GPO), asignación de recursos, etc.
Basado en Darwin, que combina el microkernel Mach (de la Universidad Carnegie Mellon) con componentes del sistema BSD (Berkeley Software Distribution). Kernel híbrido llamado XNU. POSIX-compliant. Integra la GUI Aqua.
Sistema operativo móvil de Google basado en el kernel Linux. Arquitectura en capas:
De Apple. Basado en Darwin (mismo núcleo que macOS). Modelo de seguridad muy estricto: aplicaciones en sandbox, firma de código obligatoria (App Store), arranque seguro (Secure Enclave), cifrado por hardware.
La virtualización abstrae los recursos hardware para permitir que múltiples SO ejecuten simultáneamente sobre el mismo hardware físico. Cada instancia de SO cree tener el hardware para sí sola.
El hipervisor (o VMM, Virtual Machine Monitor) es el software que crea y gestiona las máquinas virtuales.
Tipo 1 (bare metal): el hipervisor ejecuta directamente sobre el hardware, sin SO huésped entre medias. Más eficiente y seguro. Uso en producción y centros de datos. Ejemplos: VMware ESXi, Microsoft Hyper-V, Citrix XenServer, KVM (Linux).
Tipo 2 (hosted): el hipervisor es una aplicación más que corre sobre un SO convencional. Más fácil de instalar pero con más overhead. Uso en desarrollo y pruebas. Ejemplos: VirtualBox, VMware Workstation.
| Máquina Virtual | Contenedor | |
|---|---|---|
| Qué virtualiza | Hardware completo | Sistema operativo |
| SO propio | Sí, cada VM tiene su propio SO completo | No, comparten el kernel del SO anfitrión |
| Peso | Pesado (GBs) | Ligero (MBs) |
| Arranque | Minutos | Segundos |
| Aislamiento | Muy alto | Menor (comparten kernel) |
| Overhead | Mayor | Mínimo |
| Tecnologías | VMware, Hyper-V, KVM | Docker, Podman, containerd |
Docker (2013) popularizó los contenedores Linux. Un contenedor empaqueta la aplicación con todas sus dependencias en una imagen portable, garantizando que funciona igual en cualquier entorno.
Kubernetes (2014, Google) orquesta miles de contenedores: los distribuye entre nodos, los reinicia si fallan, los escala según la carga, gestiona el tráfico de red entre ellos. El SO moderno de servidor es cada vez más la base sobre la que corre Kubernetes.
El SO arranca desde una imagen de solo lectura verificada. Las actualizaciones reemplazan la imagen completa de forma atómica (se aplica la nueva imagen y se reinicia; si falla, se vuelve a la anterior). Ventajas: no hay "configuration drift", mayor seguridad, reproducibilidad total.
Ejemplos: Fedora CoreOS (diseñado para ejecutar contenedores), Talos Linux (SO para nodos Kubernetes, sin acceso shell), Flatcar Linux, ChromeOS.
Millones de dispositivos (sensores, cámaras, vehículos autónomos) procesan datos localmente en lugar de enviarlos todos a la nube. Necesitan SO ligeros y a menudo con garantías de tiempo real. Sistemas como Zephyr RTOS, FreeRTOS, y versiones mínimas de Linux construidas con Yocto Project están diseñados para estos entornos con RAM de KB y procesadores a MHz.
Los SO modernos incorporan infraestructura de observabilidad de primera clase:
- Logs estructurados: systemd-journald en Linux genera logs estructurados (JSON) consultables con journalctl.
- Métricas del kernel: mediante eBPF se pueden extraer métricas del kernel en tiempo real.
- Trazas distribuidas: herramientas como OpenTelemetry integran el SO en sistemas de observabilidad distribuida.
| Concepto A | Concepto B | Diferencia clave |
|---|---|---|
| Proceso | Hilo | Proceso tiene memoria propia; hilos comparten memoria del proceso. Hilos más ligeros. |
| Programa | Proceso | Programa = código estático en disco. Proceso = programa en ejecución con estado dinámico. |
| Kernel monolítico | Microkernel | Monolítico: todo en modo kernel, rápido pero un fallo puede tumbar el sistema. Microkernel: solo lo esencial en kernel, más estable pero con mayor overhead de IPC. |
| Multitarea cooperativa | Multitarea preventiva | Cooperativa: el proceso cede voluntariamente la CPU; un bug puede bloquear el sistema. Preventiva: el SO puede forzar el cambio; más robusto. |
| Memoria física | Memoria virtual | Física: RAM real. Virtual: espacio de direcciones abstracto por proceso, puede superar la RAM. |
| Paginación | Segmentación | Paginación: bloques fijos, transparente al programador. Segmentación: bloques variables con significado lógico. |
| Planificación preventiva | No preventiva | Preventiva: el SO puede interrumpir cualquier proceso. No preventiva: el proceso ejecuta hasta que cede voluntariamente. |
| Deadlock | Starvation | Deadlock: proceso nunca puede avanzar porque espera recursos en ciclo. Starvation: proceso puede avanzar teóricamente pero nunca le toca en la práctica. |
| BIOS | UEFI | BIOS: antiguo, limita a 2 TB, sin Secure Boot. UEFI: moderno, soporte GPT, Secure Boot, interfaz gráfica. |
| MBR | GPT | MBR: máx 4 particiones, discos hasta 2 TB. GPT: 128 particiones, discos hasta 9 ZB, con redundancia. |
| VM | Contenedor | VM virtualiza hardware completo con SO propio. Contenedor comparte kernel del anfitrión, más ligero. |
| Hipervisor Tipo 1 | Hipervisor Tipo 2 | Tipo 1: sobre hardware directamente, más eficiente. Tipo 2: sobre SO existente, más fácil pero más overhead. |
| Linux | Windows | Linux: open source, CLI-first, muy estable en servidores. Windows: propietario, GUI-first, integración con AD. |
| CLI | GUI | CLI: más potente para administración y automatización. GUI: más intuitivo para usuarios no técnicos. |
| SO propósito general | RTOS | Propósito general: maximiza rendimiento medio. RTOS: garantiza tiempos de respuesta máximos predecibles. |
| DAC | MAC | DAC: el propietario controla los permisos (Unix/Windows). MAC: el sistema impone reglas que los usuarios no pueden cambiar (SELinux). |
| Autenticación | Autorización | Autenticación: verifica quién eres. Autorización: determina qué puedes hacer. |
| Pregunta del examen | Concepto de este tema |
|---|---|
| Q1 — Comandos Linux (pwd, sudo, touch, chmod, kill) | Interfaz CLI, shell, llamadas al sistema, gestión de ficheros, permisos, gestión de procesos/señales, autenticación con sudo |
| Q2 — MFA | Gestión de seguridad: autenticación (algo que sabes, tienes, eres), factores de autenticación, TOTP |
| Q7 — Malware | Mecanismos de protección del SO, control de accesos, auditoría |
| Q8 — NAS y backups | Gestión del sistema de archivos, sistemas de archivos en red, tolerancia a fallos |
| Q9 — Permisos NTFS | Sistema de archivos NTFS, permisos DAC, ACLs, herencia de permisos |
Fin del Tema 1 — Conceptos de Sistemas Operativos