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 web
- Profesor:
- Enrique Mas Candela
- Profesor asociado en el DLSI
- AI Tech Lead en Facephi
- Correo enrique.mascandela@ua.es
- Tutorías:
- Web de la asignatura: https://www.dlsi.ua.es/asignaturas/pc. Fuente principal de recursos de la asignatura.
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):
- 15 sesiones de teoría (1 semanal durante un cuatrimestre) de 2 h cada una.
- 15 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 y prácticas, cada uno con un peso del 50% en la nota final y que se evaluarán de manera independiente.
Primera convocatoria
En la primera convocatoria, tanto la teoría como las prácticas pueden evaluarse de dos formas:
- De manera continua, donde será obligatoria la asistencia al 80% las clases y se realizarán una serie de entregas periódicas.
- De manera final mediante un examen final de cada bloque además de la entrega de las prácticas de la asignatura.
Teoría
Evaluación continua:
- Asistencia a al menos al 80% de las sesiones de teoría.
- Se realizarán unos ejercicios semanales que se corresponden con preguntas que encontrareis en los temas de teoría. Se entregan adjuntos a una tutoria hasta una semana después de finalizado el tema correspondiente.
- Se realizará un trabajo final de teoría. Este trabajo se presentará durante el mes de diciembre. Hay más información en este enlace.
- Reparto de la nota (sobre 5 puntos):
- Ejercicios semanales: hasta 1.5 puntos.
- Trabajo final: hasta 3.5 puntos.
Evaluación final:
- Examen de teoría en la fecha oficial asignada por la Universidad,
- Nota mínima: 4 sobre 10 para poder promediar con prácticas.
Prácticas
Evaluación continua:
- Asistencia a menos al 80% de las sesiones de prácticas.
- Entrega semanal del código y la memoria en PDF de las prácticas.
- Posibilidad de realizar una práctica opcional para subir nota.
- Las entregas se realizan siempre en (y sólo en) http://pracdlsi.dlsi.ua.es en las fechas allí publicadas. Puedes entregar tantas veces como quieras, sólo se corregirá la última entrega.
- Las prácticas serán individuales.
- Reparto de la nota (sobre 5 puntos):
- Asistencia al 80% de las prácticas: 1 punto.
- Memoria de las prácticas: hasta 3.5 puntos.
- Práctica opcional: hasta 0.5 puntos.
Evaluación final:
- Examen de prácticas el último día de clases de prácticas.
- Entrega, ése mismo día, del código y la memoria de los ejercicios prácticos realizados en casa.
- 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.
- 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
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.