Introducción
Bienvenidos a la asignatura de Programación Concurrente.
Vivimos en una era en la que prácticamente todos los sistemas informáticos, desde los móviles hasta los grandes servidores, cuentan con procesadores multinúcleo y ejecutan aplicaciones que realizan múltiples tareas al mismo tiempo. La concurrencia no es solo una característica deseable: es una necesidad para aprovechar al máximo los recursos disponibles y para construir software eficiente, seguro y escalable.
En este curso aprenderás los fundamentos teóricos y las técnicas prácticas necesarias para diseñar y programar aplicaciones concurrentes. Nos centraremos tanto en los modelos clásicos de concurrencia (procesos, hilos, semáforos, monitores) como en su aplicación en lenguajes y entornos modernos como Java, Python, C y Rust.
El objetivo es que, al finalizar, seas capaz de:
- Comprender los principales problemas que surgen en la programación concurrente (condiciones de carrera, bloqueos, sincronización).
- Aplicar soluciones clásicas y modernas para resolver esos problemas.
- Desarrollar programas concurrentes robustos y eficientes.
Aunque no se considera una materia especialmente difícil, sí introduce conceptos nuevos que requieren trabajo constante y práctica para asimilarlos.
Profesorado y Plataformas
- Profesor:
- Enrique Mas Candela
- Profesor asociado en el DLSI
- AI Tech Lead en Facephi
- Correo: enrique.mascandela@ua.es
- Plataformas de la asignatura:
- Moodle (Campus Virtual): moodle2026-27.ua.es — Cuestionarios semanales de teoría.
- Entrega de prácticas: pracdlsi — Plataforma de entrega y corrección de prácticas.
- Publicación de notas: Web del DLSI.
- Tutorías (UA-Cloud): Reserva presencial o virtual desde UA-Cloud. Imprescindible reserva de tutorías para poder realizarlas.
- Guía docente: Ficha UA.
Contexto
La asignatura de Programación Concurrente forma parte del itinerario de Ingeniería de Computadores dentro del Grado en Ingeniería Informática de la Universidad de Alicante.
Se trata de una materia optativa, orientada a dotar al estudiante de los fundamentos y herramientas necesarios para diseñar y desarrollar programas concurrentes en diferentes entornos y lenguajes de programación.
Créditos
6 créditos ECTS (3 teoría + 3 prácticas):
- 14 sesiones de teoría (1 semanal durante un cuatrimestre) de 2 h cada una.
- 14 sesiones prácticas (1 semanal durante un cuatrimestre) de 2 h cada una.
Horarios
- Teoría: Martes 15:00-17:00
- Prácticas: Martes 17:00-19:00
Evaluación
La evaluación de la asignatura se divide en dos grandes bloques: teoría (50%) y prácticas (50%), que se evaluarán de manera independiente.
Primera convocatoria
En la primera convocatoria, tanto la teoría como las prácticas se pueden evaluar mediante evaluación continua o por una evaluación final alternativa.
Teoría (50% de la nota final)
La nota de teoría (hasta 5.0 puntos) se obtiene de la siguiente manera:
- Ejercicios y Quizzes semanales (15% - hasta 1.5 puntos): Cuestionarios semanales auto-corregibles en Moodle.
- Trabajo final de teoría (35% - hasta 3.5 puntos): Trabajo de investigación y exposición sobre un tema de concurrencia avanzada a entregar y presentar durante el mes de diciembre. Tienes más información en este enlace.
Evaluación final alternativa:
- Examen de teoría en la fecha oficial asignada por la Universidad (100% de la nota de teoría, 50% de la nota de la asignatura).
- Nota mínima: 4 sobre 10 para poder promediar con prácticas.
Prácticas (50% de la nota final)
La nota de prácticas (hasta 5.0 puntos + 1.0 punto extra) se obtiene de la siguiente manera:
- Asistencia activa (10% - 1.0 punto): Obligatoria la asistencia y participación activa a al menos el 80% de las sesiones de prácticas de laboratorio.
- Entrega de prácticas obligatorias (40% - hasta 4.0 puntos): Se entregarán un total de 3 prácticas a lo largo del cuatrimestre, con un peso del 5%, 15% y 20% respectivamente sobre la nota final.
- Práctica optativa (10% - hasta 1.0 punto): Proyecto de desarrollo concurrente opcional. Suma de forma directa sobre la nota final de la asignatura.
Criterios de corrección de prácticas:
- Las entregas constarán del código fuente (que se evaluará de forma objetiva mediante tests automatizados de correctitud y rendimiento) y una memoria analítica breve (máximo 1 o 2 páginas) que resuelva preguntas del enunciado o justifique decisiones de diseño.
- Las entregas se realizan siempre en (y sólo en) pracdlsi en las fechas publicadas.
Evaluación final alternativa:
- Examen práctico el último día de clase de prácticas (50% de la nota de prácticas, 25% de la nota de la asignatura) y la entrega de los proyectos realizados en casa (50% de la nota de prácticas, 25% de la nota de la asignatura).
- Nota mínima: 4 sobre 10 para poder promediar con teoría.
Segunda convocatoria
- Solo se llevará a cabo una evaluación final.
- Se realizará un examen de teoría y uno de prácticas.
- No se conserva la nota de la primera convocaroria.
- Para promediar teoría y prácticas es necesario obtener como mínimo un 4 en ambos bloques.
Temario
Tema 1: Conceptos fundamentales
- Concepto de Programación Concurrente
- Beneficios de la Programación Concurrente
- Concurrencia y arquitecturas hardware
- Especificación de ejecución concurrente
- Características de los sistemas concurrentes
- Problemas inherentes a la programación concurrente
Tema 2: Procesos vs. hilos
- Procesos
- Procesos en Unix/C
- Hilos
- Hilos en Java y en Unix/C
Tema 3: Primeras aproximaciones al problema de la programación concurrente
- Tipos de sincronización y su solución
- La espera ocupada para exclusión mutua
- Algoritmos de Dekker, Peterson, Hyman, Eisenberg-McGuire y Lamport
Tema 4: Semáforos
- Definición
- Resolución de problemas usando semáforos
- Implementación de semáforos
- Inconvenientes de los semáforos
Tema 5: Sincronización con Java
- Exclusión mutua en Java
- Sincronización en Java
- Uso de synchronized
- Resolución de problemas clásicos
- Semáforos binario y general
Tema 6: Monitores
- Comparativa entre Semáforos y Monitores
- Concepto y Funcionamiento
- Sincronización con monitores
- Implementación de monitores en Posix
Tema 7: Operaciones Atómicas
- Etimología y definición de atomicidad
- El problema de la reordenación de instrucciones (compilador y hardware)
- Modelos de consistencia de memoria
- Primitivas atómicas del hardware (Exchange, TestAndSet, CompareAndSwap)
- Tipos atómicos en lenguajes modernos (C++, Java, Rust)
Bibliografía
- Principios y algoritmos de concurrencia: Ricardo Galli. Ebook. 2015
- Programación concurrente: José Tomás Palma Méndez y otros. Editorial Thomson. Ed. 2003
- UNIX, programación avanzada: Francisco M. Márquez, Editorial Ra-Ma, 2004
- UNIX, programación práctica. Guía para la Concurrencia, la Comunicación y los Multihilos: Kay A. Robbins, Steven Robbins. Editorial Prentice Hall Hispanoamericana, 1997.
Consejos
-
La asignatura no es difícil pero sí tiene muchos conceptos nuevos; estudia día a día.
Para que te sirva como referencia: por cada hora de clase deberías dedicarle alrededor de hora y media de estudio en casa.
-
Dispondréis con suficiente antelación de las transparencias empleadas en clase de teoría para facilitaros el seguimiento de las mismas.