Saltar al contenido principal

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:
  • 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.