← Fundamentos de Sistemas Operativos Bloque 8 · Integración y cierre · Tema 34 de 34

Tema 34

Cierre y puente a los próximos cursos

El curso empezó con un programa de una línea y una pregunta: qué ocurre entre el código y la máquina. Treinta y tres temas después, este último no enseña nada nuevo. Ordena lo aprendido, señala las ideas que conviene llevarse, reconoce lo que quedó sin ver y muestra por dónde sigue el camino.

1. El punto de llegada

El tema 1 abrió con este programa y con la advertencia de que su única línea útil ponía en marcha más cosas de las que parecía:

hola.c, del tema 1
#include <stdio.h>

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

Entonces describimos lo que ocurría en seis pasos, casi todos con palabras prestadas. Ahora cada parte del programa remite a algo que conocemos:

En el programaLo que hay detrásTema
#include <stdio.h>Una cabecera del estándar de C, que existe en cualquier sistema.15, 25
mainNo es el comienzo: antes se ejecutan el enlazador dinámico y _start.9, 32
printfUna función de biblioteca, que da formato y guarda el texto en un búfer del proceso.15
El texto en pantallaUna llamada write sobre el descriptor 1, que es un dispositivo de caracteres; el emulador de terminal lo dibuja.13, 29
return 0El código de arranque llama a exit, que vacía los búferes y pide al kernel que finalice el proceso. El 0 lo recoge la shell.15, 26
Lo que no está escritoEl proceso que la shell creó, su memoria virtual, sus credenciales, los fallos de página, las interrupciones del temporizador.19, 27, 30

El programa no cambió. Cambió lo que se ve al mirarlo, y ese era el objetivo del curso: no aprender a usar un sistema operativo, sino saber qué hay debajo de cada programa.

Las capas de un sistema con los temas del curso que trataron cada una: programas y shell, biblioteca de C, la frontera de las llamadas al sistema, el kernel con sus cinco servicios, la frontera de las interrupciones y excepciones, y el hardware Programas y shell · temas 9 y 32 Biblioteca de C · temas 14 y 15 llamadas al sistema · temas 13 y 16 Kernel · temas 10 a 12, y 24 procesos 26 · memoria 27 · archivos 28 · dispositivos 29 · protección 30 interrupciones y excepciones · temas 17 a 19 Hardware · temas 5 a 8 · arranque: temas 20 a 22
El diagrama de capas del tema 1, con los temas que recorrieron cada una. Las dos líneas de trazos son las fronteras por las que se entra al kernel.

2. El curso en ocho preguntas

El mapa del tema 1 presentaba cada bloque como una pregunta. Estas son las respuestas, en una frase cada una:

BloqueLa preguntaLa respuesta
1. Introducción¿Qué es un sistema operativo y para qué existe?Es el software que administra el hardware y lo presenta a los programas en forma de abstracciones, repartiéndolo y protegiéndolo.
2. La computadora por dentro¿Qué hace el hardware por sí solo?Ejecuta instrucciones una tras otra. No distingue programas, no protege y no reparte: todo eso hay que construirlo.
3. El kernel y las llamadas al sistema¿Cómo le pide un programa algo al kernel?Con una instrucción que cambia de modo y entrega el control a una rutina que el kernel eligió de antemano.
4. Interrupciones¿Cómo recupera el kernel el control de la CPU?El hardware se lo devuelve: los dispositivos, cuando ocurre algo; el temporizador, siempre.
5. El arranque¿Qué ocurre entre el botón de encendido y el escritorio?Una cadena de programas, cada uno capaz de cargar al siguiente, hasta el primer proceso.
6. Tipos y diseños¿En qué se diferencian los sistemas operativos?En lo que priorizan y en cuánto ponen dentro del kernel. Los mecanismos son los mismos.
7. Los servicios¿Qué administra el kernel y cómo se observa?Procesos, memoria, archivos, dispositivos y permisos, y todo se puede ver en /proc y /sys.
8. Integración¿Qué ocurre, de punta a punta, al ejecutar un comando?Lo que recorrimos en el tema 32: todo lo anterior, en dos milisegundos.

3. Las ideas que sostienen todo

De un curso se olvidan los detalles. Conviene decidir qué debe quedar, y son unas pocas ideas que aparecieron una y otra vez, con distintos nombres:

IdeaEn pocas palabrasDónde apareció
AbstracciónEl sistema oculta el hardware tras conceptos simples: el proceso oculta la CPU; el espacio de direcciones, la memoria; el archivo, el disco.Temas 2, 26, 27 y 28
La frontera privilegiadaHay dos modos. Lo peligroso solo se puede hacer en uno, y a ese solo se entra por puertas que el kernel dejó preparadas.Temas 12, 13 y 17
El kernel reaccionaNo es un programa que corre al lado de los demás. Se ejecuta cuando lo invoca una llamada, una interrupción o una excepción.Temas 11 y 19
El hardware habilitaCada garantía del sistema descansa en una capacidad del procesador. Sin modos no hay protección; sin temporizador, no hay multitarea.Temas 3, 5 y 23
Mecanismo y políticaUna cosa es cómo se hace algo y otra qué se decide hacer. El kernel pone lo primero; lo segundo se deja, cuando se puede, fuera.Temas 19, 22 y 29
Cruzar cuestaCada paso al kernel, cada cambio de proceso y cada acceso al disco tiene un precio. Por eso todo se agrupa: se pide mucho, pocas veces.Temas 7, 11, 14 y 15
Hacerlo tardeEl kernel posterga el trabajo hasta que es inevitable: entrega la memoria al usarla, copia al escribir, graba cuando conviene.Temas 7, 9, 18 y 27
Una interfaz para todoDispositivos, tuberías y hasta el estado del kernel se usan como archivos, con las mismas cuatro operaciones.Temas 28, 29 y 31
No confiar en nadieEl kernel valida cada argumento y comprueba cada pedido. La protección se arma en capas, para que el fallo de una no entregue todo.Temas 13 y 30
Todo se puede observarNinguna afirmación del curso hubo que creerla: cada una se comprobó con un programa o con una herramienta.Temas 16 y 31

La última no es un concepto de sistemas operativos, sino un método, y quizá sea lo más valioso. Ante una duda sobre lo que hace un programa, la respuesta no está en suponer: está en strace, en /proc o en diez líneas de C escritas para averiguarlo.

4. Los patrones que se repiten

Además de las ideas generales, el curso mostró varias soluciones concretas que reaparecen en lugares distintos. Reconocerlas ahorra mucho esfuerzo al estudiar un sistema nuevo, porque suelen estar ahí también:

PatrónQué resuelveLo encontramos en
Una tabla de funcionesQue una parte del sistema invoque a otra sin conocerla, a través de un número o de un conjunto acordado.La tabla de llamadas al sistema, la de vectores de interrupción, las operaciones de un driver, el sistema de archivos virtual
Una cachéLa distancia de velocidad entre dos niveles: se guarda cerca lo que se usó hace poco.La caché de la CPU, la TLB, la caché de páginas, el búfer de stdio, la búsqueda en PATH
Dormir y despertarEsperar sin consumir CPU: una llamada al sistema deja al proceso dormido, y una interrupción lo despierta.La lectura del teclado y del disco, sleep, wait, las tuberías
Prometer y entregar despuésNo gastar recursos en lo que quizá no se use.La memoria de malloc, la carga de un ejecutable, la copia al escribir tras fork
Etapas que se carganUn problema circular: hace falta el sistema para cargar el sistema.Firmware, cargador, kernel, initramfs
Contador y diferenciaMedir una tasa cuando solo se dispone de totales acumulados.El uso de CPU, las interrupciones por segundo, los bytes de red
Identificar por númeroQue el nombre sea para las personas y el número para el sistema.PID, UID, descriptores, inodos, números mayor y menor
HeredarQue un programa reciba su entorno ya preparado, sin tener que pedirlo.Descriptores, credenciales, directorio actual, variables de entorno

5. Los errores, ahora con explicación

En el tema 1 dijimos que estudiar sistemas operativos servía, entre otras cosas, para entender ciertos mensajes de error. Es un buen momento para comprobarlo. Cada uno de estos mensajes resultaba opaco al empezar, y ahora tiene una causa precisa y una forma de investigarlo:

MensajeQué ocurrióDónde mirarTema
Segmentation faultUn acceso a una dirección que no pertenece a ninguna región del proceso, o sin el permiso necesario. El kernel envió SIGSEGV.dmesg, gdb18, 27
Illegal instructionLa CPU encontró bytes que no son una instrucción válida para ella.dmesg18
Floating point exceptionUna división entera por cero.gdb18
Killed, sin másAlguien envió SIGKILL. Si no fue una persona, fue el kernel al quedarse sin memoria.dmesg, journalctl -k26, 27
Permission deniedLos permisos del archivo no conceden la operación a la identidad del proceso.ls -l, id, strace -Z30
Operation not permittedLa operación exige un privilegio que el proceso no tiene.strace -Z30
No such file or directoryUna ruta no existe. A veces no es la que se cree: puede faltar una biblioteca o un archivo de configuración.strace -e trace=%file16
command not foundLa shell no halló un ejecutable con ese nombre en los directorios de PATH.type, echo $PATH32
Exec format errorEl archivo no tiene un formato que este kernel sepa cargar: es de otro sistema o de otra arquitectura.file9, 25
version `GLIBC_…' not foundEl ejecutable se compiló contra una biblioteca de C más nueva que la instalada.ldd, objdump -T15
No space left on deviceEl sistema de archivos está lleno, quizá por un archivo borrado que alguien mantiene abierto.df, /proc/PID/fd28
Too many open filesEl proceso alcanzó el límite de su tabla de descriptores. Suele indicar archivos que se abren y no se cierran./proc/PID/fd, /proc/PID/limits28, 31
Inappropriate ioctl for deviceSe pidió una operación de terminal sobre algo que no lo es: la salida está redirigida.—29
Kernel panic … Unable to mount root fsEl kernel arrancó y no pudo montar la partición raíz.Los parámetros en GRUB21
Un programa que «no responde»Está bloqueado en una llamada, o está calculando sin parar.strace -p, el estado en ps16, 26
Una salida que falta o aparece desordenadaEl texto quedó en el búfer de stdio.fflush, stderr15

La tabla tiene un rasgo común. En todos los casos, el mensaje es la traducción de un número: un código de errno o una señal. Alguien —el kernel, la shell, la biblioteca— lo convirtió en texto. Saber qué número hay detrás y quién lo produjo es casi siempre la mitad del diagnóstico.

6. La caja de herramientas

El curso no era de administración, pero dejó un conjunto de herramientas probadas. Ordenadas por la pregunta que responde cada una:

Para saber…HerramientaTema
qué le pide un programa al kernelstrace, con -f, -p, -c, -Z, -y16
qué dijo el kerneldmesg, journalctl -k11, 22
qué dijo un serviciojournalctl -u, systemctl status22
qué procesos hay y en qué estadops, top, pstree, pgrep26
cuánta memoria hay y quién la usafree, pmap, /proc/PID/maps27
cuán ocupado está el sistemavmstat, uptime, /proc/stat19, 31
cuánto tiempo pasó un programa en cada modotime11
dónde falló un programagdb, con la opción -g al compilar6, 18
qué es un archivo y cómo está hechofile, stat, readelf, ldd, xxd9, 28
qué hardware hay y qué driver lo manejalspci, lsblk, lsmod, modinfo, /sys8, 24, 29
qué interrupciones llegan/proc/interrupts, watch17
cómo arrancó el equipo y cuánto tardósystemd-analyze, efibootmgr, /proc/cmdline20 a 22
quién soy y qué puedo hacerid, ls -l30
qué hace una función o un archivo de /procman, en sus secciones 2, 3 y 54, 15

Si hubiera que conservar una sola, sería la primera. strace funciona con cualquier programa, en cualquier lenguaje, sin el código fuente, y contesta la pregunta de la que casi todas las demás dependen.

7. Los programas del curso

Cada tema dejó uno o más programas. Reunidos, forman un pequeño laboratorio al que conviene volver: son cortos, cada uno aísla una sola idea, y se prestan a modificarlos.

BloqueProgramasLo que muestran
1hola.c, hola_write.c, copiar.c, ilusion.c, invasor.c, epoch.c, entorno.c, aviso.c, verificar.shEl intermediario; la abstracción; la memoria propia de cada proceso; el entorno de trabajo.
2memoria.c, almacenado.c, pila.c, suma.c, matriz.c, rtc.c, etapas.cEl programa almacenado; la pila; la caché; un dispositivo real; las etapas de la compilación.
3componentes.sh, version.c, tiempos.c, anillo.c, privilegiada.c, espiar.c, hola.s, hola_error.s, escribir.c, errores.c, leer.c, copiar.c, quien.c, generica.c, caminos.c, clases.c, unidos.c, demora.c, mezcla.c, perdido.c, copiar_stdio.c, nombres.c, posix.c, terco.cLos modos; la llamada al sistema en ensamblador y en C; errno; el búfer de stdio; el diagnóstico con strace.
4interrupciones.c, division.c, division_real.c, segfault.c, ilegal.c, paginas.c, pausa.c, atrapar.c, bucle.c, turnos.c, siesta.cLas interrupciones por segundo; las excepciones y sus señales; los fallos de página; los cambios de contexto.
5mbr.c, cmdline.c, latido.cLa tabla de particiones; los parámetros del kernel; un servicio propio.
6latencia.c, el módulo hola.c, familia.sh, plataforma.cEl tiempo real; código en el anillo 0; la portabilidad.
7hijo.c, lanzar.c, zombi.c, huerfano.c, mapa.c, profundidad.c, memoria.c, info.c, abrir.c, redirigir.c, ventana.c, identidad.c, procesos.sh, usocpu.cfork y exec; el espacio de direcciones; los descriptores; ioctl; las credenciales; /proc.
8minishell.c, inspector.sh, inspector.cUna shell y un monitor: todo lo anterior, junto.
Tres nombres repetidos

Si guardas todo en un mismo directorio, ten en cuenta que hay nombres que se usan en dos temas para programas distintos: copiar.c en los temas 2 y 14, memoria.c en los temas 5 y 27, y hola.c en el tema 1 y en el módulo del tema 24. Lo más cómodo es usar un directorio por tema.

8. Lo que quedó sin ver

Un curso de fundamentos se define tanto por lo que incluye como por lo que deja para después. En cada bloque hubo que detenerse antes de entrar en profundidad, y conviene tener presente dónde:

VimosNo vimos
Los comandos necesarios para los experimentos.La terminal como herramienta de trabajo: búsquedas, filtros, edición, gestión de paquetes, redes.
Algunos scripts breves.Bash como lenguaje: funciones, arreglos, manejo de errores, expresiones regulares.
C suficiente para hacer llamadas al sistema.Punteros a fondo, estructuras de datos, gestión de memoria, compilación de proyectos grandes.
Qué es un proceso, y fork, exec y wait.Hilos, señales con sus manejadores, grupos y sesiones.
Que existe un planificador.Los algoritmos: cómo decide, qué garantiza cada uno, cómo se evalúan.
Que dos flujos pueden interferir.Condiciones de carrera, cerrojos, semáforos, interbloqueos.
Páginas, marcos y fallos de página.La estructura de las tablas, los algoritmos de reemplazo, el interior de malloc.
Inodos, directorios y descriptores.Cómo se organiza un sistema de archivos en el disco, y cómo sobrevive a un corte de energía.
Que una tubería conecta dos procesos.Los demás mecanismos de comunicación: colas, memoria compartida, sockets.
Que la red no es un archivo.Todo lo demás sobre redes.
Usuarios, permisos y las capas de protección.Los ataques concretos y las defensas modernas en detalle.
Qué son una máquina virtual y un contenedor.Cómo se construyen.

La columna derecha no es una lista de omisiones: es el programa de los cursos que siguen. Cada fila tiene el suyo.

9. La ruta: catorce cursos más

Este curso es el primero de quince. Los demás profundizan en lo que aquí se presentó a vista de pájaro, y en cada uno encontrarás como punto de partida algo que ya viste:

Nivel inicial

CursoProfundiza enLo anticipamos en
2. Terminal y Línea de Comandos en LinuxEl uso diario del sistema: archivos, texto, procesos, permisos, tuberías y redirecciones.Temas 4, 26, 28, 30 y 32
3. Automatización con Scripts en BashLa shell como lenguaje de programación.Temas 4, 25, 31 y 33
4. Programación en C para Sistemas OperativosEl lenguaje en que está escrito el kernel, y en que se le habla.Temas 9, 14, 15 y 27

Nivel intermedio

CursoProfundiza enLo anticipamos en
5. Procesos e HilosLa creación y el control de procesos, las señales y los hilos.Temas 18 y 26
6. Planificación de la CPULos algoritmos que deciden quién usa el procesador.Temas 19 y 23
7. Concurrencia y SincronizaciónLos problemas de compartir datos, y sus soluciones.Temas 19 y 26
8. Gestión de MemoriaLa paginación, las tablas, el intercambio y la asignación dinámica.Temas 7, 18 y 27
9. Sistemas de Archivos y Entrada/SalidaLa organización de los datos en el disco y el camino hasta el dispositivo.Temas 7, 8, 28 y 29
10. Comunicación entre ProcesosTuberías, colas, memoria compartida y sockets.Temas 26 y 28

Nivel avanzado

CursoProfundiza enLo anticipamos en
11. Redes desde el Sistema OperativoCómo implementa el kernel la comunicación entre equipos.Temas 17 y 29
12. Seguridad en Sistemas OperativosLos ataques, y los mecanismos que los contienen.Temas 12, 20 y 30
13. Virtualización y ContenedoresCómo se construye una máquina dentro de otra, y un sistema dentro de otro.Temas 12, 23 y 30
14. Rendimiento, Depuración y ObservabilidadMedir, encontrar el cuello de botella y entender un sistema en producción.Temas 16, 19 y 31
15. Construcción de un Sistema Operativo desde CeroEscribir un kernel mínimo: arranque, interrupciones, memoria, procesos.Temas 13, 17, 20, 21 y 24

El orden recomendado es el de los números, pero la ruta no es una fila. Después del nivel inicial, los cursos intermedios pueden tomarse según el interés: quien trabaja con servidores quizá quiera llegar pronto a los sistemas de archivos; quien escribe programas con hilos, a la concurrencia. El último curso es la prueba de todo lo anterior: no hay mejor forma de comprobar que se entiende un sistema operativo que escribir uno.

10. El próximo paso

El curso que sigue es Terminal y Línea de Comandos en Linux. Puede parecer un paso atrás: después de escribir un módulo del kernel, aprender a listar archivos. No lo es. A lo largo de este curso usamos la terminal como un medio, con lo mínimo para llegar a cada experimento, y quedó mucho sin explicar:

Lo usamos aquí, de pasadaAllí se estudia
grep, awk, cut, sort, head, tail, wcEl procesamiento de texto: cómo extraer, filtrar y transformar.
|, >, 2>&1La composición de comandos, con todas sus formas.
ls -l, chmod, ln, findLa gestión de archivos y permisos.
ps, kill, &, jobsEl control de procesos y trabajos.
sudo, apt, systemctlLa administración del sistema.
$PATH, $?, $$Las variables y el entorno de la shell.

La diferencia es que ahora llegas sabiendo qué hay detrás. Para quien empieza por los comandos, ls | wc -l es una fórmula que hay que memorizar. Para ti es una tubería creada por la shell, dos procesos con sus descriptores cambiados entre fork y exec, y un búfer del kernel entre ambos. Los comandos dejan de ser un vocabulario y pasan a ser consecuencias de un modelo que ya tienes. Ese es el sentido de haber empezado por los fundamentos.

11. Cómo seguir practicando

Lo aprendido se fija usándolo. Algunas maneras de hacerlo, de menor a mayor esfuerzo:

Para quien quiera un texto de consulta más amplio, hay cuatro libros que complementan bien este curso:

LibroAutoresSirve para
Operating Systems: Three Easy PiecesRemzi y Andrea Arpaci-DusseauLa teoría, explicada con claridad y con experimentos. Está disponible gratuitamente en línea.
Sistemas operativos modernosAndrew Tanenbaum y Herbert BosEl texto universitario clásico, de alcance muy amplio.
The Linux Programming InterfaceMichael KerriskLa referencia sobre las llamadas al sistema de Linux, con programas para cada una.
Linux Kernel DevelopmentRobert LoveUna introducción al interior del kernel.

12. El curso, en doce frases

13. Autoevaluación final

Estas preguntas no corresponden a un tema: cada una pide relacionar varios. Si puedes responderlas sin consultar, el objetivo del curso está cumplido.

1. Un programa ejecuta printf("hola\n") con la salida en una terminal. Describe el camino del texto hasta la pantalla.

printf da formato al texto y lo guarda en el búfer de stdout. Como el destino es una terminal, el salto de línea provoca el vaciado: la biblioteca llama a write sobre el descriptor 1. La instrucción syscall cambia a modo kernel; el kernel llega, por la tabla de descriptores, al driver de la pseudoterminal, que procesa los bytes y los deja en el búfer del otro extremo. El emulador de terminal, que dormía esperándolos, despierta, los lee y los dibuja; el entorno gráfico y el driver de video los llevan a la pantalla.

2. ¿Qué tres cosas pueden hacer que la CPU pase de modo usuario a modo kernel, y qué tienen en común?

Una llamada al sistema, que el programa provoca a propósito; una excepción, que provoca sin querer una instrucción que no puede completarse; y una interrupción de hardware, que provoca un dispositivo. En las tres, la CPU cambia de modo y salta, en el mismo acto, a una dirección que el kernel fijó de antemano: quien provoca la entrada no elige qué se ejecuta.

3. Un programa entra en un bucle infinito que solo suma. ¿Por qué el resto del sistema sigue funcionando?

Porque el temporizador interrumpe al procesador a intervalos regulares. En cada interrupción el kernel recupera el control, comprueba si el proceso agotó su turno y, si otro proceso espera, hace un cambio de contexto. El programa no puede evitarlo: deshabilitar las interrupciones requiere una instrucción privilegiada.

4. ¿Por qué un puntero nulo en un programa termina solo con ese programa, y en un driver puede detener la máquina?

En los dos casos la unidad de gestión de memoria genera un fallo de página. Si ocurre en modo usuario, el kernel está por encima para contenerlo: envía SIGSEGV al proceso y los demás no se enteran. Un driver se ejecuta en modo kernel, en el mismo espacio de direcciones que el resto del kernel; no hay nadie por encima, y sus estructuras pueden haber quedado dañadas.

5. Un proceso pide 1 GB con malloc y no lo usa. ¿Cuánta memoria física consume? ¿Qué ocurre cuando empieza a escribir en él?

Casi ninguna. El kernel añade una región a su espacio de direcciones sin asignar marcos. Al escribir, cada primer acceso a una página produce un fallo de página; el kernel comprueba que la dirección pertenece a una región válida, asigna un marco y hace que la instrucción se repita. Si la memoria del sistema no alcanza, descarta caché, recurre al intercambio y, en último caso, elimina un proceso.

6. ¿Qué diferencia hay entre root y el modo kernel?

Son privilegios de naturaleza distinta. El modo kernel es un estado del procesador, que determina qué instrucciones y qué memoria son accesibles. root es una identidad de usuario, que el kernel consulta al atender una llamada al sistema. Un proceso de root se ejecuta en modo usuario; su poder consiste en que el kernel acepta lo que pide, incluso cargar un módulo, cuyo código sí se ejecutará en modo kernel.

7. En ls > lista.txt, ¿qué hace la shell, qué hace el kernel y qué hace ls?

La shell crea un proceso con fork; en el hijo abre lista.txt y lo coloca en el descriptor 1 con dup2; luego llama a execve. El kernel atiende cada una de esas llamadas: crea el proceso, comprueba los permisos, actualiza la tabla de descriptores, carga el programa. ls no hace nada distinto de lo habitual: escribe en el descriptor 1, sin saber que es un archivo.

8. ¿Cómo se entera un proceso dormido en un read de que llegaron sus datos?

No se entera él: lo despiertan. El dispositivo genera una interrupción; el manejador del driver recoge los datos y marca al proceso como listo. Cuando el planificador le da un turno, el proceso continúa dentro de su llamada, el kernel copia los datos a su búfer y read retorna.

9. Un ejecutable compilado en Linux no funciona en Windows, aunque el procesador sea el mismo. Da tres razones.

El formato del archivo es distinto: ELF frente a PE, y cada kernel solo sabe cargar el suyo. Las bibliotecas de las que depende no existen en el otro sistema. Y la interfaz de llamadas al sistema es diferente: los números, la convención y los servicios mismos.

10. ¿Por qué el arranque necesita varias etapas?

Porque para cargar el sistema operativo hacen falta capacidades que son parte del sistema operativo: leer un disco, entender un sistema de archivos. El firmware, que está en un chip, sabe lo mínimo para cargar al cargador; este sabe leer el sistema de archivos donde está el kernel; el kernel recibe en memoria un sistema provisional con los drivers que le faltan para montar la raíz.

11. ¿Qué diferencia hay entre un kernel monolítico y un microkernel, y qué se gana y se pierde con cada uno?

En el monolítico, los drivers, los sistemas de archivos y la red se ejecutan en modo kernel, en un mismo espacio de direcciones: se comunican con llamadas a función, lo que es rápido, pero un error en cualquiera afecta a todo. En el microkernel son procesos de usuario que se comunican por mensajes: un fallo queda aislado y el componente puede reiniciarse, al precio de más cambios de contexto.

12. Te dicen que un servidor «está lento». ¿Qué mirarías, y en qué orden?

Primero la carga media, comparada con la cantidad de procesadores, y el reparto del tiempo de CPU: mucho tiempo de usuario indica cálculo; mucho de kernel, llamadas al sistema; mucho de espera, disco. Después la memoria disponible y el uso del intercambio. Luego, con top, qué procesos consumen. Identificado uno, strace -c -p para ver qué le pide al kernel, y dmesg o el registro por si el kernel o algún servicio informaron un problema.

13. ¿Por qué se puede observar tanto de un sistema Linux con solo cat y strace?

Por dos decisiones de diseño. La primera es que el kernel publica su estado como archivos, en /proc y /sys, que cualquier herramienta de texto puede leer. La segunda es que todo lo que un programa hace fuera de su memoria pasa por las llamadas al sistema, una frontera única y estable que strace puede vigilar.

14. Si tuvieras que explicarle a alguien, en un minuto, qué es un sistema operativo, ¿qué dirías?

No hay una única respuesta. Una posible: es el programa que se interpone entre el hardware y todos los demás programas. Les da a cada uno la ilusión de tener una máquina propia —un procesador, una memoria, unos archivos—, reparte entre ellos la máquina real y les impide dañarse entre sí. Lo logra porque es el único que se ejecuta en el modo privilegiado del procesador, y los demás solo pueden pedirle las cosas.

Para terminar

  1. Vuelve al tema 1 y relee la sección «El rastro de un "Hola"». Reescríbela con tus palabras y con el detalle que ahora puedes darle.
  2. Elige las tres ideas de la sección 3 que te resulten menos claras y repasa los temas indicados.
  3. Recorre la tabla de errores de la sección 5 y provoca cada uno a propósito, con un programa o un comando.
  4. Completa al menos una ampliación de la shell y una del inspector.
  5. Escribe, sin consultar, el recorrido de un comando que elijas, como hicimos en el tema 32. Verifícalo después con strace -f.

Aquí termina Fundamentos de Sistemas Operativos. El sistema que antes era una caja negra tiene ahora un interior conocido: un procesador con dos modos, un kernel que responde, y programas que le piden lo que necesitan. Lo que sigue, en cada curso de la ruta, es abrir una de esas piezas y mirar más de cerca.