← Fundamentos de Sistemas Operativos Bloque 1 · Introducción · Tema 1 de 34

Tema 01

Qué es un sistema operativo

Lo usas cada vez que enciendes un equipo, pero casi nunca lo ves. En este tema definimos qué es un sistema operativo, dónde se ubica entre el hardware y tus programas, y seguimos paso a paso lo que ocurre cuando un programa de una línea escribe un texto en pantalla.

1. Una pregunta para empezar

Este es probablemente el primer programa que escribiste, en C o en cualquier otro lenguaje:

hola.c
#include <stdio.h>

int main(void)
{
    printf("Hola, sistema operativo\n");
    return 0;
}

Funciona, y por eso nunca nos detenemos a pensar en él. Pero mirado de cerca plantea preguntas que el código no responde:

Ninguna de esas tareas está en las seis líneas del programa. Todas las hace otro software, que ya estaba en ejecución antes de que tu programa empezara y que seguirá en ejecución cuando termine. Ese software es el sistema operativo.

2. Programar sin sistema operativo

La forma más clara de entender qué hace un sistema operativo es imaginar que no está. Supón que tienes una computadora recién fabricada, sin nada instalado, y quieres que muestre «Hola» en pantalla. Tu programa tendría que resolver por sí mismo todo esto:

Las primeras computadoras se programaban exactamente así, y cada programa incluía su propio código para manejar la impresora o la cinta. Muy pronto quedó claro que ese código era siempre el mismo y que convenía escribirlo una sola vez, dejarlo cargado en la máquina y permitir que todos los programas lo usaran. De esa idea nacen los sistemas operativos; el recorrido histórico completo está en el tema 3. Si quieres conocer antes cómo surgieron y quiénes los crearon, puedes leer la historia de los sistemas operativos.

Todavía se hace

Programar sin sistema operativo no es solo historia. Un microcontrolador como el de una placa Arduino, o el que controla un horno de microondas, ejecuta un único programa directamente sobre el hardware. Se lo llama programación bare metal («sobre el metal desnudo»), y funciona bien precisamente porque el equipo hace una sola cosa con un hardware que nunca cambia.

3. Una definición

No existe una definición única aceptada por todos los libros, pero casi todas coinciden en lo esencial:

Un sistema operativo es el software que administra el hardware de una computadora y ofrece a los programas un conjunto de servicios para usarlo, de modo que ningún programa tenga que tratar directamente con los dispositivos ni pueda interferir con los demás.

En esa frase hay tres ideas que conviene separar:

  1. Administra el hardware. La CPU, la memoria, el disco y los dispositivos son recursos limitados que muchos programas quieren usar al mismo tiempo. El sistema operativo decide quién usa qué y durante cuánto tiempo.
  2. Ofrece servicios. En lugar de «escribe estos bytes en el sector 48.213 del disco», tu programa pide «guarda este texto en el archivo notas.txt». El sistema operativo traduce el pedido simple a las operaciones complejas que el hardware necesita.
  3. Protege. Un programa con errores, o malintencionado, no debe poder leer la memoria de otro programa, borrar archivos ajenos ni dejar colgada la máquina entera.

Las dos primeras ideas suelen llamarse el sistema operativo como gestor de recursos y como máquina extendida. Son tan importantes que les dedicamos todo el tema 2.

Una analogía

Piensa en un edificio de oficinas. Las empresas (los programas) no instalan su propia red eléctrica ni negocian entre sí quién usa el ascensor: la administración del edificio (el sistema operativo) provee electricidad, agua y ascensores a todos, decide los turnos de las salas compartidas y controla que nadie entre a la oficina de otro. Las empresas se dedican a su trabajo y solo tratan con la administración cuando necesitan algo.

4. Dónde se ubica: las capas

Un sistema informático se entiende mejor como una pila de capas, donde cada una usa los servicios de la que tiene debajo y ofrece servicios a la que tiene arriba:

Capas de un sistema informático: usuarios, aplicaciones, bibliotecas, kernel y hardware Usuarios Aplicaciones navegador · editor · shell · compilador y los programas que tú escribes Bibliotecas biblioteca estándar de C: printf, fopen, malloc… ▲ modo usuario · llamadas al sistema · modo kernel ▼ Kernel (núcleo del sistema operativo) procesos · memoria · archivos · dispositivos Hardware CPU · memoria RAM · disco · red · teclado · pantalla
Cada capa solo habla con sus vecinas. La línea punteada es la única puerta entre los programas y el kernel.

De abajo hacia arriba:

La línea punteada del diagrama es la frontera más importante de todo el curso. Un programa en modo usuario no puede saltar al kernel cuando quiere: solo puede cruzar por un mecanismo controlado, la llamada al sistema (en inglés system call o syscall), mediante la cual le pide al kernel que haga algo en su nombre. A esa frontera le dedicamos el bloque 3 completo.

5. Qué forma parte del sistema operativo y qué no

Aquí aparece una confusión habitual, porque la expresión «sistema operativo» se usa con dos sentidos:

Las dos formas de hablar son correctas; lo importante es saber cuál se está usando. En este curso, cuando haga falta precisión diremos kernel, y usaremos «sistema operativo» para el conjunto.

Componente¿Es sistema operativo?Por qué
Kernel de LinuxSí, en cualquier sentidoControla el hardware y se ejecuta en modo kernel.
Controlador de la tarjeta de redSíEs código que se ejecuta dentro del kernel.
Biblioteca de C (glibc)Solo en sentido amplioSe ejecuta en modo usuario, pero casi todos los programas dependen de ella.
Shell (Bash)Solo en sentido amplioEs un programa común, que recibe comandos y le pide al kernel que los ejecute.
Comandos ls, cp, psSolo en sentido amplioProgramas de usuario que vienen con el sistema.
Escritorio gráficoSolo en sentido amplioEn Linux es un conjunto de programas de usuario; puedes cambiarlo o no instalarlo.
Navegador webNoEs una aplicación, aunque venga preinstalada.
Firmware (BIOS o UEFI)NoEstá grabado en la placa base, arranca antes y su tarea es cargar el sistema operativo.
Linux y las distribuciones

Como Linux es solo el kernel, no se puede usar por sí solo. Una distribución (Ubuntu, Debian, Fedora, Arch…) reúne el kernel de Linux con bibliotecas, shell, utilidades, un instalador y un gestor de paquetes, y entrega un sistema completo. Por eso dos distribuciones se ven muy distintas y, sin embargo, ejecutan los mismos programas: comparten el kernel.

6. El rastro de un «Hola»

Volvamos al programa del principio y sigamos su única línea útil a través de las capas. Para compilarlo y ejecutarlo en Linux:

terminal
$ gcc hola.c -o hola
$ ./hola
Hola, sistema operativo
Si todavía no tienes Linux

No hace falta que ejecutes nada ahora: basta con leer los ejemplos. En el tema 4 preparamos el entorno paso a paso (Linux nativo, máquina virtual o WSL en Windows) y podrás volver a este tema para probarlos.

Entre que pulsas Enter y aparece el texto ocurre lo siguiente. Fíjate en qué modo trabaja la CPU en cada paso:

  1. Tu programa llama a printf. printf no es parte del kernel: es una función de la biblioteca de C, código común que se ejecuta dentro de tu propio programa. modo usuario
  2. printf prepara el texto. Arma la cadena final, la guarda en una zona de memoria temporal (un búfer) y, cuando decide enviarla, llama a otra función de la biblioteca: write. modo usuario
  3. write ejecuta una llamada al sistema. Coloca en registros de la CPU qué se pide (escribir), dónde (el descriptor 1, la salida estándar), qué bytes y cuántos. Luego ejecuta una instrucción especial que detiene el programa y transfiere el control al kernel. cambio a modo kernel
  4. El kernel verifica el pedido. ¿Este programa tiene abierto el descriptor 1? ¿Hacia dónde apunta? ¿La dirección de memoria que indicó le pertenece de verdad? Si algo falla, devuelve un error en lugar de obedecer. modo kernel
  5. El kernel entrega los bytes a su destino. En este caso, el descriptor 1 está conectado a la terminal, así que los bytes pasan al controlador correspondiente y terminan dibujados en la ventana. Si hubieras redirigido la salida a un archivo, el kernel los habría enviado al disco, sin que tu programa cambiara una sola línea. modo kernel
  6. El kernel devuelve el resultado. Informa cuántos bytes escribió (24), la CPU vuelve al modo restringido y tu programa continúa en la instrucción siguiente. vuelta a modo usuario

Esto no es una descripción teórica: se puede observar. La herramienta strace muestra las llamadas al sistema que hace un programa. Le pedimos que registre solo las de tipo write y que guarde el resultado en un archivo:

terminal
$ strace -e trace=write -o traza.txt ./hola
Hola, sistema operativo
$ cat traza.txt
write(1, "Hola, sistema operativo\n", 24) = 24
+++ exited with 0 +++

Ahí está el paso 3 con todos sus datos: el descriptor 1, el texto, la cantidad de bytes (23 caracteres más el salto de línea) y, después del signo igual, la respuesta del kernel. Aprenderás a usar strace en detalle en el tema 16.

Para confirmar que printf es solo un intermediario cómodo, este otro programa prescinde de él y hace el pedido al kernel directamente:

hola_write.c
#include <unistd.h>

int main(void)
{
    const char mensaje[] = "Hola, kernel\n";

    /* 1 = salida estándar; sizeof incluye el '\0' final, que no enviamos */
    write(1, mensaje, sizeof(mensaje) - 1);
    return 0;
}

El texto aparece en pantalla igual que antes, y ya no interviene printf. Lo que no puedes hacer es saltarte también al kernel: no existe ninguna instrucción en modo usuario que escriba en la pantalla. Todo programa, en cualquier lenguaje, termina pasando por una llamada al sistema para producir un efecto fuera de su propia memoria.

7. Verlo desde la terminal

El sistema operativo es discreto, pero responde si le preguntas. Estos comandos de Bash consultan información que solo el kernel conoce (los valores que veas serán distintos en tu equipo):

terminal
$ uname -srm                 # nombre del kernel, versión y arquitectura
Linux 6.8.0-45-generic x86_64

$ head -2 /etc/os-release     # la distribución instalada
PRETTY_NAME="Ubuntu 24.04.1 LTS"
NAME="Ubuntu"

$ nproc                      # procesadores que el kernel administra
8

$ free -h                    # memoria total, usada y libre
               total        used        free      shared  buff/cache   available
Mem:            15Gi       4.2Gi       6.9Gi       412Mi       4.4Gi        10Gi
Swap:          2.0Gi          0B       2.0Gi

$ ps -e | wc -l              # programas en ejecución en este momento
287

Dos observaciones sobre esa salida:

8. Los servicios que ofrece

Vistos desde un programa, los servicios del sistema operativo se agrupan en unas pocas familias. Cada una se corresponde con una parte del kernel y con uno o más cursos de esta ruta:

ServicioQué resuelveEjemplo de pedido
Ejecución de programasCargar un programa en memoria, ejecutarlo, repartir la CPU entre todos y finalizarlo.«Ejecuta ./hola»
Gestión de memoriaDar a cada programa su propia memoria y evitar que acceda a la de otro.«Necesito 4 MB más»
ArchivosOrganizar los datos del disco en archivos y directorios con nombre.«Abre notas.txt y dame su contenido»
Entrada y salidaOcultar las diferencias entre dispositivos detrás de operaciones uniformes.«Lee lo que el usuario escriba»
ComunicaciónPermitir que los programas intercambien datos, en el mismo equipo o por la red.«Conéctame con ese servidor»
Protección y seguridadIdentificar usuarios y controlar quién puede hacer qué.«¿Puedo modificar este archivo?»
Detección de erroresReaccionar cuando falla el hardware o un programa hace algo inválido.Finalizar un programa que accede a memoria ajena

En el bloque 7 de este curso recorremos cada servicio a vista de pájaro, y los cursos de nivel intermedio los estudian uno por uno.

9. Sistemas operativos que ya usas

Hay sistemas operativos en muchos más lugares que en una PC. Todos cumplen la definición de la sección 3, aunque estén diseñados para necesidades muy distintas:

SistemaKernelDónde se usa
Ubuntu, Debian, FedoraLinuxServidores, escritorios, la mayor parte de la nube
AndroidLinuxTeléfonos, tabletas, televisores
WindowsWindows NTEscritorios, portátiles, servidores
macOS, iOSXNUComputadoras y teléfonos de Apple
FreeBSDFreeBSDServidores y equipos de red
FreeRTOS, ZephyrKernel de tiempo realMicrocontroladores, sensores, equipos industriales

La tabla muestra algo útil: Android y Ubuntu comparten kernel aunque sean irreconocibles entre sí, porque lo que cambia es todo lo que se construye encima. Clasificamos los tipos de sistemas en el tema 23 y comparamos las grandes familias en el tema 25.

En este curso trabajamos sobre Linux por tres razones: su código es abierto y se puede leer, ofrece herramientas para observar lo que hace el kernel, y es el sistema sobre el que se despliega la mayor parte del software actual. Los conceptos, sin embargo, valen para cualquier sistema operativo moderno.

10. Ideas equivocadas frecuentes

«El sistema operativo es lo que veo en pantalla»

El escritorio, las ventanas y los iconos son la parte visible, pero no la esencial. Un servidor Linux suele funcionar sin ningún entorno gráfico y sigue teniendo un sistema operativo completo. La interfaz es un programa más, que usa los servicios del kernel como cualquier otro.

«El sistema operativo está siempre ejecutándose en segundo plano»

En un procesador, en cada instante se ejecuta una sola cosa: o tu programa, o el kernel. El kernel no «vigila» mientras tu programa corre; está detenido. Solo se ejecuta cuando algo lo activa: una llamada al sistema, una interrupción de un dispositivo o un error del programa. Cómo logra entonces mantener el control es una de las ideas más elegantes del curso, y la vemos en el bloque 4.

«Mi programa habla con el hardware»

Salvo que escribas un controlador de dispositivo o programes un microcontrolador, tu programa nunca toca el hardware. Habla con el kernel, y el kernel habla con el hardware.

«El sistema operativo ejecuta mi programa»

Tu programa no es interpretado por el sistema operativo: sus instrucciones las ejecuta directamente la CPU, a toda velocidad. El sistema operativo lo prepara, le asigna recursos, lo interrumpe cuando corresponde y atiende sus pedidos, pero no participa en cada instrucción.

«Linux es un sistema operativo como Windows»

En sentido estricto, Linux es un kernel. Lo comparable con Windows es una distribución completa, como Ubuntu.

11. Por qué le importa a un programador

Se puede programar durante años sin estudiar sistemas operativos, del mismo modo que se puede conducir sin saber cómo funciona un motor. Pero hay problemas que solo se entienden mirando debajo del lenguaje:

Todas esas respuestas están en el sistema operativo, y cada una corresponde a un curso de esta ruta. Este primer curso construye el vocabulario y el modelo mental que los demás dan por sabido.

12. El mapa del curso

Los 34 temas siguen el mismo orden que las capas del diagrama, de abajo hacia arriba:

BloqueTemasLa pregunta que responde
1. Introducción1–4¿Qué es un sistema operativo y para qué existe?
2. La computadora por dentro5–9¿Qué hace el hardware por sí solo?
3. El kernel y las llamadas al sistema10–16¿Cómo le pide un programa algo al kernel?
4. Interrupciones17–19¿Cómo recupera el kernel el control de la CPU?
5. El proceso de arranque20–22¿Qué ocurre entre el botón de encendido y el escritorio?
6. Tipos y diseños23–25¿En qué se diferencian los sistemas operativos?
7. Visión general de los servicios26–31¿Qué administra el kernel y cómo se observa?
8. Integración y cierre32–34¿Qué ocurre, de punta a punta, al ejecutar un comando?

Al llegar al tema 32 podrás explicar con precisión lo que en la sección 6 vimos a grandes rasgos.

13. Resumen

14. Preguntas de repaso

Intenta responder cada una antes de abrir la respuesta.

1. ¿Por qué un programa común no puede escribir directamente en el disco?

Porque se ejecuta en modo usuario, y en ese modo la CPU rechaza las instrucciones que acceden al hardware. Debe pedírselo al kernel mediante una llamada al sistema. Esto permite que el kernel compruebe permisos y evita que un programa dañe los datos de otros.

2. Un compañero dice «uso el sistema operativo Linux». ¿Qué precisión le harías?

Linux, en sentido estricto, es el kernel. Lo que usa es una distribución (Ubuntu, Fedora, Debian…), que combina ese kernel con bibliotecas, shell, utilidades y, normalmente, un escritorio. Con uname -r ve la versión del kernel y con cat /etc/os-release, la distribución.

3. ¿printf es una llamada al sistema?

No. Es una función de la biblioteca de C que se ejecuta en modo usuario. Da formato al texto y luego usa la llamada al sistema write, que es la que realmente cruza al kernel.

4. Si ejecutas ./hola > salida.txt, ¿cambia el programa? ¿Cambia la llamada al sistema?

Ninguna de las dos cosas. El programa sigue pidiendo write sobre el descriptor 1. Lo que cambia es adónde apunta ese descriptor: la shell lo conectó a un archivo antes de iniciar el programa, y el kernel envía los bytes al disco. Es un buen ejemplo del valor de la abstracción.

5. ¿El navegador que viene instalado con el sistema forma parte del sistema operativo?

No. Es una aplicación que usa los servicios del sistema operativo como cualquier otra; que venga preinstalada es una decisión comercial, no técnica.

6. ¿Qué equipo podría funcionar razonablemente sin sistema operativo, y por qué?

Uno que ejecuta un único programa sobre un hardware fijo: el microcontrolador de un termostato, un mando a distancia o un horno. No hay recursos que repartir entre programas ni dispositivos distintos que abstraer, así que el programa puede manejar el hardware directamente.

Para practicar

  1. Elige tres equipos que tengas cerca (teléfono, televisor, router, consola, reloj) y averigua qué sistema operativo y qué kernel usa cada uno.
  2. Cuando tengas Linux disponible, ejecuta los comandos de la sección 7 y anota la versión del kernel y la distribución.
  3. Compila hola.c y hola_write.c, y compara con strace -e trace=write la llamada que hace cada uno.