RA1 · verificado

RA1 de Programación de Servicios y Procesos · DAM

Desarrolla aplicaciones compuestas por varios procesos reconociendo y aplicando principios de programación paralela.

Comprobar mi dominio con José →

Contenido verificado asociado a este RA

Fundamentos de la Programación Concurrente y Paralela

Esta unidad introduce los conceptos esenciales de la programación concurrente, paralela y distribuida, diferenciando sus características, ventajas y desventajas para establecer una base sólida en el desarrollo de aplicaciones multiproceso.

Procesos y Hilos de Ejecución: Anatomía y Relación

Esta unidad profundiza en la naturaleza de los procesos y los hilos de ejecución, analizando sus características, cómo son gestionados por el sistema operativo y su interrelación, sentando las bases para la programación de aplicaciones multiproceso.

Programación de Aplicaciones con Subprocesos y Sincronización

Esta unidad aborda la implementación práctica de la programación concurrente, enseñando a crear y gestionar subprocesos utilizando clases específicas y a aplicar mecanismos de sincronización para asegurar la integridad de los datos y la correcta coordinación entre ellos.

Gestión de Tareas en Paralelo con Pools de Hilos y Procesos del Sistema, Depuración y Documentación

Esta unidad trabaja el desarrollo de aplicaciones que gestionan múltiples tareas en paralelo mediante pools de hilos (ExecutorService) y, complementariamente, mediante procesos del sistema operativo lanzados desde Java (ProcessBuilder). Se abordan también las técnicas de depuración de problemas típicos de la concurrencia (condiciones de carrera, deadlocks, inanición) y las prácticas de documentación necesarias para que estas aplicaciones sean mantenibles.

Conceptos clave

ConcurrenciaParalelismoDistribuciónMultitareaCambio de contextoRecursos compartidosEscalabilidadTolerancia a fallosProcesoHilo de ejecución (Thread)Espacio de direccionesPila (Stack)HeapContexto de ejecuciónPlanificador (Scheduler)IPC (Inter-Process Communication)Compartición de memoriaThread

Errores que conviene evitar

  • Confundir concurrencia con paralelismo: La concurrencia es sobre manejar muchas cosas a la vez; el paralelismo es sobre hacer muchas cosas a la vez. Un sistema concurrente puede no ser paralelo (ej. un solo núcleo de CPU). Un sistema paralelo es siempre concurrente. Corrección: Entender que el paralelismo es una forma específica de lograr concurrencia, que requiere hardware multinúcleo para una ejecución simultánea real.
  • Asumir que todo problema es paralelizable: No todos los problemas pueden dividirse eficientemente en tareas independientes. Problemas con muchas dependencias secuenciales o alta comunicación entre tareas pueden no beneficiarse del paralelismo, e incluso pueden ralentizarse debido al overhead. Corrección: Analizar la estructura del problema y las dependencias de datos antes de intentar paralelizarlo.
  • Confundir la pila de un hilo con la pila del proceso: Cada hilo tiene su propia pila para almacenar variables locales y el rastro de llamadas a funciones. El proceso tiene un espacio de memoria más grande que incluye el heap y las secciones de código/datos compartidas por todos los hilos. Corrección: Visualizar el proceso como un edificio y los hilos como apartamentos dentro de él; cada apartamento tiene su propia cocina (pila) pero comparten la estructura del edificio (código, datos globales, heap).
  • Ignorar el coste del cambio de contexto: Aunque el cambio de contexto entre hilos es más barato que entre procesos, no es gratuito. Crear demasiados hilos o tener hilos que cambian de contexto constantemente puede introducir un overhead significativo que anule los beneficios del paralelismo. Corrección: Diseñar sistemas donde los hilos realicen tareas sustanciales antes de ceder la CPU, y usar pools de hilos para reutilizarlos en lugar de crearlos y destruirlos constantemente.
  • Llamar a `run()` directamente en lugar de `start()`: Si llamas a `run()`, el código se ejecutará en el hilo actual, no en un nuevo hilo. Corrección: Siempre usa `start()` para iniciar un nuevo hilo de ejecución.
  • No sincronizar el acceso a recursos compartidos: Esto lleva a condiciones de carrera y datos inconsistentes, difíciles de depurar. Corrección: Identificar todos los recursos compartidos y proteger su acceso con `synchronized` o alternativas de `java.util.concurrent.locks`.
  • Interbloqueos (Deadlocks): Ocurren cuando dos o más hilos se bloquean mutuamente esperando un recurso que el otro hilo tiene. Por ejemplo, Hilo A tiene Recurso X y espera Recurso Y; Hilo B tiene Recurso Y y espera Recurso X. Corrección: Diseñar cuidadosamente el orden de adquisición de locks, o usar mecanismos de detección/prevención de deadlocks (ej. `tryLock()` con timeout).
  • No apagar el ExecutorService: si no se llama a shutdown(), los hilos del pool pueden seguir vivos e impedir que la aplicación termine, además de consumir recursos innecesariamente. Corrección: llamar siempre a executor.shutdown() y, si procede, a awaitTermination() para un cierre ordenado.

Qué se evalúa en este RA

CE a

Se han reconocido las características de la programación concurrente y sus ámbitos de aplicación.

CE b

Se han identificado las diferencias entre programación paralela y programación distribuida, sus ventajas e inconvenientes.

CE c

Se han analizado las características de los procesos y de su ejecución por el sistema operativo.

CE d

Se han caracterizado los hilos de ejecución y descrito su relación con los procesos.

CE e

Se han utilizado clases para programar aplicaciones que crean subprocesos.

CE f

Se han utilizado mecanismos para sincronizar y obtener el valor devuelto por los subprocesos iniciados.

CE g

Se han desarrollado aplicaciones que gestionen y utilicen procesos para la ejecución de varias tareas en paralelo.

CE h

Se han depurado y documentado las aplicaciones desarrolladas.

Canal Estudios es un servicio de Skillback S.L. · NIF B2481724 · Barcelona, España
Aviso legal · Privacidad · Cookies · Términos · Atles de Catalunya