Ciencias de la computación

Procesos vs. hilos: clave de la entrevista

Al abrir el Administrador de tareas aparecen procesos; al leer documentación de desarrollo aparecen hilos. Ambos parecen ser «algo que se ejecuta», pero ¿qué los diferencia exactamente?

5 min de lectura
Imagen de portada de Procesos vs. hilos: clave de la entrevista

Al abrir el Administrador de tareas aparecen procesos; al leer documentación de desarrollo aparecen hilos. Ambos parecen ser «algo que se ejecuta», pero ¿qué los diferencia exactamente?

Si hubiera que elegir la pregunta más frecuente en una entrevista técnica, sería esta: «Explique la diferencia entre un proceso y un hilo».

La razón es sencilla: con una sola pregunta se pueden evaluar la memoria, los sistemas operativos y la concurrencia.

Este artículo explica la diferencia entre ambos desde la perspectiva de la estructura de memoria y hasta dónde conviene llegar en una entrevista.

Empecemos por lo esencial.

  1. Proceso: programa en ejecución. Recibe un espacio de memoria independiente completo.
  2. Hilo: flujo de ejecución dentro de un proceso. Tiene su propia pila y comparte el resto.
  3. Al compartir recursos, los hilos son ligeros y rápidos, pero también pueden producir carreras de datos.
  4. Los procesos están aislados y son seguros, pero resultan más pesados y difíciles de comunicar entre sí.

Proceso: un programa en ejecución

Un programa es un bloque de código almacenado en el disco. Todavía no hace nada.

En cuanto se ejecuta, el sistema operativo lo carga en memoria y se prepara para asignarle CPU. Ese «programa en ejecución» es un proceso.

El sistema operativo asigna a cada proceso un espacio de memoria virtual independiente completo. Tiene cuatro áreas principales.

Área Contenido
Código (Text) Código máquina que se ejecutará
Datos (Data) Variables globales y estáticas
Montón (Heap) Memoria asignada dinámicamente en tiempo de ejecución
Pila (Stack) Información de llamadas a funciones y variables locales

La palabra importante aquí es «independiente». El proceso A no puede inspeccionar la memoria del proceso B. El sistema operativo lo bloquea desde el origen.

Por eso un proceso puede fallar mientras los demás siguen funcionando. Chrome crea un proceso independiente para cada pestaña por este motivo. Si una pestaña se bloquea, el navegador completo sobrevive.


Hilo: un flujo de ejecución dentro de un proceso

Un hilo es la unidad de flujo de ejecución que realmente ejecuta código dentro de un proceso. Todo proceso comienza con al menos un hilo: el hilo principal.

La clave es lo que se comparte. Los hilos del mismo proceso comparten las áreas de código, datos y montón, mientras que cada uno tiene su propia pila.

Solo la pila es independiente; el código, los datos y el montón se comparten.
Solo la pila es independiente; el código, los datos y el montón se comparten.

La razón de que cada hilo tenga su propia pila es clara: registra qué función se está ejecutando y hasta dónde ha avanzado, así que cada flujo necesita una.

Como el montón se comparte, los hilos pueden intercambiar datos directamente mediante una variable. No se necesita un procedimiento de comunicación aparte.


Por qué usar hilos: una cuestión de coste

Podría pensar: «Si quiero hacer varias cosas a la vez, ¿por qué no iniciar varios procesos?». El problema es el coste.

Coste de creación. Crear un proceso exige preparar un espacio de memoria independiente completo. Para un hilo basta con añadir una pila.

Coste de cambio. Cuando la CPU pasa a otro proceso, debe reemplazar todo el mapa de memoria (cambio de contexto). Cambiar entre hilos del mismo proceso es mucho más ligero.

Coste de comunicación. Para intercambiar datos, los procesos deben usar IPC (comunicación entre procesos), como tuberías o sockets. Los hilos solo tienen que leer la misma variable.

En resumen, un hilo es la unidad para hacer varias cosas a la vez con poco coste.


Nada es gratis: carreras de datos

Todas las ventajas de los hilos provienen de compartir memoria, y su mayor debilidad surge exactamente del mismo punto.

Si dos hilos escriben simultáneamente en la misma variable, el resultado es impredecible. Eso es una carrera de datos.

Incluso una línea como count += 1 consta internamente de tres pasos —leer, sumar y escribir—, así que dos hilos que se solapen pueden hacer que un incremento desaparezca.

Por eso se necesitan herramientas de sincronización como bloqueos y semáforos. Si se usan mal, aparece otro problema: los interbloqueos.

Los procesos no tienen este problema porque su memoria está aislada desde el principio. Es un equilibrio entre seguridad y eficiencia.

Una carrera de datos comienza en cuanto varios hilos acceden simultáneamente a la memoria compartida.
Una carrera de datos comienza en cuanto varios hilos acceden simultáneamente a la memoria compartida.

Desde la perspectiva de un desarrollador de iOS

En iOS, una aplicación es un proceso. Debido al sandbox, una aplicación no puede acceder a la memoria de otra. El aislamiento de procesos descrito antes se aplica directamente.

Dentro de una aplicación, el hilo principal gestiona la interfaz, mientras que la red y los cálculos pesados se envían a otros hilos. La regla «actualiza la interfaz en el hilo principal» se basa en el concepto de hilo.

Sin embargo, crear hilos directamente es poco habitual en el desarrollo moderno de iOS. Si envía el trabajo a una cola de GCD o a un Task de Swift Concurrency, el sistema lo asigna automáticamente desde un grupo de hilos. Solo ha subido un nivel la abstracción; debajo siguen funcionando hilos.


Así se responde en una entrevista

Conviene empezar con una respuesta de una sola frase.

«Un proceso es una unidad de ejecución con un espacio de memoria independiente, mientras que un hilo es un flujo de ejecución dentro de un proceso que tiene su propia pila y comparte el resto de la memoria».

Las preguntas de seguimiento son casi predecibles: «¿Qué comparte un hilo y qué tiene por separado?» (solo la pila), «¿Por qué los hilos son más ligeros?» (costes de creación, cambio y comunicación) y «¿Qué problema surge al compartir?» (carreras de datos y sincronización). Con esto se alcanza el nivel esperado.

Añada un ejemplo real, como las pestañas de Chrome o el sandbox de iOS, y transmitirá comprensión en lugar de memorización.


Resumen

  • Un proceso es un programa en ejecución y recibe del sistema operativo un espacio de memoria independiente (código, datos, montón y pila).
  • Un hilo es un flujo de ejecución dentro de un proceso; tiene su propia pila y comparte el código, los datos y el montón.
  • Los hilos son ligeros porque los costes de creación, cambio y comunicación son bajos, pero la memoria compartida implica riesgo de carreras de datos.
  • Los procesos están aislados y son seguros, pero resultan pesados y necesitan IPC para comunicarse.
  • En iOS, una aplicación es un proceso, mientras que GCD y Task son abstracciones construidas sobre hilos.
  • Esquema de respuesta: definición en una frase → alcance compartido → diferencia de costes → carreras de datos