Procesos y Hilos en Java: conceptos clave de concurrencia, planificación y sincronización
Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones
Escrito el en
español con un tamaño de 6,86 KB
Conceptos básicos: programa, proceso y sistema operativo
Programa
- Conjunto de órdenes diseñadas y creadas a través del razonamiento lógico.
- Almacenadas en ficheros según la sintaxis de un lenguaje de programación.
- Al ejecutarse, realizan una o varias tareas en un ordenador.
Proceso
- Programa en ejecución, incluyendo código, datos, contador de programa y estado del procesador.
- Entidades independientes: pueden coexistir varios procesos ejecutando el mismo programa con diferentes datos y en distintos momentos.
Ejecutable
- Fichero que contiene la información necesaria para crear un proceso a partir de los datos de un programa.
Demonio
- Proceso no interactivo que se ejecuta en segundo plano y proporciona servicios básicos.
Sistema operativo
- Intermediario entre usuario, aplicaciones y hardware.
- Crea, ejecuta y gestiona procesos.
- Facilita el uso del ordenador y permite compartir recursos de forma eficiente.
Programación concurrente
- Permite ejecutar múltiples tareas simultáneamente.
- Puede implementarse en un único procesador, en sistemas distribuidos o en procesadores con varios núcleos (multinúcleo).
Estados de un proceso
- Nuevo, listo, en ejecución, bloqueado y terminado.
- Los estados cambian según su ejecución y las operaciones realizadas.
Gestión y planificación de procesos
Cambio de contexto
- Necesario cuando se cambia de un proceso a otro.
- Implica guardar y restaurar el contexto del proceso (registro, contador de programa, tablas de memoria, etc.).
Colas de procesos
- Organizadas para soportar la multiprogramación.
- Incluyen: cola de procesos nuevos, cola de procesos preparados (ready) y colas de dispositivos (I/O).
Planificación de procesos
- Puede ser de corto plazo (selectivo o no selectivo) y de largo plazo.
- Controla qué proceso se ejecutará y cuándo.
Creación y terminación de procesos
- La creación o terminación puede ocurrir al arranque del sistema, por llamadas al sistema, por petición del usuario o por el inicio de trabajos por lotes.
Árbol de procesos
- Relación jerárquica entre procesos, con procesos padre e hijo.
Comunicación de procesos
- Utiliza stdin, stdout y stderr para la entrada y salida estándar.
- Se pueden utilizar streams o mecanismos de comunicación interprocesos (pipes, sockets, colas de mensajes) para la comunicación entre procesos.
Sincronización de procesos
- Envío y recepción de datos como método de sincronización.
- Uso de wait() para esperar la finalización de un proceso hijo (dependiendo del sistema, llamadas como wait/waitpid en sistemas POSIX).
Multiproceso en Java
- Clase Process para representar un proceso ejecutado por la JVM.
- Métodos habituales: getOutputStream(), getInputStream(), destroy(), waitFor(), exitValue().
Hilos (threads) y programación concurrente en Java
1. Hilos en Java:
- Un hilo es la unidad básica de utilización de la CPU dentro de un proceso.
- Los hilos comparten la memoria del proceso y permiten ejecutar tareas simultáneamente.
2. Ventajas de la programación con hilos:
- Capacidad de respuesta: los hilos permiten atender peticiones del usuario mientras otras tareas se ejecutan.
- Compartición de recursos: los hilos comparten memoria y otros recursos del proceso.
- Eficiencia de memoria: no requieren reserva adicional de memoria; utilizan la memoria del proceso.
- Paralelismo real: aprovechan múltiples núcleos en sistemas multinúcleo.
3. Estados de un hilo:
- Nuevo: hilo creado pero no en ejecución.
- Runnable: hilo en ejecución o listo para ejecutarse.
- Bloqueado: hilo detenido temporalmente por diversos motivos (espera de I/O, bloqueo en sincronización).
- Muerto: hilo que ha terminado su ejecución.
4. Creación de hilos en Java:
- Implementando la interfaz Runnable o extendiendo la clase Thread.
- Métodos clave: start(), run(), join(), sleep(), interrupt(), isAlive().
5. Gestión de hilos:
- Espera de hilos: join() y sleep() para suspender temporalmente la ejecución.
- Interrupción de hilos: interrupt() para indicar al hilo que debe interrumpirse; el hilo debe comprobar su estado y responder adecuadamente.
6. Planificación de hilos:
- Java utiliza un planificador apropiativo basado en prioridades (según implementación y plataforma).
- Métodos: setPriority() y getPriority() para establecer y obtener prioridades de hilos.
7. Sincronización de hilos:
- Problemas típicos: condición de carrera, inconsistencia de memoria, inanición (starvation), interbloqueo (deadlock).
- Mecanismos de sincronización: operaciones atómicas, exclusión mediante sección crítica, semáforos (wait, signal), monitores (synchronized en Java).
8. Clase Object en Java:
- Los métodos wait() y notify() (y notifyAll()) sirven para implementar sincronización a nivel de objeto.
- Estos métodos deben utilizarse dentro de bloques synchronized.