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

  1. 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.
  2. 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.
  3. Ejecutable

    • Fichero que contiene la información necesaria para crear un proceso a partir de los datos de un programa.
  4. Demonio

    • Proceso no interactivo que se ejecuta en segundo plano y proporciona servicios básicos.
  5. 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.
  6. 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).
  7. 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

  1. 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.).
  2. 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).
  3. 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.
  4. 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.
  5. Árbol de procesos

    • Relación jerárquica entre procesos, con procesos padre e hijo.
  6. 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.
  7. 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).
  8. 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.

Entradas relacionadas: