|
5
|
TEMA 5: CONTROL DE LA CONCURRENCIA EN JAVA CON API DE ALTO NIVEL Familia de objetos con acceso atómico a través del API: paquete java.util.concurrent.atomic. Uso de la clase Semaphore: métodos acquire() y release(), protocolos de control de exclusión mutua y de sincronización con objetos de clase Semaphore. Citando a todos los hilos en un mismo punto: clase CyclicBarrier y protocolo de barrera. Ajustando la granularidad de la sección crítica según convenga: la clase ReentrantLock; API, protocolo de control de exclusión mutua y sincronización con cerrojos ReentrantLock. Obteniendo variables de condición sobre un cerrojo: la interfaz Condition, API y uso. Protocolo de diseño de monitores en Java utilizando cerrojos de clase ReentrantLock y variables Condition. Otros cerrojos disponibles en el API de alto nivel. La vida es bella: utilizando clases contenedoras autosincronizadas.
|
|
|
6
|
TEMA 6: MODELOS TEÓRICOS DE CONTROL DE LA CONCURRENCIA CON PASO DE MENSAJES. MPJ-Express PARA Java ¿Y si las tareas no quieren o no pueden compartir memoria? Usando canales para comunicar a las tareas, y estructurando las tareas en torno a la comunicación mediante canales. Mensajes entre tareas. Paso de mensajes síncrono. Paso de mensajes asíncrono. Elementos básicos de la interfaz MPI. Una implementación de MPI para Java: MPJ-Express. Funciones Básicas. Tipos de Datos. Comunicadores. Comunicación punto a punto. El objeto Status y cómo utilizarlo en la práctica. Operaciones Bloqueantes. Operaciones Síncronas. Operaciones de comunicación colectiva.
|
|
|
7
|
TEMA 7: PASO DE MENSAJE INTEROBJETO EN JAVA: EL FRAMEWORK RMI RMI en Java. Modelando los objetos remotos: la interfaz Remote y su implementación. Generando resguardos: el precompilador rmic (por qué ha sido derogado). ¿Y si no generamos resguardos? Descarga dinámica de resguardos y generación automática de resguardos. El lado del servidor: la clase Naming. Activando un servicio de nombres donde registrar objetos servidores: el binario (del JDK) rmiregistry. Registrando un servicio: métodos bind() y rebind(). El cliente: protocolo de activación, localización del servicio de nombres; obteniendo una referencia al objeto remoto con el método lookup(). Transfiriendo objetos complejos: la interfaz Serializable. Limitaciones del modelo.
|
|
|
8
|
TEMA 8: SISTEMAS DE TIEMPO REAL. EL API DE TIEMPO REAL PARA JAVA (JRTS) Concepto de sistema de tiempo real. Elementos de un sistema de tiempo real. Tipos de sistemas de tiempo real. Atributos de las tareas de tiempo real, y tipos de tareas. Planificación de tareas de tiempo real: planificación estática con ejecutivo cíclico y planificación basada en prioridades. La especificación JRTS. Por qué la especificación de Java Estándar no basta para hacer tiempo real. La especificación JRTS. Nuevos tipos de memoria. Un modelo de planificación expulsivo, con 28 niveles de prioridad, y que resuelve las inversiones de prioridad. Modelando los objetos que se ejecutan: la interfaz Schedulable. Hilos RealTimeThread y NoHeapRealTimeThread. Cómo planificar esas hebras: métricas de prioridad. Planificadores predefinidos: PriorityScheduler. Planificadores propios mejorados. Gestión de Eventos Asíncronos.
|
|
|
1
|
TEMA 1: PRINCIPIOS ELEMENTALES DE LA CONCURRENCIA La era de los procesadores multi-core y many-core. Concurrencia versus paralelismo. Rendimiento. Speedup. Recursos compartidos entre tareas diferentes y su problemática: entrelazado de instrucciones, condiciones de concurso, secciones críticas y exclusión mutua. Sincronización. Corrección en Sistemas Concurrentes. Lenguajes concurrentes. Creación de entidades Concurrentes. La Taxonomía de Flynn. Multiprocesamiento Simétrico. Conceptos Elementales de Tiempo Real. Procesadores Híbridos y Hebras Virtuales.
|
|
|
9
|
SEMINARIOS:
SEMINARIOS DE PROBLEMAS (8 horas) SEMINARIO 1: Concurrencia con el Lenguaje C++23 (1.5 horas). SEMINARIO 2: Memoria Transaccional Software sobre la JVM: Clojure (1 hora). SEMINARIO 3: El Proyecto Loom: Nuevas Características en el API de Concurrencia de Java. (1.5 horas).
|
|
|
11
|
PROGRAMA DE PRÁCTICAS:
Las prácticas se desarrollarán mediante varias asignaciones de prácticas a desarrollar durante el semestre de docencia, y formarán al alumno en las técnicas de creación y control de hebras concurrentes/paralelas, técnicas para compartir memoria entre hebras, técnicas elementales de paralelismo de datos, medición de tiempos de ejecución y speedup, técnicas de control de exclusión mutua y sincronización, implementación de monitores, técnicas de programación distribuida básica, y técnicas de paso de mensajes.
En las clases de prácticas se proporcionará mediante diapositivas o pizarra el soporte conceptual y técnico necesario para que al alumno afronte la asignación con garantías. Igualmente se pondrá a disposición de los alumnos, en aquellas asignaciones donde sea necesario, una carpeta en el Campus Virtual con ejemplos de código, lecturas, etc. que den soporte al desarrollo de la asignación.
|
|
|
2
|
TEMA 2: CREACIÓN Y CONTROL DE THREADS EN JAVA Creación de threads mediante herencia de la clase Thread, implementación de la interfaz Runnable, implementación de la interfaz Callable y uso de lambda-expresiones. Modelo básico de expresión de la concurrencia en Java: métodos start()-join(). Gestión del ciclo de vida de un hilo: métodos sleep() y yield(). Gestión de ciclo con métodos derogados de control, y por qué están derogados. API de control de prioridad; los métodos getPriority() y setPriority(p). Mapping prioridades JVM a Windows y Linux. Por qué no es posible planificar con prioridades. Delegando el ciclo de vida de los threads: ejecutores y pool de threads. Ejecutores predefinidos: SingleThreadPool, FixedThreadPool y CachedThreadPool. Ejecutores altamente configurables por el programador: la clase ThreadPoolExecutor. Cómo dimensionar un pool de threads según el número de núcleos de la máquina y la tipología del problema que se tiene que resolver. Pools de threads y mejora del rendimiento en problemas de cálculo masivo y con latencia de entrada/salida grande: la ecuación de Subramanian, el coeficiente de bloqueo y cómo emplear ambos en la práctica. Cuándo y dónde utilizar un pool de threads: servidores, interfaces de usuario, etc. Ejecución asíncrona a Futuro: las interfaces Callable y Future, y cómo utilizarlas de forma adecuada.
|
|
|
3
|
TEMA 3: MODELOS TEÓRICOS DE CONTROL DE LA CONCURRENCIA CON MEMORIA COMPARTIDA Algoritmos de control de exclusión mutua con variables comunes, y por qué están obsoletos. Cerrojos. Semáforos: definición y protocolos de control de la exclusión mutua y sincronización. Sincronización compleja con semáforos: protocolo de productor-consumirdor, Regiones Críticas; protocolo de exclusión mutua. Regiones Críticas Condicionales: arquitectura y funcionamiento. Monitores: concepto, variables de condición, políticas de señalización. Disponibilidad de primitivas equivalentes en Java: bloques y métodos synchonized, clase ReentrantLock, clase Semaphore; monitores utilizando cerrojos ReentrantLock y Condition. Disponibilidad de primitivas equivalentes en C++23: las clases semaphore, mutex y condition_variable.
|
|
|
4
|
TEMA 4: CONTROL DE LA CONCURRENCIA EN JAVA CON API ESTÁNDAR Bloques de código y métodos synchronized. Protocolos de control de la exclusión mutua entre hebras utilizando unos y otros. Reentrancia. Interbloqueos, y lo fácilmente que se provocan si no presta atención. Sincronización entre hebras: los métodos de la clase Object wait(), notify() y notifyAll(). El wait-set: necesidad y funcionamiento intrínseco. Limitaciones del modelo de sincronización y necesidad del uso de condiciones de guarda. Protocolo de diseño de monitores en Java utilizando el API estándar, métodos sincronizados y condiciones de guarda.
|
|