Hilos
Los hilos son una característica fundamental en Java que permite la ejecución concurrente de múltiples subprocesos dentro de un mismo proceso. Estos hilos comparten el mismo espacio de memoria y recursos del proceso principal, lo que facilita el intercambio de información entre ellos, pero también requiere un manejo cuidadoso para evitar conflictos e inconsistencias.
Cada hilo tiene su propia pila de ejecución, contador de programa y variables locales, lo que les permite ejecutarse de forma independiente y asíncrona. Sin embargo, a diferencia de los procesos, los hilos comparten el heap de memoria y otros recursos del proceso principal, lo que los hace más livianos y eficientes.
En Java, todo programa tiene al menos un hilo principal (main thread) que se crea automáticamente al iniciar la aplicación y ejecuta el método main()
. Además, la Máquina Virtual de Java (JVM) crea otros hilos internos para tareas de mantenimiento, como la recolección de basura o la finalización de objetos.
La programación con hilos en Java es fundamental para crear aplicaciones concurrentes y aprovechar al máximo los recursos del sistema. Esto es especialmente importante en aplicaciones de alto rendimiento, servidores web, aplicaciones de red, entre otros.
Proceso versus Hilo
Tanto los procesos como los hilos se relacionand entre sí y son muy similares, por esto se crea una confusión para entender sus diferencias. Los procesos y los hilos son una secuencia de ejecución independiente, pero ambos se diferencian en que los procesos se ejecutan en diferentes espacios de memoria, mientras que los hilos del mismo proceso se ejecutan en un espacio de memoria compartido.
Qué es un proceso
Un proceso es una instancia de un programa en ejecución. Al ejecutar un programa, no se ejecuta directamente. Toma un tiempo realizar todos los pasos necesarios para ejecutar el programa, y el seguimiento de estos pasos se conoce como proceso.
Estado de un proceso
Un proceso en el sistema operativo puede estar en uno de los siguientes estados:
- NEW: El proceso ha sido creado pero aún no se ha iniciado.
- READY: El proceso está listo para ejecutarse y está esperando a que el sistema operativo le asigne un tiempo de CPU.
- RUNNING: El proceso está siendo ejecutado por el CPU.
- WAITING: El proceso está esperando a que ocurra un evento, como la finalización de una operación de entrada/salida.
- TERMINATED: El proceso ha finalizado su ejecución.
- BLOCKED: El proceso está esperando a que se libere un recurso, como un archivo o un semáforo.
El gráfico visualiza este mismo ciclo de vida, pero para un hilo en lugar de un proceso. Las operaciones mencionadas se utilizarán en Java para manejar los hilos.
Funcionamiento de los procesos
Al empezar a ejecutar un programa, se empieza a procesar, y sigue los siguientes pasos:
- Primero, el programa se carga en la memoria de la computadora en código binario.
- Un programa necesaria memoria y otros recursos del sistema operativo para ejecutarse. Recursos como registros, contador de programa, y un stack (una pila), brindados por el sistema operativo.
- Un registro puede tener una instrucción, una dirección de almacenamiento, u otra información necesaria para el proceso.
- El contador del programa realiza el seguimiento de la secuencia del programa.
- El stack tiene información sobre las subrutinas activas en el programa.
- Un programa puede tener diferentes instancias, y cada instancia es un proceso individual.
Qué es un hilo en este contexto
Un hilo es un subset de un proceso, también conocido como proceso ligero. Un proceso puede tener más de un hilo, y estos hilos se gestionan de manera independiente. Todos los hilos dentro de un proceso están relacionados entre sí. Los hilos pueden tener información común, como ser, segmento de datos, de código, archivos, etc.
Diferencias entre procesos y hilos
Procesos | Hilos |
---|---|
Un proceso es una instancia de un programa que se ejecuta | Un hilo es un segmento de un proceso o un proceso ligero gestionado de manera independiente |
Los procesos son independientes entre sí y no comparten memoria u otros recursos | Los hilos son interdependientes y comparten memoria. |
Cada proceso se trata como un proceso nuevo por el SO. | El sistema operativo toma a todos los hilos de nivel usuario como un solo proceso. |
Si un proceso se bloquea por el sistema operativo, otros procesos pueden continuar la ejecución. | Si un hilo de nivel de usuario se bloquea, todos sus hilos pares también se bloquean porque el SO los considera como un solo proceso. |
El cambio de contexto entre dos procesos toma mucho más tiempo dado que son pesados comparados con los hilos. | El cambio de contexto entre dos hilos es más rápido porque son muy livianos. |
El segmento de datos y el segmento de código de cada proceso son independientes entre sí. | Los hilos comparten el segmento de datos y el segmento de código con sus hilos pares. |
El sistema operativo toma más tiempo para terminar un proceso. | Los hilos se pueden terminar muy rápido. |
La creación de un nuevo proceso toma más tiempo dado que cada proceso toma todos los recursos. | La creación de un nuevo hilo es más rápida. |