Objetivo: Conocer los fundamentos, técnicas y aplicaciones del procesamiento paralelo y distribuido que permitan el diseño de aplicaciones que requieran cómputo de altas prestaciones.
POE Unidad 3: Aplicaciones visuales orientadas a eventos con acceso a base de...
AD Unidad2: Diseño de programas paralelos y distribuidos
1. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 1
25/12/2022
Diseño de programas
paralelos y distribuidos
Unidad 2
Material docente compilado por el profesor Ph.D. Franklin Parrales Bravo
para uso de los cursos de Aplciaciones Distribuidas
2. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 2
25/12/2022
Objetivo general de la Unidad 2
Conocer los fundamentos, técnicas y aplicaciones
del procesamiento paralelo y distribuido que
permitan el diseño de aplicaciones que requieran
cómputo de altas prestaciones.
3. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 3
25/12/2022
Unidad 2: Diseño de programas
paralelos y distribuidos
• Tecnologías y paradigmas de la programación paralela
– Cómputo Paralelo y Programación en Paralelo.
– Modelos de arquitectura (MIMD, SIMD, SISD, MISD).
– Paradigmas: programación basada en memoria compartida vs. distribuida
– Modelos de programación (Mapreduce, Hadoop, etc.).
• Algoritmos paralelos y distribuidos
– Técnicas de algoritmos paralelos (PRAM, APRAM, C3)
– Particionamiento
– Comunicación
– Aglomeración y Mapeo (PCAM)
• Equilibrio de carga de tareas
– Medición de balance de carga.
– Asignación dinámica de procesos.
– Balanceo de carga dinámico, robusto y no centralizado
• Evaluación de algoritmos paralelos y distribuidos
4. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 4
25/12/2022
Introducción
Paralelismo: hacer más de una cosa
“simultáneamente, a la vez”.
• tamaño de datos: 4 - 8 - 16 - 32 - 64 - ... bit
• ejecución de instrucciones (ILP):
segmentación, superescalares, VLIW...
• paralelismo de datos/
paralelismo funcional o de programas
5. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 5
25/12/2022
Introducción
• Los problemas que pueden resolverse mediante
un algoritmo paralelo son, obviamente, muy
heterogéneos.
• Suelen ser problemas de complejidad elevada,
aún no perteneciendo al grupo de problemas
intratables (el número de operaciones crece de
forma rápida –p.e. exponencial– con el tamaño
del problema).
8. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 8
25/12/2022
Introducción
Dentro del conjunto de problemas tratables (el
número de operaciones crece polinómicamente con el
tamaño del problema) se suelen dar dos situaciones
que hacen necesaria la programación paralela:
- Problemas de gran dimensión
- Problemas de tiempo real
Otro tipo de problemas: problemas de gran desafío,
por su relevancia social (genoma humano,
meteorología, clima, fenómenos sísmicos…).
9. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 9
25/12/2022
Unidad 2: Diseño de programas
paralelos y distribuidos
• Tecnologías y paradigmas de la programación paralela
– Cómputo Paralelo y Programación en Paralelo.
– Modelos de arquitectura (MIMD, SIMD, SISD, MISD).
– Paradigmas: programación basada en memoria compartida vs. distribuida
– Modelos de programación (Mapreduce, Hadoop, etc.).
• Algoritmos paralelos y distribuidos
– Técnicas de algoritmos paralelos (PRAM, APRAM, C3)
– Particionamiento
– Comunicación
– Aglomeración y Mapeo (PCAM)
• Equilibrio de carga de tareas
– Medición de balance de carga.
– Asignación dinámica de procesos.
– Balanceo de carga dinámico, robusto y no centralizado
• Evaluación de algoritmos paralelos y distribuidos
10. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 10
25/12/2022
Cómputo Paralelo
• Procesadores: El programa ejecuta en un conjunto de
procesadores que están fuertemente ligados
• Ligazón (comunicación)
• Los procesadores cooperan íntimamente y se sincronizan
• Los procesadores comparten memoria principal
• Los procesadores comparten otros recursos del ordenador
(periféricos, etc.)
• Requiere:
• Se requiere el hardware de un ordenador
• Se requiere el hardware de varios procesadores (CPUs)
• Se requiere un mecanismo de interconexión y control de los
procesadores
• Ejemplo: Ejecución de programas en un ordenador con
núcleo dual.
• Cuestión: ¿Puede un mismo programa secuencial ejecutar en
múltiples procesadores?
11. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 11
25/12/2022
Modelos de Programación Paralela
• La mayoría de los esfuerzos en
paralelización están dentro de las
siguientes categorias:
– Códigos pueden ser paralelizados usando
librerías de paso de mensaje tal como MPI.
– Códigos pueden ser paralelizados usando
directivas de compilación tal como OpenMP.
– Códigos pueden ser escritos en nuevos
lenguajes paralelos.
12. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 12
25/12/2022
Diferentes modelos sobre distintos aspectos de la
programación paralela:
- Modelo arquitectónico: arquitectura de la máquina
-- multiprocesadores: memoria compartida
-- multicomputadores: paso de mensajes
-- modelos mixtos
- Modelo de programación: herramientas de alto nivel
(OpenMP, MPI).
- Modelo de coste: permite evaluar el coste del
algoritmo.
Programación en Paralelo
13. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 13
25/12/2022
Es diferente paralelizar un algoritmo o programa
secuencial, que programar en paralelo una
aplicación desde el comienzo.
En el primer caso, interesa detectar aquellas partes
del código con un mayor coste computacional.
Lo más habitual es utilizar trazas, timers, profiling, etc., y ejecutar en
paralelo aquellas partes que ofrecen un buen rendimiento (por
ejemplo, paralelismo incremental de OpenMP).
Programación en Paralelo
14. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 14
25/12/2022
En el segundo caso, se empieza analizando las carac-
terísticas de la propia aplicación, para determinar
el/los algoritmos paralelos más adecuados.
OJO: conviene partir de un buen algoritmo ya optimizado (¡no hay que
reinventar la rueda!).
Aunque no hay un “camino único”, se suele
recomendar utilizar un determinado procedimiento o
metodología.
Programación en Paralelo
15. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 15
25/12/2022
PARALELIZADOR
AUTOMÁTICO
DIRECTIVAS
OPENMP
DIRECTIVAS
HPF
THREADS PASO DE
MENSAJES
TIEMPO
DE
DESARROLLO
MODELO DE PROGRAMACIÓN
GRANO GRUESO
REHACER EL CÓDIGO
GRANO FINO
RETOCAR EL CÓDIGO
La Solución Depende de (Tiempo, Dinero, Rendimiento)
16. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 16
25/12/2022
La programación paralela añade, respecto a la
programación secuencial, una serie de aspectos a
tener en cuenta:
- Concurrencia (sincronización, comunicación).
- Asignación de datos y código a procesadores.
- Acceso simultáneo a datos compartidos
(sincronización).
- Escalabilidad.
Programación en Paralelo
17. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 17
25/12/2022
Otra diferencia entre la programación secuencial y la
paralela es la forma en que los módulos que
componen una aplicación se pueden ensamblar:
- Composición secuencial: los módulos se ejecutan
secuencialmente.
- Composición paralela: diferentes módulos se ejecutan
simultáneamente sobre conjuntos disjuntos de procesos
(escalabilidad y localidad).
- Composición concurrente: diferentes módulos se
ejecutan concurrentemente sobre los mismos procesos
(solapamiento computación y comunicación).
Programación en Paralelo
18. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 18
25/12/2022
Concurrencia
• El acceso concurrente a datos compartidos puede
resultar en inconsistencias
• Mantener la consistencia de los datos requiere el
uso de mecanismos que aseguren la ejecución
ordenada de procesos que cooperan
• La concurrencia implica las siguientes cuestiones de
diseño:
– Comunicación entre procesos.
– Compartición y competencia por los recursos.
– Sincronización de la ejecución de varios procesos.
– Asignación del tiempo de procesador a los procesos.
19. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 19
25/12/2022
Coordinación de procesos
• Los procesos en algunos casos deben coordinarse y compartir
información.
• Los mecanismos de coordinación de procesos garantizan la
exclusión mutua para los recursos compartidos.
• Cuando un proceso está modificando un recurso compartido,
otros procesos no deberían poder cambiar ese recurso.
• Al diseñar el intercambio de información entre procesos, debe
tener en cuenta el hecho de que estos procesos pueden estar
funcionando a diferentes velocidades.
– Un proceso genera información; el otro proceso consume esa
información.
– Si el productor se ejecuta más rápido que el consumidor,
nueva información podría sobrescribir un ítem de información
leído previamente antes de que el proceso consumidor lea la
información original.
– Si el proceso consumidor se ejecuta más rápido que el
proceso productor, el mismo ítem podría leerse dos veces.
20. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 20
25/12/2022
Condiciones de Carrera
(race conditions)
• Problema
– Las condiciones de carrera se dan cuando:
• varios procesos accesan y manipulan los mismos
datos concurrentemente, y
• el resultado final depende del orden particular en
que los accesos se llevaron a cabo
• Solución
– Usar mecanismos de sincronización para que
solamente un proceso pueda manipular los
datos a la vez
21. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 21
25/12/2022
Condiciones de Carrera
(race conditions)
• Problema
– Las condiciones de carrera se dan cuando:
• varios procesos accesan y manipulan los mismos
datos concurrentemente, y
• el resultado final depende del orden particular en
que los accesos se llevaron a cabo
• Solución
– Usar mecanismos de sincronización para que
solamente un proceso pueda manipular los
datos a la vez
22. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 22
25/12/2022
Ejemplo de variable compartida con
condición de carrera
thread A:
run() { v = v + 1; }
thread B:
run() { v = v * 2; }
v = 5
v = 12 v = 11
RMW issues
Read-Modify-Write
v = 6 v = 10
23. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 23
25/12/2022
Ejemplo de variable compartida con
condición de carrera
thread A:
run() { v = v + 1; }
thread B:
run() { w = v * 2; }
v = 5
v = 6
w = 12
v = 6
w = 10
RMW issues
Read-Modify-Write
24. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 24
25/12/2022
Sección Crítica
• Zonas críticas
– secciones del programa que sólo debe ejecutar un
thread en un momento dado, o habría problemas
• Protocolo
– si está ocupado, espero
– si está libre
• Entro
– cierro por dentro
• hago mis cosas – yo solito
• Salgo
– dejo abierto
– si hay alguien esperando, que entre
– si no, queda abierto
java mantiene una cola de
threads esperando
a que el cerrojo(lock) se abra
todo esto es indivisible
ATÓMICO
25. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 25
25/12/2022
Operación atómica
– la que se ejecuta sin cambiar de thread
– ejemplo
• int n = v++;
NO es atómica => posibles carreras
– solución: envolverla
– véase AtomicInteger
class IntAtomico {
private int v;
synchronized int inc() {
v++;
return v;
}
}
IntAtomico va = new IntAtomico();
int n = va.inc();
26. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 26
25/12/2022
AtomicInteger
• java.util.concurrent.atomic
• AtomicInteger class AtomicCounter {
private AtomicInteger c = new AtomicInteger(0);
public void increment() {
c.incrementAndGet();
}
public void decrement() {
c.decrementAndGet();
}
public int value() {
return c.get();
}
27. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 27
25/12/2022
Estados de un thread(hilo o hebra)
new Thread()
NEW
start()
RUNNABLE
BLOCKED
WAITING
TIMED WAITING
TERMINATED
28. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 28
25/12/2022
Problema de la Sección Crítica
1. Exclusión mutua: Si el proceso Pi está
ejecutando su sección crítica, ningún otro
proceso puede estar ejecutando la suya
2. Progreso: Si ningún proceso está ejecutando su
sección crítica y existe algún otro proceso que
desea entrar a la suya, entonces ese proceso no
puede posponerse indefinidamente
3. Espera limitada: Debe haber un límite en el
número de veces que otros procesos pueden
entrar a sus secciones críticas después de que
un proceso a solicitado entrar a la suya, y antes
de que se le otorgue el acceso a ese proceso
29. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 29
25/12/2022
Sincronización en Java
• no estructuradas
– locks
– Semáforos
– barreras
• estructuradas
– bloques synchronized
– métodos synchronized
– monitores
30. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 30
25/12/2022
Lock (candado o cerrojo)
• Un cerrojo proporciona exclusión mutua en el acceso
a datos compartidos.
• El cerrojo es una variable de dos estados (libre y
ocupado) y tiene dos operaciones públicas:
– Acquire (lock)– Espera a que el cerrojo esté libre y lo
adquiere.
– Release (unlock)– Libera el cerrojo; si había alguien
esperando en Acquire, se lo entrega a alguno de los
procesos que esperan.
• Inicialmente, se considera que el cerrojo está libre. Un
cerrojo puede ser considerado como un semáforo
binario inicializado a true.
• Para acceder a datos compartidos en exclusión
mutua, se usa un cerrojo. Antes de usar los datos
compartidos se llama a Acquire y tras manipular los
datos, se libera el cerrojo con Release
31. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 31
25/12/2022
Lock (candado o cerrojo)
• el mecanismo de cerrojos alrededor de zonas
de acceso exclusivo
– es un mecanismo pesimista
• siempre me protejo por si acaso
– puede hacer que una thread quede esperando a
que otra termine
• si la otra casca, puede esperar eternamente
• puede ser que una tarea de alta prioridad quede
esperando a que termine otra de menor prioridad
– priority inversión
32. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 32
25/12/2022
Priority inversión
• C (prioridad baja) cierra un lock
• A (prioridad alta) quiere el lock que tiene C
• B (prioridad media) monopoliza la cpu
• resultado
– B se lo lleva todo mientras A espera tontamente
ej: https://en.wikipedia.org/wiki/Mars_Pathfinder
33. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 33
25/12/2022
Continuando con… Lock (candado o cerrojo)
Un ReentrantLock es un mecanismo de exclusión mutua
que permite que los subprocesos vuelvan a entrar en un lock
sobre un recurso (varias veces) sin una situación de
interbloqueo.
• package java.util.concurrent.locks
– interface Lock
– class ReentrantLock implementa Lock
• OJO:
– hay que asegurarse de que se libera el cerrojo; por
ejemplo, si hay excepciones
lock.lock();
... operaciones ...
lock.unlock();
try {
lock.lock();
zona exclusiva
} finally {
lock.unlock();
}
34. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 34
25/12/2022
Lock: estado compartido protegido
public class Contador {
private int cuenta = 0;
private final Lock LOCK = new ReentrantLock();
nadie puede
meterse
por enmedio estado protegido
public int incrementa(int v) {
try {
LOCK.lock();
cuenta += v;
return cuenta;
} finally {
LOCK.unlock();
}
}
public int decrementa(int v) {
try {
LOCK.lock();
cuenta -= v;
return cuenta;
} finally {
LOCK.unlock();
}
}
35. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 35
25/12/2022
Lock: atomicidad
• las operaciones lock() y unlock()
son indivisibles
– no se permite que un thread se vea desplazado
por otro mientras se están ejecutando
• esta misma propiedad sirve para todas las
formas de sincronización:
– semáforos y bloques sincronizados
36. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 36
25/12/2022
Lock: Variables de Condición
Lock cerrojo;
InsertaEnCola() {
cerrojo.Acquire();
añade un elemento en la cola;
cerrojo.Release();
}
ExtraeDeCola() {
cerrojo.Acquire();
if (algo en la cola)
extrae(cosa);
cerrojo.Release();
return cosa;
}
v1
v2
v3
Proceso productor
Proceso consumidor
La rutina ExtraeDeCola() debería esperar a que hubiera algún elemento en la cola.
• Si lo que hacemos es sleep(dormir) al hilo hasta que alguien deposite un
elemento en la cola, resulta que el programa se bloquea, ya que al estar retenido
el cerrojo, ningún otro hilo puede manipular la cola.
• Por tanto hay que liberar el cerrojo antes de esperar.
37. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 37
25/12/2022
Variables de Condición
• Como vemos, el ejemplo de
la cola circular nos muestra
un problema que los cerrojos
no son capaces de resolver.
• Una posible solución sería…
ExtraeDeCola() {
cerrojo.Acquire();
while (cola vacía) {
cerrojo.Release();
cerrojo.Acquire();
}
extrae(cosa);
cerrojo.Release();
return cosa;
}
Esta solución funciona, pero utiliza espera
activa: el hilo está continuamente entrando
y saliendo de la sección crítica para revisar
si la cola está vacía.
38. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 38
25/12/2022
Variables de Condición
• La idea de las variables condición es tener un
mecanismo que permita a un proceso
– abandonar una sección crítica y a la misma vez
– quedarse bloqueado en espera de una condición que alguien le
debe notificar.
• Variable condición: representa una cola de hilos que
esperan algo (una condición) dentro de una sección
crítica (indicada por un cerrojo).
• Hay dos operaciones posibles:
– x.wait() – un proceso que invoca la operación es suspendido
– x.signal() – se continúa a uno de los procesos que invocaron
x.wait()
• Sólo se permite trabajar con una variable condición si
disponemos del cerrojo.
39. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 39
25/12/2022
Variables de Condición
• La solución al problema de la cola, con variables de
condición, tendría esta forma:
Lock cerrojo;
Condition condición;
InsertaEnCola() {
cerrojo.Acquire();
añade un elemento en la cola;
condición.signal(&cerrojo); // avisamos de que hay algo
cerrojo.Release();
}
ExtraeDeCola() {
cerrojo.Acquire();
while (cola vacía)
condición.Wait(&cerrojo); // nos bloqueamos hasta que nos
// hagan signal()
extrae(cosa);
cerrojo.Release();
return cosa;
}
40. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 40
25/12/2022
Variables de Condición
Lock cerrojo;
InsertaEnCola() {
cerrojo.Acquire();
añade un elemento en la cola;
condición.signal(&cerrojo);
cerrojo.Release();
}
ExtraeDeCola() {
cerrojo.Acquire();
while (cola vacía)
condición.Wait(&cerrojo);
extrae(cosa);
cerrojo.Release();
return cosa;
}
v4
Proceso productor
Proceso consumidor
signal
41. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 41
25/12/2022
RentrantLock con variables de
condición
Una variable de condición se crea la primera vez que se
crea un ReentrantLock y se invoca su newCondition() :
Luego, se puede invocar sus métodos wait() y signal()
entre lock y unlock
42. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 42
25/12/2022
RentrantLock con variables de
condición
• colas dentro de un cerrojo
15
public void InsertaEnCola(E x)
throws InterruptedException {
lock.lock();
while (data.size() >= SIZE)
isFull.await();
data.add(x);
isEmpty.signalAll();
lock.unlock();
}
public E ExtraeDeCola()
throws InterruptedException {
lock.lock();
while (data.isEmpty())
isEmpty.await();
E value = data.remove(0);
isFull.signalAll();
lock.unlock();
return value;
}
private Lock lock = new ReentrantLock();
private Condition isEmpty = lock.newCondition();
private Condition isFull = lock.newCondition();
private final List<E> data = new ArrayList<>(size);
43. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 43
25/12/2022
Sincronización en Java
• no estructuradas
– locks
– Semáforos
– barreras
• estructuradas
– bloques synchronized
– métodos synchronized
– monitores
44. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 44
25/12/2022
Semáforos
• Otro mecanismo que pueden utilizar los
threads para proteger secciones de código
son los semáforos.
• Las operaciones principales son:
– esperar a que el contador sea distinto de 0 y le
resta 1 al contador antes de continuar sumar 1 al
contador
– Si el contador es 0 indicará que el thread no
puede acceder a la sección crítica, y
– Si es >0, podrán acceder tantos threads como
valor tenga el contador.
46. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 46
25/12/2022
Semáforos
• package java.util.concurrent
– class Semaphore
• Semaphore (int permisos)
• semáforo binario: gestiona 1 permiso de acceso
– void acquire()
– void release()
• semáforo general: gestiona N permisos
– void acquire(int n)
• solicita N permisos del semáforo
si no hay bastantes, espero
• cuando los haya, sigo
– void release(int n)
• devuelvo N permisos al semáforo
• si hay alguien esperando, se intenta satisfacerle
47. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 47
25/12/2022
Semáforo binario
semaforo.acquire();
... operaciones ...
semaforo.release();
semaforo.acquire();
try {
... operaciones ...
} finally {
semaforo.release();
}
48. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 48
25/12/2022
Semáforo binario
• Correcto uso de operaciones:
– semaforo.acquire() …. semaforo.release()
• Mal uso de operaciones:
– semaforo.acquire() … semaforo.acquire()
– Omitir semaforo.acquire() o
semaforo.release() (o ambos)
49. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 49
25/12/2022
Uso de los semáforos
1. limitar el número de threads en la zona crítica
16
Semaphore sm = new Semaphore(5) # Max: 5-threads
InputStream fetch_page(String ref):
sm.acquire();
try {
URL url = new URL(ref);
return url.openStream();
} finally {
sm.release();
}
Semaphore semaphore = new Semaphore(N)
semaphore.acquire();
try {
… zona crítica …
} finally {
semaphore.release();
}
50. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 50
25/12/2022
Uso de los semáforos
2. coordinar threads
thread_1
stmt_1;
stmt_2;
done.release();
stmt_3;
stmt_4;
Semaphore done = new Semaphore(0)
thread_2
stmt_1;
stmt_2;
done.acquire();
stmt_3;
stmt_4;
51. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 51
25/12/2022
Ejemplo de Semáforo
public class Parking {
private final int capacidad; // número de coches que caben
private final Semaphore semaphore;
// constructor
public ParkingSemaphore(int capacidad) {
this.capacidad = capacidad;
semaphore = new Semaphore(capacidad);
}
// barreras de entrada
public void entra() throws InterruptedException {
semaphore.acquire(1);
}
// barreras de salida
public void sale() {
semaphore.release(1);
}
52. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 52
25/12/2022
Ejemplo de semáforo con N permisos
public class EsperaNTareas {
public static void main(String[] args)
throws InterruptedException {
Semaphore contador = new Semaphore(0);
List<Tarea> tareas = new ArrayList<Tarea>();
tareas.add(new Tarea(contador));
// ... N veces
for (Tarea tarea : tareas)
tarea.start();
// espera a que todas acaben
contador.acquire(tareas.size());
}
}
53. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 53
25/12/2022
Ejemplo de semáforo con N permisos
public class Tarea extends Thread {
private Semaphore contador;
public Tarea( Semaphore contador ){
this.contador = contador;
}
public void run() {
// hace su tarea
contador.release();
}
}
54. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 54
25/12/2022
Semáforos vs. Variables de condición
• Una diferencia fundamental entre
semáforos y variables condición es que
éstas no tienen memoria.
– En las variables de condición, si alguien
ejecuta una operación signal sin que nadie
haya estado esperando, esa operación se
pierde para siempre,
– mientras que en un semáforo se “recuerda”
para posteriores waits.
55. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 55
25/12/2022
Semáforos vs. ReentrantLock
• Ningún thread es propietario de un semáforo
binario.
– Sin embargo, el último thread que bloqueó(locked)
correctamente un recurso es el propietario de un
reentrantLock.
• Un semáforo binario proporciona un mecanismo
de sincronización de alto nivel al permitir una
implementación personalizada de un mecanismo
de bloqueo y recuperación de interbloqueos. Por
lo tanto, da más control a los desarrolladores.
– Sin embargo, el reentrantLock es un mecanismo de
sincronización de bajo nivel con un mecanismo de
bloqueo fijo(fixed locking).
56. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 56
25/12/2022
Semáforos vs. ReentrantLock (cont…)
• Los semáforos binarios proporcionan un
mecanismo de liberación no apropiativa.
– Por lo tanto, cualquier subproceso puede liberar el
permiso para la recuperación de un interbloqueo
de un semáforo binario.
• Por el contrario, la recuperación de
interbloqueo es difícil de lograr en el caso de
un ReentrantLock.
– Por ejemplo, si el subproceso propietario de un
ReentrantLock entra en modo de suspensión o
espera infinita, no será posible liberar el recurso y
se producirá una situación de interbloqueo.
57. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 57
25/12/2022
Comentarios sobre locks y semáforos
• son de bajo nivel
• primitivas independientes
• requieren que todos colaboren
• se puede hacer cualquier cosa, esten bien
o no
– abrir y cerrar no están necesariamente
emparejados sintácticamente
58. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 58
25/12/2022
Sincronización en Java
• no estructuradas
– locks
– Semáforos
– barreras
• estructuradas
– bloques synchronized
– métodos synchronized
– monitores
59. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 59
25/12/2022
Barreras
• Este mecanismo de sincronización está
destinado a los grupos de procesos
• Algunas aplicaciones se dividen en fases y
tienen la regla de que ningún proceso puede
continuar a la siguiente fase sino hasta que
todos los procesos estén listos para hacerlo.
• Para lograr este comportamiento, se coloca
una barrera al final de cada fase.
• Cuando un proceso llega a la barrera, se
bloquea hasta que todos los procesos han
llegado a ella.
60. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 60
25/12/2022
Barreras
• La operación de una barrera se ilustra en la figura
Uso de una barrera. (a) Procesos que se acercan a una barrera. (b) Todos
los procesos menos uno bloqueados en la barrera. (c) Cuando el último
proceso llega a la barrera, se deja pasar a todos.
Barrera
A
B
C
D
Proceso
Tiempo
(a)
Barrera
A
B
C
D
Tiempo
(b)
Barrera
A
B
C
D
Tiempo
(c)
61. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 61
25/12/2022
Barreras en java: CyclicBarrier
• CyclicBarrier(int required)
– Una sincronización que permite que un conjunto
de subprocesos esperen unos a otros para llegar
a un punto de barrera común.
• void await()
versión con código a ejecutar cuando se abre
• CyclicBarrier(int parties, Runnable action)
63. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 63
25/12/2022
Sincronización en Java
• no estructuradas
– locks
– Semáforos
– barreras
• estructuradas
– bloques synchronized
– métodos synchronized
– monitores
64. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 64
25/12/2022
Sincronización en Java
• Java proporciona sincronización a nivel del
lenguaje
• Cada objeto en Java tiene asociado un lock
– Se adquiere al invocar un método synchronized
– Se libera cuando se sale del método synchronized
• Hilos que esperan por adquirir un objeto lock se
colocan en el entry set (conjunto de espera)
para ese objeto lock
Cada objeto tiene
asociado un entry set.
65. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 65
25/12/2022
Sincronización en Java (cont.)
Métodos insert() y remove() synchronized
¿Problemas?
66. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 66
25/12/2022
Recordando… Modelo de estados
wait set
entry set Object lock
67. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 67
25/12/2022
Sincronización en Java: wait/notify()
• Cuando un hilo invoca wait():
1. El hilo libera el objeto lock
2. El estado del hilo se coloca en Blocked
3. El hilo se coloca en el wait set del objeto
• Cuando un hilo invoca notify():
1. Un hilo arbitrario del wait set se selecciona
2. T se mueve del wait set al entry set
3. El estado de T se coloca en Runnable
Entry set y wait set
68. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 68
25/12/2022
Sincronización en Java (cont.)
• Llamar a notify() selecciona un hilo arbitrario del
wait set
– Es posible que el hilo seleccionado no esté esperando
por la condición por la que ha sido notificado
• La llamada a notifyAll() selecciona todos los
hilos en el wait set y los mueve a todos al entry
set
• En general notifyAll() es una estrategia más
conservadora que notify()
69. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 69
25/12/2022
Sincronización en Java
• no estructuradas
– locks
– Semáforos
– barreras
• estructuradas
– bloques synchronized
– métodos synchronized
– monitores
70. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 70
25/12/2022
Bloques synchronized
• synchronized (objeto) {
// zona de exclusión mutua
}
synchronized (cc) {
... operaciones ...
}
cc: Object compartido
el cerrojo se libera al salir del
bloque:
• última sentencia
• return interno
• excepción
71. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 71
25/12/2022
Estado compartido protegido
public class Contador {
private int cuenta = 0;
private final Object LOCK = new Object();
public int incrementa(int v) {
synchronized (LOCK) {
cuenta += v;
return cuenta;
}
}
public int decrementa(int v) {
synchronized (LOCK) {
cuenta -= v;
return cuenta;
}
}
72. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 72
25/12/2022
Bloques Mutex
• Un mutex es un dispositivo de exclusión mutua
útil para proteger estructuras de datos
compartidas de modificaciones concurrentes, y
para implementar secciones críticas y monitores.
• Los mutex tienen dos estados posibles:
– Unlocked/release (libre, no ocupado por ningún
thread) o
– Locked/acquire (ocupado por un thread).
• Un mutex nunca puede estar ocupado por más de
un thread
• Si un thread intenta ocupar un mutex ya ocupado,
quedará a la espera de que el thread que tienen el
mutex lo libere.
73. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 73
25/12/2022
Bloques Mutex
• Los mutex permiten bloquear una parte del
código, de forma que ningún otro hilo de
ejecución pueda accederla mientras no se
libere el bloqueo.
• De esta forma, si los threads bloquean el
código que comprueba el número de
entradas que quedan y lo liberan después de
realizada la venta, obligamos a que primero
se ejecute la parte crítica un proceso y luego
la otra.
74. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 74
25/12/2022
Bloques Mutex
En lugar de sincronizar todo un método, se puede
sincronizar bloques de código
75. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 75
25/12/2022
Bloques Mutex
Sincronización de bloques usando wait()/notify()
76. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 76
25/12/2022
¿Mutex es un semáforo binario?
• Se suele decir que mutex es un
semáforo binario que garantiza la
exclusión mutua en las operaciones que
se ejecutan sobre el semáforo
general…¡Pero no lo es!
• El propósito de mutex y semáforo es
diferente. Tal vez, debido a la similitud en
su implementación, un mutex podría
parecerse a un semáforo binario.
77. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 77
25/12/2022
¿Mutex es un semáforo binario?
Mutex
• Estrictamente hablando, un
mutex es un mecanismo de
bloqueo utilizado para
sincronizar el acceso a un
recurso.
– Solo una tarea (puede ser un
subproceso o un proceso
basado en la abstracción del
sistema operativo) puede
adquirir la exclusión mutua.
• Significa que hay propiedad
asociada con un mutex, y solo
el propietario puede liberar el
bloqueo (mutex).
Semáforos
• El semáforo es un mecanismo
de señalización (señales del
tipo "Terminé, puedes
continuar…").
– Por ejemplo, si está
escuchando canciones
(suponga que es una tarea) en
su teléfono móvil y, al mismo
tiempo, su amigo lo llama, se
activa una interrupción en la
que una rutina de interrupción
de servicio(ISR) señala
despertar(wakeup) la tarea de
procesamiento de llamadas.
78. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 78
25/12/2022
Sincronización en Java
• no estructuradas
– locks
– Semáforos
– barreras
• estructuradas
– bloques synchronized
– métodos synchronized
– monitores
79. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 79
25/12/2022
Métodos synchronized
• usando this como cerrojo
– es lo mismo…
pero escribes menos y te equivocas menos
public synchronized int incrementa(int v) {
cuenta += v;
return cuenta;
}
public synchronized int decrementa(int v) {
cuenta -= v;
return cuenta;
}
80. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 80
25/12/2022
Comentarios sobre bloques y métodos
synchronized
• son de alto nivel
• delimitan una zona
• requieren que todos colaboren
• un thread que ya posee un cerrojo puede entrar
en zonas protegidas por el mismo cerrojo
– esto permite que un método synchronized llame a
otro método synchronized
81. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 81
25/12/2022
Sincronización en Java
• no estructuradas
– locks
– Semáforos
– barreras
• estructuradas
– bloques synchronized
– métodos synchronized
– monitores
82. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 82
25/12/2022
Monitores
• clases donde
– se monitoriza toda modificación del estado
• el estado es privado
• todos los accesos son zonas críticas
• en java
– todos las campos son privados
– todos los métodos son synchronized
83. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 83
25/12/2022
Monitores: Ejemplo
public class Contador {
private int cuenta = 0;
public synchronized int getCuenta() {
return cuenta;
}
public synchronized int incrementa(int v) {
cuenta += v;
return cuenta;
}
public synchronized int decrementa(int v) {
cuenta -= v;
return cuenta;
}
}
synchronized garantiza
•
•
acceso exclusivo
variables actualizadas
84. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 84
25/12/2022
Monitores
• Abstracción de alto
nivel que proporciona
un mecanismo efectivo
y conveniente para la
sincronización entre
procesos
• Solo un proceso puede
estar activo dentro del
monitor en un
momento dado
Sintaxis de un Monitor
86. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 86
25/12/2022
Monitores
• SO provee semáforos o mutexes.
• Lenguaje provee enunciados para monitores.
• Compilador usa primitivas del SO para
traducir los procedimientos del monitor de tal
manera que se considere la exclusión mutua.
• Programador no se preocupa de codificar
semáforos
• Programador sólo debe incluir las secciones
críticas como parte de un procedimiento de
monitor.
87. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 87
25/12/2022
Monitor y Variable de condición
• Los procedimientos en un monitor se pueden
llamar siempre considerando la exclusión
mutua.
• Existe acceso coordinado a buffers y
variables compartidos.
• Pero como un proceso puede ir a sleep si no
pudiera continuar?
– Si necesitara que se complete un evento
– Tal vez este evento debe ser generado por otro
proceso.
88. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 88
25/12/2022
Monitor y Variable de condición (cont…)
• Solución:
– Uso de variables de condición, y
– Uso de operaciones wait() y signal() en esas
variables
• Si un proceso necesita bloquearse:
– (Por ejemplo, buffer está lleno y productor no
debe colocar más información)
– Proceso llama wait() en alguna variable de
condición x.
89. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 89
25/12/2022
Monitor y Variable de condición (cont…)
• Cuando otro proceso quiere desbloquear
al proceso que está durmiendo:
– (por ejemplo?).
– El proceso llama signal() en la misma variable
de condicion x.
• Las variables de condición NO SON
CONTADORES.
– No almacenan señales signal.
– signal() debe ser llamado después de wait().
91. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 91
25/12/2022
Unidad 2: Diseño de programas
paralelos y distribuidos
• Tecnologías y paradigmas de la programación paralela
– Cómputo Paralelo y Programación en Paralelo.
– Modelos de arquitectura (MIMD, SIMD, SISD, MISD).
– Paradigmas: programación basada en memoria compartida vs. distribuida
– Modelos de programación (Mapreduce, Hadoop, etc.).
• Algoritmos paralelos y distribuidos
– Técnicas de algoritmos paralelos (PRAM, APRAM, C3)
– Particionamiento
– Comunicación
– Aglomeración y Mapeo (PCAM)
• Equilibrio de carga de tareas
– Medición de balance de carga.
– Asignación dinámica de procesos.
– Balanceo de carga dinámico, robusto y no centralizado
• Evaluación de algoritmos paralelos y distribuidos
92. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 92
25/12/2022
Flynn's Taxonomy of Computers
Instructions applied
single multiple
Data
manipulated
single
multiple
SISD – single-
threaded process
MISD – pipeline
architecture
(uncommon)
SIMD – vector
processing
MIMD – multi-
threaded
programming
93. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 93
25/12/2022
Flynn's Taxonomy of Computers
Instructions applied
single multiple
Data
manipulated
single
multiple
94. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 94
25/12/2022
Flynn's Taxonomy of Computers
• SISD: Un único procesador ejecuta un solo flujo de instrucciones,
para operar sobre datos almacenados en una única memoria.
– Se corresponde con la arquitectura de Von Neumann.
• MISD: muchas unidades funcionales realizan diferentes
operaciones en los mismos datos.
• SIMD: misma instrucción, pero operan sobre diferentes conjuntos
de datos.
– Es decir, la misma instrucción es ejecutada de manera sincronizada por
todas las unidades de procesamiento.
• MIMD: tienen un número de procesadores que funcionan de manera
asíncrona e independiente.
– En cualquier momento, cualquier procesador puede ejecutar diferentes
instrucciones sobre distintos datos.
– Los sistemas distribuidos suelen clasificarse como arquitecturas MIMD;
bien sea explotando un único espacio compartido de memoria, o uno
distribuido
95. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 95
25/12/2022
Clasificaciones adicionales
• Un programa, múltiples datos (SPMD)
– Múltiples procesadores autónomos que trabajan
simultáneamente sobre el mismo conjunto de instrucciones
(aunque en puntos independientes) sobre datos diferentes.
– También se le llama 'un proceso, múltiples datos'.
• Múltiples programas, múltiples datos (MPMD)
– Múltiples procesadores autónomos que trabajan
simultáneamente sobre al menos dos programas
independientes.
– Normalmente este sistema elige a un nodo para ser el host o
administrador, que corre el programa y otorga los datos a todos
los demás nodos que ejecutan un segundo programa.
– Esos demás nodos devuelven sus resultados directamente al
administrador.
– Un ejemplo podría ser la consola de Sony PlayStation 3, que
tiene la arquitectura de procesador SPU/PPU.
96. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 96
25/12/2022
Introducción
Paralelismo
SIMD: Single-Instruction-Multiple-Data
- procesadores vectoriales
- procesadores en array
- GPUs
MIMD: Multiple-Instruction-Multiple-Data
Muchos procesos/hilos para dar una
respuesta más rápida (high performance)
(multiproceso, tolerancia a fallos, P copias (throughput))
97. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 97
25/12/2022
Modelos de Programación Arquitecturas
• Correspondecia natural
– Paralelismo de datos → CM-2 (máquina SIMD)
– Paso de mensaje → IBM SP (MPP)
– Memoria compartida → SGI Origin, Sun E10000
• Correspondencia implementada
– HPF (un lenguaje paralelo de datos) y MPI (una
librería de paso de mensaje) -> sobre la mayoría de
los computadores paralelos
– OpenMP (un conjunto de directivas, etc. para
programación de memoria compartida) -> sobre
mayoría de máquinas de memoria compartida.
99. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 99
25/12/2022
red de
comunicación
SIMD computadores en array
array
P+M+E/S
Muchos procesadores muy sencillos, poca
memoria, posibilidad de realizar operaciones de
entrada/salida.
Red de comunicación especial.
100. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 100
25/12/2022
red de
comunicación
SIMD computadores array
Proc. de
control
front-end
array
P+M+E/S
El procesador de control envía a todos los
procesadores la instrucción que tienen que
ejecutar síncronamente (BC). Cada procesador,
ejecuta la instrucción o no hace nada.
101. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 101
25/12/2022
SIMD computadores array
Adecuados para cierto tipo de aplicaciones: tratamiento
de imágenes…
Ejemplo (X, Y, Z repartidos entre procesadores)
for (i=0; i<1000; i++)
if (Y[i] != 0) Z[i] = X[i] / Y[i];
else Z[i] = X[i];
paso 1: comprobar todos Y[i] != 0
paso 2: if (yes)hacer Z[i] = X[i] / Y[i]
(el resto, nada)
paso 3: if (no) hacer Z[i] = X[i]
(el resto, nada)
103. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 103
25/12/2022
Computadores MIMD
MIMD (Multiple-Instruction-Multiple-
Data)
P procesos/hilos ejecutándose
simultáneamente.
Dos modelos básicos:
- memoria compartida
- memoria distribuida
104. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 104
25/12/2022
SPMD
• Todas las máquinas actuales son MIMD
(Multiple Instruction, Multiple Data) y pueden
explotar
– paralelismo de datos o
– paralelismo de tareas.
• El primer paradigma de programación paralela
es el SPMD: Single Program, Multiple Data
– Considerado una subcategoría de MIMD
– Cada procesador ejecuta una copia del código
fuente
– Paralelismo de datos (a través de la
descomposición de los datos) y
– Paralelismo de tareas (a través de funciones que
retornan al procesador ID)
105. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 105
25/12/2022
SIMD vs SPMD
• En SPMD, múltiples procesadores
autónomos ejecutan simultáneamente el
mismo programa en puntos independientes.
– Contrario al paso a paso (lockstep) que SIMD
impone sobre los diferentes datos.
• Con SPMD, las tareas pueden ser
ejecutadas sobre CPU de propósito general.
– SIMD requiere un vector de procesadores para
manipular el flujo de datos.
– Note que las dos técnicas no son mutuamente
exclusivas.
106. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 106
25/12/2022
Computadores MIMD
Memoria compartida (shared memory)
M0 Mm–1 memoria principal
P0 P1 Pp–1 procesadores + MC
red de comunicación
E/S
107. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 107
25/12/2022
Memoria compartida (shared memory)
- Espacio de direccionamiento único.
- Comunicación entre procesos por
medio de variables compartidas.
- Red de comunicación: un bus (o una
red multietapa).
- Nombres: multiprocesador, SMP,
UMA.
- Generalmente, “pocos” procesadores.
Computadores MIMD
P0 P1 Pp–1
M0 Mm–1
E/S
108. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 108
25/12/2022
Computadores MIMD
Memoria distribuida (distributed memory)
Pp-1
Mp-1
E/S
P0
M0
E/S
Computador:
Pr + MC+
MP + E/S
red de comunicación
K
K
109. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 109
25/12/2022
Computadores MIMD
Memoria distribuida (distributed memory)
- Un espacio de direccionamiento por
procesador.
- Comunicación entre procesos por
medio de paso de mensajes.
- Redes de comunicación habituales:
hipercubo, malla, toro...
- Nombres: multicomputador, MPP
- Generalmente, “muchos” procesadores.
Pp-1
Mp-1
E/S
P0
M0
E/S
K
K
110. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 110
25/12/2022
Computadores MIMD
Otra opción: memoria compartida pero
físicamente distribuida
- El espacio de direccionamiento es
único, pero la utilización no es
homogénea: se ha creado una
jerarquía de memoria.
- La comunicación entre procesos se
hace por medio de variables
compartidas (lógicamente) y se
implementa mediante paso de
mensajes.
- Nombres: DSM, NUMA (MPP)
Pp-1
E/S
P0
E/S
K
M0
Mp-1
K
111. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 111
25/12/2022
Computadores MIMD
- SMP: multiprocesador de memoria compartida,
generalmente pocos procesadores comunicados
por un bus.
- MPP: sistema paralelo con muchos procesadores,
de memoria compartida o distribuida.
Generalmente, las máquinas más rápidas, sistemas con
hardware y software de comunicación y de cálculo
específico. Muy caras.
Pueden organizarse de manera jerárquica (p.e., los nodos
son sistemas SMP).
Nomenclatura:
112. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 112
25/12/2022
Computadores MIMD
- Cluster: sistema paralelo construido a base de
hardware y software de propósito general.
Buena relación coste/velocidad.
PC
PC
PC
PC
PC
ethernet
El más simple: PC / ethernet
(Beowulf)
commodity / custom
Cada vez más, sistema paralelo
de propósito general.
Nomenclatura:
113. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 113
25/12/2022
Computadores MIMD
- Constelación (constellation): un cluster, donde el
número de nodos es menor que el número de
procesadores de cada nodo.
Nomenclatura:
114. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 114
25/12/2022
1
1
N
N
SIMD MIMD
SISD
inst.
datos
proc. array
proc vectoriales
MP
P
C
bus
memoria compartida
SMP
MPP/NUMA
Cluster
memoria distribuida
P
C
M
red general
Resumen
115. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 115
25/12/2022
Resumen
Espacio de direccionamiento
común privado
centralizada
(bus)
distribuida
(red)
Memoria
SMP
DSM, NUMA MPP
-
116. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 116
25/12/2022
Unidad 2: Diseño de programas
paralelos y distribuidos
• Tecnologías y paradigmas de la programación paralela
– Cómputo Paralelo y Programación en Paralelo.
– Modelos de arquitectura (MIMD, SIMD, SISD, MISD).
– Paradigmas: programación basada en memoria compartida vs. distribuida
– Modelos de programación (Mapreduce, Hadoop, etc.).
• Algoritmos paralelos y distribuidos
– Técnicas de algoritmos paralelos (PRAM, APRAM, C3)
– Particionamiento
– Comunicación
– Aglomeración y Mapeo (PCAM)
• Equilibrio de carga de tareas
– Medición de balance de carga.
– Asignación dinámica de procesos.
– Balanceo de carga dinámico, robusto y no centralizado
• Evaluación de algoritmos paralelos y distribuidos
117. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 117
25/12/2022
Modelos de programación paralela
• Control
– Cómo se crea el paralelismo?
– Qué orden hay entre operaciones?
– Cómo los diferentes hilos de control se sincronizan?
• Data
– Qué data es privada y qué data se comparte?
– Cómo se accede o comunica la data compartida en forma
lógica?
• Operaciones
– Qué operaciones son atómicas (indivisibles)?
• Costos
– Cómo contabilizar los costos respectivos?
118. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 118
25/12/2022
Una arquitectura paralela
genérica
P P P P
Interconnection Network
M M M
M
° Físicamente, dónde está la memoria?
Memoria
P = procesador, M = memoria
119. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 119
25/12/2022
Parallel vs. Distributed Computation
Parallel processing refers to multiple CPUs within the same shared-
memory machine performing computation
120. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 120
25/12/2022
Parallel vs. Distributed Computation
Distributed computation involves multiple computers with their own
memory communicating over a network
121. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 121
25/12/2022
Modelo de Programación Basado en Memoria Compartida
- Un sistema multiprocesador donde todos los procesos pueden ejecutar el núcleo del
sistema operativo con el mismo privilegio se denomina multiprocesador simétrico (SMP)
- Todos los recursos se comparten los recursos (memoria y dispositivos entrada/salida)
- Un sistema operativo soporta multiprocesamiento simétrico siempre que se puedan
proteger regiones críticas (garantía de exclusión mutua)
- El planificador distribuye los procesadores disponibles entre los procesos
(threads)preparados para ejecutarse
. El paralelismo aparece cuando un programa ha sido codificado (o compilado) de modo
que fragmentos del mismo se ejecutan como procesos (threads) independientes.
Thread = proceso ligero (solo contexto hardware)
122. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 122
25/12/2022
Modelo de Programación Basado en Memoria
Compartida
-Memoria compartida que puede ser accedida por cualquier proceso/thread envuelto en la
computación
-Computación basada en sincronización para garantizar la consistencia de los datos
-La comunicación se realiza mediante compartición de los datos
SECCIONES CRÍTICAS
P1 P2
PRIMITIVAS DE SINCRONIZACIÓN
VARIABLES COMPARTIDAS
• Secciones de código que referencian/modifican variables
compartidas
SE DEBE GARANTIZAR LA EXCLUSIÓN MUTUA
• Ejecución secuencial
123. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 123
25/12/2022
Problema de Consistencia de una Variable
Compartida
Actualización de un contador
SUMA
P1
(1) MOV SUM, Reg1
(2) ADD #1, Reg1
(3) MOV Reg1, SUM
P2
(1’) MOV SUM, Reg1
(2’) ADD #1, Reg1
(3’) MOV Reg1, SUM
(1’)(1)(2)(3)(2’)(3’) => SUMA = SUMA +1
(1)(1’)(2’)(3’)(2)(3) => SUMA = SUMA +1
(1)(2)(3)(1’)(2’)(3’) => SUMA = SUMA +2
SE DEBE GARANTIZAR LA EXCLUSIÓN MUTUA
responsabilidad del programador
P1
P2
. . .
SUM = SUM+1
. . .
. . .
SUM = SUM+1
. . .
124. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 124
25/12/2022
Funciones de Sincronización de Alto Nivel
Funciones:
Lock(flag):
Si flag == ON (activado) entonces espera a que flag == OFF
Si flag == OFF (desactivado) entonces flag = ON
Unlock(flag):
flag = OFF
-Garantizan el acceso secuencial a las secciones críticas
-Proporcionadas por el SO e implementadas en todos los lenguajes de alto nivel
Ejemplos (rutinas atómicas e indivisibles)
• Cierres (locks)
• Semáforos
• Barreras
CIERRES
Variable cierre: flag => ON(1) o OFF(0)
P_padre: SUM = 0
for k =1 to N do
Fork P_hijo(k)
end for
P_hijo: Lock (flag)
SUMA = SUMA + A(k)
Unlock(flag)
Join
125. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 125
25/12/2022
Funciones de Sincronización de Alto Nivel
SEMÁFOROS
Variable semáforo: S
Boleano: 0 ó 1 (como los cierres)
General: Entero >= 0
Funciones:
Wait(S) o P(S)
Si S == 0 entonces espera a que S > 0
Si S > 1 entonces S = S - 1
Signal(S) o V(S):
S = S + 1
Semáforos generales:
• Si se inicializa con M, puede haber M procesos en su sección crítica simultanamente
• Problemas productores-consumidores o lectores-escritores
P1: P(S)
Sección crítica de P1
v(S)
P2: P(S)
Sección crítica de P2
v(S)
126. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 126
25/12/2022
Funciones de Sincronización de Alto Nivel
OTRAS FUNCIONES DEL API (lenguaje de alto nivel +. . .)
• Crear procesos
• Destruir procesos
• Identificar procesos
BARRERAS
-Los procesos esperan en un punto hasta que todos llegan a ese punto
0 0 1 3
1
2
3
BARRERA
2
BARRERA
0 1 2 3 BARRERA
Procesos: fork() crea copia del padre con nuevo espacio de
memoria virtual
127. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 127
25/12/2022
−
=
1
0
])
[
(
n
i
i
A
f
Ejemplo sencillo
Sea la suma :
• Descomposición paralela:
– Cada evaluación y cada suma parcial es una tarea.
• Asignar n/p números a cada procesador (1 al p)
– Cada uno computa independientemente sus resultados
“privados” y la suma parcial.
– Uno (o todos) recolectan las p sumas parciales y computa la
suma global.
Dos clases de data:
• Compartida lógicamente
– Los n números originales, la suma global.
• Privada lógicamente
– Las evaluaciones de las funciones.
– Y las sumas parciales individuales?????
128. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 128
25/12/2022
Modelo de prog. 1: Memoria compartida
• Un programa es una colección de hilos de control.
– Se pueden crear dinámicamente en algunos lenguajes.
• Cada hilo tiene variables privadas, ej: variables del stack local.
• También hay variables compartidas, ej: variables estáticas, de bloques
comunes, del heap global.
– Los hilos se comunican implícitamente escribiendo y leyendo
variables compartidas.
– Los hilos coordinan sincronizando en variables compartidas.
Pn
P1
P0
s s = ...
y = ..s ...
Memoria compartida
i: 2 i: 5 Memoria
privada
i: 8
129. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 129
25/12/2022
Sumando con memoria compartida
HILO 1
for i = 0, n/2-1
s = s + f(A[i])
HILO 2
for i = n/2, n-1
s = s + f(A[i])
static int s = 0;
• Problema: “race condition” en la variable s
• Una “race condition” o carrera por la data ocurre cuando:
- Dos procesadores (o 2 hilos) acceden a la misma
variable, y por lo meno uno la escribe.
- Los accesos son concurrentes (no sincronizados) así
que podrían pasar simultáneamente.
130. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 130
25/12/2022
Sumando con memoria compartida
HILO 1
….
computa f([A[i]) y put en reg0
reg1 = s
reg1 = reg1 + reg0
s = reg1
…
HILO 2
…
computa f([A[i]) y put en reg0
reg1 = s
reg1 = reg1 + reg0
s = reg1
…
static int s = 0;
…
(s = 27)
• Sea s=27, f(A[i])=7 en Hilo 1, y f(A[i])=9 en Hilo 2
• Si el programa está bien, s debería ser 43 al final
• Pero puede ser 43, 34, o 36
• Las operaciones atómicas son lecturas y escrituras
• O se ve un número u otro, no medio número
• Las sumas se hacen en registros (privados generalmente)
7 9
27 27
34 36
36
34
131. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 131
25/12/2022
Sumando con memoria compartida (mejorado)
HILO 1
local_s1= 0
for i = 0, n/2-1
local_s1 = local_s1 + f(A[i])
s = s + local_s1
HILO 2
local_s2 = 0
for i = n/2, n-1
local_s2= local_s2 + f(A[i])
s = s +local_s2
static int s = 0;
• Como la suma es asociativa, se puede reordenar
• La mayor parte de cómputo es en variables privadas
- La frecuencia de uso de mem. compartida baja, lo que puede mejorar
la velocidad.
- Pero hay un “race condition” en el update de la v.compartida s
- Se puede solucionar añadiendo locks o candados (sólo un hilo puede
usar el lock a la vez; los otros deben esperar)
static lock lk;
lock(lk);
unlock(lk);
lock(lk);
unlock(lk);
132. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 132
25/12/2022
• Todos los procesadores se conectan a una memoria compartida grande.
– Nombre típico: Symmetric Multiprocessors (SMPs)
– SGI, Sun, HP, Intel, IBM (nodos del Millennium, SP)
– Chips multicore (hacía donde vamos)
• Difícil escalar a gran número de procesadores
– <= 32 procesadores es típico
• Ventaja: uniform memory access (UMA)
• Costo: es más barato acceder data en cache que en memoria principal.
Modelo de máquina 1: Shared Memory
P1
bus
$
memoria
P2
$
Pn
$
133. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 133
25/12/2022
Problemas escalando HW de mem. compartida
• Por qué no poner más procesadores (con mayor memoria?)
– El bus de memoria se vuelve cuello de botella
• Ej. del problema: Parallel Spectral Transform Shallow Water
Model (PSTSWM)
– Resultados (y gráfico) cortesía de Pat Worley del ORNL
– Es un núcleo vital en modelos atmosféricos
– 99% de ops. punto flotante son multiplicaciones o sumas, que
generalmente corren bien en toda CPU.
– Pero se barre toda la memoria con poco reuso de operandos→
se usa mucho bus y memoria compartida
– El experimento muestra performance serial, con una “copia” del
ejecutable corriendo independientemente en varios
procesadores.
• Es el mejor caso para mem.compartida: no comparte
• Pero la data no cabe en los registros/cache
134. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 134
25/12/2022
From Pat Worley, ORNL
Ejemplo
• Degradación de
performance es una
función “suave” del
número de procesos.
• No data compartida entre
ellos, así que debería
haber perfecto
paralelismo.
• (Código corrió en 18
niveles z y varios rangos
de niveles xy.)
135. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 135
25/12/2022
Ventajas e Inconvenientes
Concurrencia: Dos o más threads se pueden ejecutar simultáneamente
Esta alternativa incrementa la eficiencia incluso en un solo procesador
Paralelismo: Hay concurrencia en máquinas multiprocesador
El paralelismo surge de modo automático en sistemas multiprocesador
Mejora de la respuesta de las aplicaciones
• Muchas aplicaciones cortan la interacción con el usuario cuando realizan una función
(Netscape,…)
• La programación con threads permite que cada función se realice por un thread de modo
independiente
Uso de sistemas multiprocesador de modo más eficiente
• Una aplicación paralelizada con threads no tiene que tener en cuenta el número de procesos
disponibles
• El rendimiento mejora automáticamente al añadir más procesos
Mejora la estructura de los códigos
• Muchos programas se estructuran de modo más lógico como unidades independientes
Uso de menos recursos del sistema
• Los sistemas UNIX clásicos soportan el concepto de thread (1 proceso = 1 thread)
• Sin embargo, el mantenimiento de procesos es muchos más costoso que el de threads
Mejora de rendimiento
• En un multiprocesador los programas se ejecutan en menor tiempo de ejecución
• En monoprocesador el tiempo de respuesta es menor, al poder solapar acciones (computo con
E/S)
136. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 136
25/12/2022
Procesos versus Threads
Espacio de direcciones con uno o más
threads de control
Se caracterizan por un contexto software y
hardware
La sobrecarga por creación o carga de
proceso es muy alta
Hay mecanismos artificiales para que varios
procesos compartan alguna página de
memoria
Un thread puede afectar a otro
Los procesos se diseñaron teniendo en cuenta
la protección
Flujo de control dentro de un proceso, que
coopera con otro thread para resolver un problema
Los threads comparten un único espacio de
direcciones (comunicación sencilla y eficiente)
Se caracterizan por un contexto hardware
La sobrecarga por la creación o cambio de thread
es muy pequeña
Los threads comparten memoria de modo natural
PROCESOS THREADS
137. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 137
25/12/2022
Procesos versus Threads
MODELO DE EJECUCIÓN EN SOLARIS
Thread vinculado (bounded)
Solo la aplicación ve estos threads
Planificación de threads para un proceso
Estructuras de thread kernel
Los threads kernel no asociados a un LWP
representan demonios de sistema como el
demonio de páginas, el thread de reloj, …
(threads del sistema)
138. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 138
25/12/2022
Procesos versus Threads
THREADS DE APLICACIÓN
THREADS
• La gestión de los threads es responsabilidad del programador
• Cada thread tiene su propia pila
• Todos los threads comparten la memoria del proceso y el resto de contexto software
(ficheros abiertos, directorio actual, manejadores de señales, …)
• Los threads se ejecutan de modo independiente (y concurrente)
LWP
C$PAR DOALL
DO I=1, N
A(I) = B(I)
END DO
Sección Secuencial
I=N/2+1 I=3N/4+1
I=3N/4 I=N
Sección Secuencial
Bucle Paralelo
Fin Bucle Paralelo
I=1
I=N/4
I=N/4+1
I=N/2
139. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 139
25/12/2022
Ejemplos de Sistemas con Programación por
Medio de Threads
LIBRERÍAS DE THREADS Y APIS
La historia comienza en 1960 y dentro de UNIX en 1980
Todas soportan funciones muy semejantes
Sin embargo, hay diferencia en la API de las librerías de los diferentes
fabricantes
• DEC Alpha
• OS/2
• Windows NT
140. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 140
25/12/2022
Modelo de Programación Basado en Paso de Mensajes
-Consiste en la replicación del paradigma de programación secuencial
-El programador divide la aplicación en varios procesos que se ejecutan en diferentes
procesadores sin compartir memoria y comunicándose por medio de mensajes
Visión del programador: Lenguaje secuencial con variables privadas + Rutinas de paso
de mensajes
P P P
M
red de interconexión
“Lenguaje ensamblador de la programación paralela”
Mejores eficiencias que con el resto de lenguajes
M M
141. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 141
25/12/2022
Ventajas e Inconvenientes
Ventajas:
• Portable de modo eficiente a cualquier tipo de arquitectura: computador paralelo,
red de estaciones y a una única estación de trabajo
Inconvenientes:
• Bastante más complicado de programar y depurar que memoria compartida
• La eficiencia depende del programador
SPMD vs. MPMD
• Muchos computadores actuales solo soportan SPMD, el mismo ejecutable en cada
procesador: IBM SP2 y CRAY T3E
• No es problema:
main(int argc, char **argv)
if proceso es el controlador
control(argumentos)
else
worker(argumentos)
- Muchos sistemas actuales no soportan tiempo compartido, los procesadores están
siendo empleados por un único usuario (cola de trabajos en cada partición): IBM SP2 y
CRAY T3E
El tiempo compartido se encuentra en investigación
142. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 142
25/12/2022
Características de los Mensajes
-Un mensaje es una trasferencia de datos de un proceso a otro proceso
Información que caracteriza un mensaje:
• En qué variable están los datos que se envían
• Cuantos datos se envían
• Qué proceso recibe el mensaje
• Cuál es el tipo de dato que se envía
• Qué proceso envía el mensaje
• Donde almacenar los datos que se reciben
• Cuantos datos espera recibir el proceso receptor
Partes de un proceso que se comunica por medio de mensajes:
1.Acceso: El proceso se debe enrolar en el sistema de paso de mensajes, obtiene un
número y el número de procesos en el grupo
2.Ejecución: El proceso realiza operaciones interactuando con el resto por medio de
las rutinas de paso de mensajes
3.Finalización: Antes de terminar, el proceso debe desenrolarse del sistema de paso
de mensajes
send
receive
143. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 143
25/12/2022
Comunicación Punto a Punto
send receive
Envío síncrono y asíncrono (condición de finalización)
Síncrona:
•El proceso que realiza el envío recibe información sobre la recepción del
mensaje (fax)
•La comunicación se completa cuando el mensaje ha sido recibido
Asíncrona:
•El proceso únicamente conoce cuando se envía el mensaje (postal)
•La comunicación se completa tan pronto como el mensaje ha sido enviado
- Generalmente copia en un buffer
Operaciones bloqueantes y no bloqueantes (espera o no la condición de finalización)
• Operación no bloqueante: Se inicia la operación y se vuelve al programa, por
medio de otras funciones se puede comprobar la finalización de la operación (envío
fax con memoria y recepción fax estándar)
• Operación bloqueante: Solo se vuelve al programa cuando la operación ha
finalizado (envío y recepción fax estándar)
144. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 144
25/12/2022
Comunicaciones Colectivas
0
1
2
3
BARRERA
2
0 1 3
BARRERA
0 1 2 3 BARRERA
broad. receive
receive
receive
P P
P P
Barrera Broadcast Reducción
Dato0 Dato3
Dato Dato
145. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 145
25/12/2022
Modelo 2: memoria distribuida compartida
• Memoria es compartida en forma lógica, pero distribuida
físicamente
– Cualquier CPU puede acceder cualquier dirección de memoria
– Líneas de cache (o páginas) se pasan entre máquinas
• Ejemplo: SGI Origin
– Escala a 512 (SGI Altix (Columbia) en NASA/Ames)
– Limitada por la coherencia del cache– como mantener las copias en
cache de la misma dirección iguales entre si.
P1
network
$
memory
P2
$
Pn
$
memory memory
146. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 146
25/12/2022
Problemas de performance al compartir
• Real compartir
–Escrituras frecuentes a la misma variable: cuello de
botella
–OK para read-only o para escrituras infrecuentes
–Técnica: hacer copias de un valor, uno por procesador,
si se puede en el algoritmo.
• Falso compartir
–Bloqueo del cache añade complejidad
–Dos diferentes variables en el mismo bloque de cache
–Técnica: colocar la data usada por cada procesador en
forma contigua, o por lo menos evitar intercalado en
memoria
147. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 147
25/12/2022
Modelo de program. 2: Paso de mensajes
• Programa consiste en colección de procesos nombrados.
– Se establecen al empezar a correr el programa
– Hilo de control y direcciones locales -- NO comparte data física.
– Data compartida lógica se divide entre procesadores locales.
• Los procesos se comunican por pares de send/receive
– Coordinación implícita en cada evento de comunicación.
– MPI (Message Passing Interface) es la librería más popular
Pn
P1
P0
y = ..s ...
s: 12
i: 2
Memoria
privada
s: 14
i: 3
s: 11
i: 1
send P1,s
Red
receive Pn,s
148. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 148
25/12/2022
Computar s = A[1]+A[2] en cada procesador
° 1er intento – qué podría salir mal?
Procesador 1
xlocal = A[1]
send xlocal, proc2
receive xremote, proc2
s = xlocal + xremote
Procesador 2
xlocal = A[2]
receive xremote, proc1
send xlocal, proc1
s = xlocal + xremote
° 2do intento
Procesador 1
xlocal = A[1]
send xlocal, proc2
receive xremote, proc2
s = xlocal + xremote
Procesador 2
xlocal = A[2]
send xlocal, proc1
receive xremote, proc1
s = xlocal + xremote
° Si send/receive funcionara como el teléfono? Como el correo?
° Si hubiera más de 2 procesadores?
149. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 149
25/12/2022
Modelo de máquina 2a: Memoria distribuida
• Cray T3E, IBM SP2
• Clusters de PC (Berkeley NOW, Beowulf)
• IBM SP-3, Millennium, CITRIS son máquinas de
memoria distribuída, pero los nodos son SMPs.
• Cada procesador tiene su propia memoria y cache pero
no puede acceder directamente a la memoria de otro
procesador.
• Cada “nodo” tiene una “Network Interface” (NI, tarjeta
de red o similar) para comunicación y sincronización
interconnect
P0
memory
NI
. . .
P1
memory
NI Pn
memory
NI
150. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 150
25/12/2022
Clusters de Tflop/s
He aquí algunos ejemplos de clusters configurados de
procesadores y redes separadas
• 72% del Top 500 (Nov 2005), 2 en el top 10
• Dell cluster en Sandia (Thunderbird) era #4 en Top 500
– 8000 Intel Xeons @ 3.6GHz
– 64 TFlops pico, 38 TFlops en Linpack
– Infiniband connection network
• Walt Disney Feature Animation (The Hive) era #96
– 1110 Intel Xeons @ 3 GHz
– Gigabit Ethernet
• Saudi Oil Company era #107
• Credit Suisse/First Boston era #108
• Para más detalles usar “statistics/sublist generator” en www.top500.org
151. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 151
25/12/2022
Modelo de máquina 2b: Internet/Grid Computing
• SETI@Home: corría en 500,000 PCs
– ~1000 años de CPU al día
– 485,821 años de CPU hasta el 2006
• Análisis sofisticado de señales
• Datasets distribuidos desde Radio Telescopio de Arecibo
Sgte. Paso:
Allen Telescope Array
152. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 152
25/12/2022
Mod. de progr. 2b: Espacio global de direcciones
• Programa consiste en colección de hilos nombrados.
– Se definen al inicio de la corrida.
– Data local y compartida, como en modelo de mem.compt.
– Pero la data compartida está dividida entre procesos.
– Aparentemente, data remota es cara computacionalmente
• Ejs: UPC, Titanium, Co-Array Fortran
• Programación en espacio global de direcciones es punto
medio entre paso de mensajes y mem. compartida.
Pn
P1
P0 s[myThread] = ...
y = ..s[i] ...
i: 2 i: 5 Private
memory
Shared memory
i: 8
s[0]: 27 s[1]: 27 s[n]: 27
153. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 153
25/12/2022
Modelo de máq. 2c: Espacio global de direcs.
• Cray T3D, T3E, X1, y cluster HP Alphaserver
• Clusters construidos con Quadrics, Myrinet, o Infiniband
• La NI soporta RDMA (Remote Direct Memory Access)
– NI puede acceder directamente a la memoria sin interrumpir a la CPU
– Un proces. puede hacer read/write a memoria como operación unilateral
(put/get)
– No solo un load/store como en máq. de mem.compartida
• Continua computando mientras espera a que la operación en memoria finalice.
– Data remota generalmente no está en cache local.
interconnect
P0
memory
NI
. . .
P1
memory
NI Pn
memory
NI
Espacio global
de dirs. puede
ser soportado en
varios grados
154. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 154
25/12/2022
Prog. paralela VS Prog. distribuida
Computación paralela
• Divide una aplicación en
tareas que se ejecutan al
mismo tiempo (fuertemente
acoplado)
• Se considera una aplicación a
la vez
• Objetivo: Acelerar la
ejecución de una aplicación
• Se ejecutan sobre
arqeuitecturas homogéneas
con memoria compartida
Computación distribuida
• Utiliza diferentes recursos
físicamente separados
• Se consideran varias
aplicaciones a la vez (pueden
pertenecer a diferentes
usuario)
• Objetivo: permitir que varios
usuarios trabajen en forma
cooperativa
• Se ejecutan sobre
arquitecturas heterogéneas,
abiertas y dinámicas
VS
155. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 155
25/12/2022
Resumen
• La programación paralela ejecuta masivamente
las tareas en equipos fuertemente conectados
(cientos o miles de procesadores sin mucha
distancia entre ellos)
• La programación distribuida, podría en un caso,
repartir las tareas en diversas partes del mundo.
156. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 156
25/12/2022
Unidad 2: Diseño de programas
paralelos y distribuidos
• Tecnologías y paradigmas de la programación paralela
– Cómputo Paralelo y Programación en Paralelo.
– Modelos de arquitectura (MIMD, SIMD, SISD, MISD).
– Paradigmas: programación basada en memoria compartida vs. distribuida
– Modelos de programación (Mapreduce, Hadoop, etc.).
• Algoritmos paralelos y distribuidos
– Técnicas de algoritmos paralelos (PRAM, APRAM, C3)
– Particionamiento
– Comunicación
– Aglomeración y Mapeo (PCAM)
• Equilibrio de carga de tareas
– Medición de balance de carga.
– Asignación dinámica de procesos.
– Balanceo de carga dinámico, robusto y no centralizado
• Evaluación de algoritmos paralelos y distribuidos
157. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 157
25/12/2022
MapReduce
• MapReduce es un paradigma diseñado por
Google para hacer que un subconjunto de
problemas distribuidos sea más fácil de
codificar.
• Automatiza la distribución de datos y la
agregación de resultados
• Restringe las formas en que los datos
pueden interactuar para eliminar los
bloqueos
– ¡sin estado compartido! = ¡sin bloqueos!
158. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 158
25/12/2022
MapReduce
• Basado en la estrategia “Divide y
Vencerás” para explotar el potencial de
proceso del clúster.
• Divide el análisis completo en análisis
sobre trozos más pequeños de los datos.
– Cada uno de estos se realizará en una
máquina del clúster.
• Al final, se reúnen los resultados
obtenidos en cada máquina.
159. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 159
25/12/2022
MapReduce
• Las dos tareas básicas de MapReduce son
(sorprendentemente):
– Map: aplica una función a los datos. P.ej: filtrar
ciertos valores
– Reduce: Combina los valores obtenidos por Map
• Primero se aplica Map, y luego se invoca
Reduce con los resultados obtenidos.
• Ambas trabajas con parejas (k,v) o listas de
parejas (k,v).
160. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 160
25/12/2022
MapReduce: Map? Reduce?
• Los mapeadores leen datos del sistema de
archivos y generan (normalmente) datos
modificados
• Los reductores recopilan toda la salida de los
mapeadores y generan (normalmente) datos
reducidos
• Los datos de salida se escriben en el disco.
• Todos los datos están en términos de pares
de <clave, valores>
161. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 161
25/12/2022
MapReduce: Data Flow
(Flujo del proceso)
Mapper 2
Mapper 0
Mapper 1
Reducer 0
Reducer 1
Out
0
Out
1
Input
Split
2
Split
1
Split
0
162. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 162
25/12/2022
MapReduce: Un programa de ejemplo
• Presentaré los conceptos de MapReduce usando el “ejemplo
típico” de MR, Word Count
• La entrada de este programa es un volumen de texto sin
formato, de tamaño no especificado
– podría ser KB, MB, TB, ¡no importa!
• El resultado es una lista de palabras y su recuento de
ocurrencias.
– Suponga que las palabras se dividen correctamente, ignorando
las mayúsculas y la puntuación.
• Ejemplo:
– The doctor went to the store. =>
» The, 2
» Doctor, 1
» Went, 1
» To, 1
» Store, 1
163. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 163
25/12/2022
MapReduce: Un programa de ejemplo
• Mapper
– Input: value: lines of text of input
– Output: key: word, value: 1
• Reducer
– Input: key: word, value: set of counts
– Output: key: word, value: sum
• Launching program
– Defines the job
– Submits job to cluster
164. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 164
25/12/2022
MapReduce: Un programa de ejemplo
● Forma general:
– Map:
– Reduce:
grep
– Map:
– Reduce:
(K1, V1)
(K2, list(V2))
* list(K2, V2)
* list(K3, V3)
●
(offset, line)
(match, [1, 1, ...])
* [(match, 1)]
* [(match, n)]
166. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 166
25/12/2022
Input Splitter
(divisor de entrada)
• Es responsable de dividir su entrada en múltiples
partes
• Estos fragmentos se utilizan luego como entrada
para sus mapeadores
• Divisiones en límites lógicos. El valor
predeterminado es 64 MB por fragmento (chunk)
– Dependiendo de lo que esté haciendo, ¡64 MB
pueden ser MUCHOS datos! Tú puedes cambiarlo
• Por lo general, solo puede usar uno de los
splitters(divisores) incorporados, a menos que
esté leyendo un archivo con formato especial
167. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 167
25/12/2022
Mapper
(mapeador)
• Lee en el par de entrada <K,V> (una sección dividida
por el divisor de entrada)
• Da como salida un par <K’, V’>
• Ex. Para nuestro ejemplo de Word Count, con la
siguiente entrada:
– “The teacher went to the store. The store was closed; the
store opens in the morning. The store opens at 9am”.
• La salida obtenida sería:
– <The, 1> <teacher, 1> <went, 1> <to, 1> <the, 1> <store,
1> <the, 1> <store, 1> <was, 1> <closed, 1> <the, 1>
<store, 1> <opens, 1> <in, 1> <the, 1> <morning, 1> <the
1> <store, 1> <opens, 1> <at, 1> <9am, 1>
168. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 168
25/12/2022
Reducer
(reductor)
• Acepta la salida de Mapper y recopila valores en la
clave
– Todas las entradas con la misma clave deben ir al mismo
reductor!
• La entrada generalmente se ordena, la salida se emite
exactamente como está
• Para nuestro ejemplo, la entrada del reductor sería:
– <The, 1> <teacher, 1> <went, 1> <to, 1> <the, 1> <store,
1> <the, 1> <store, 1> <was, 1> <closed, 1> <the, 1>
<store, 1> <opens, 1> <in, 1> <the, 1> <morning, 1> <the
1> <store, 1> <opens, 1> <at, 1> <9am, 1>
• La salida sería:
– <The, 6> <teacher, 1> <went, 1> <to, 1> <store, 3> <was,
1> <closed, 1> <opens, 1> <morning, 1> <at, 1> <9am, 1>
169. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 169
25/12/2022
Combiner
(combinador)
• Esencialmente un reductor intermedio
• Es opcional
• Reduce la salida de cada mapeador,
reduciendo el bandwidth y la clasificación
• No se puede cambiar el tipo de su entrada
– Los tipos de entrada deben ser los mismos
que los tipos de salida
170. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 170
25/12/2022
Output Committer
• Es responsable de tomar la salida
reducida y enviarla a un archivo.
• Por lo general, este confirmador necesita
un input splitter correspondiente (para que
otro trabajo pueda leer la entrada)
• Nuevamente, los splitters incorporados
generalmente son lo suficientemente
buenos, a menos que necesite generar un
tipo especial de archivo
171. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 171
25/12/2022
Partitioner (Shuffler)
Particionador (Barajador)
• Decide qué pares se envían a qué reductor
• El valor predeterminado es simplemente:
– Key.hashCode() % numOfReducers
• User can override to:
– Proporcionar una distribución (más) uniforme de la
carga entre los reductores
– Es posible que sea necesario enviar algunos valores
al mismo reductor
• Ex. Para calcular la frecuencia relativa de un par de palabras
<W1, W2>, debe asegurarse de que todas las palabras W1
se envíen al mismo reductor
– Agrupamiento de resultados
172. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 172
25/12/2022
¿Qué hay en Hadoop?
• Hadoop es más que solo MapReduce
– Hadoop Distributed File System (HDFS)
– MapReduce
– Pig – high-level language for data analysis
– HBase – storage for semi-structured data
– Y mas…
174. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 174
25/12/2022
Historia de MapReduce y Hadoop
• Feb 2003 – First MapReduce library written at Google
• Dec 2004 – Google paper published
• July 2005 – Doug Cutting reports that Nutch now uses
new MapReduce implementation
• Jan 2006 – Doug Cutting joins Yahoo!
• Feb 2006 – Hadoop code moves out of Nutch into new
Lucene subproject
• Apr 2007 – Yahoo! running Hadoop on 1000-node
cluster
• Jan 2008 – Hadoop made an Apache Top Level Project
• Feb 2008 – Yahoo! generate production search index
with Hadoop
175. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 175
25/12/2022
Mi primer programa MapReduce
● Forma general:
– Map:
– Reduce:
grep
– Map:
– Reduce:
(K1, V1)
(K2, list(V2))
* list(K2, V2)
* list(K3, V3)
●
(offset, line)
(match, [1, 1, ...])
* [(match, 1)]
* [(match, n)]
176. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 176
25/12/2022
Arquitectura
• Rastreador de trabajo único(Single Job
Tracker)
– acepta el envío de trabajos
– divide el trabajo para mapeadores y reduce las
tareas
– distribuye las tareas a los rastreadores
– reprograma tareas fallidas
• Muchos rastreadores de tareas
– ejecutar tareas en máquinas virtuales
secundarias
– informar a Job Tracker del progreso
177. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 177
25/12/2022
Código
public void map(LongWritable key, Text val,
OutputCollector<Text, IntWritable> output,
Reporter reporter) throws IOException {
if (pattern.matcher(val.toString()).matches()) {
output.collect(val, new IntWritable(1));
}
}
public void reduce(Text key, Iterator<IntWritable> vals,
OutputCollector<Text, IntWritable> output,
Reporter reporter) throws IOException {
int sum = 0;
while (vals.hasNext()) {
sum += vals.next().get();
}
output.collect(key, new IntWritable(sum));
}
178. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 178
25/12/2022
Input y Output
• InputFormat produce divisiones y registros
• OutputFormat acepta registros
• Formatos de ejemplo
– Formato de entrada de texto/Formato de salida
– Formato de entrada de texto de valor clave
– Formato de entrada/formato de salida del archivo
de secuencia
• Los tipos son Hadoop Writables u otros
formatos de serialización
180. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 180
25/12/2022
Ejercicios para trabajos grupales
1. Encuentre las visitas por intervalo de tiempo de 5 minutos
para un sitio web dados sus registros de acceso.
2. Encuentre las páginas con más de 1 millón de visitas al día
para un sitio web dados sus registros de acceso.
3. Encuentre las páginas que enlazan con cada página en una
colección de páginas web.
4. Calcular la proporción de líneas que coinciden con una
expresión regular dada para una colección de documentos.
5. Ordene los datos tabulares por una columna primaria y
secundaria.
6. Encuentre las páginas más populares de un sitio web según
sus registros de acceso.
181. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 184
25/12/2022
Hive y Pig
• Hive: aplicaciones de almacenamiento de datos en
Hadoop
– Query language HQL, variante de SQL
– Las tablas son almacenadas en HDFS como archivos
planos
– Desarrollado por Facebook, ahora open source
• Pig: Sistema de procesamiento de datos a gran escala
– Scripts son escritos en Pig Latin, un lenguaje de flujo de
datos
– Desarrollado por Yahoo!, ahora open source
• Idea en común:
– Proporcionar lenguaje de alto nivel para facilitar el
procesamiento de datos a gran escala.
– Lenguaje de nivel superior "compila" hasta llegar a tareas
(Jobs) Hadoop
182. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 185
25/12/2022
Componentes de Hive
• Shell: permite consultas interactivas
• Driver: session handles, fetch, execute
• Compiler: parse, plan, optimize
• Metastore: schema, location in HDFS, etc
• Tablas
– Tipos de columnas(int, float, string, boolean)
– Además, list: map (for JSON-like data)
183. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 186
25/12/2022
Hive: Ejemplo
• Hive es parecido a una base de datos SQL
• Join relacional sobre dos tablas
– Tabla de palabras contadas de una coleccion de libros de Shakespeare
– Tabla de palabras contadas de Homer
SELECT s.word, s.freq, k.freq FROM shakespeare s
JOIN homer k ON (s.word = k.word) WHERE s.freq >= 1 AND k.freq >= 1
ORDER BY s.freq DESC LIMIT 10;
the 25848 62394
I 23031 8854
and 19671 38985
to 18038 13526
of 16700 34654
a 14170 8057
you 12702 2720
my 11297 4135
in 10797 12445
is 8882 6884
184. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 187
25/12/2022
Hive: Atras del escenario
SELECT s.word, s.freq, k.freq FROM shakespeare s
JOIN homer k ON (s.word = k.word) WHERE s.freq >= 1 AND k.freq >= 1
ORDER BY s.freq DESC LIMIT 10;
(TOK_QUERY (TOK_FROM (TOK_JOIN (TOK_TABREF shakespeare s) (TOK_TABREF homer k) (= (.
(TOK_TABLE_OR_COL s) word) (. (TOK_TABLE_OR_COL k) word)))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR
TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (. (TOK_TABLE_OR_COL s) word)) (TOK_SELEXPR (.
(TOK_TABLE_OR_COL s) freq)) (TOK_SELEXPR (. (TOK_TABLE_OR_COL k) freq))) (TOK_WHERE (AND (>= (.
(TOK_TABLE_OR_COL s) freq) 1) (>= (. (TOK_TABLE_OR_COL k) freq) 1))) (TOK_ORDERBY
(TOK_TABSORTCOLNAMEDESC (. (TOK_TABLE_OR_COL s) freq))) (TOK_LIMIT 10)))
(una o más MapReduce jobs)
(Abstract Syntax Tree)
185. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 188
25/12/2022
Pig Latin
• Lenguaje de flujo de datos
– Usuario especifica una secuencia de operaciones
para procesar datos
– Mas control sobre el proceso comparado con
lenguaje declarativo Hive QL
• Soporta varios tipos de datos
• Soporta Schema
• Funciones de soporte definidas por usuario
(UDF).
– (http://pig.apache.org/docs/r0.11.1/udf.html)
186. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 189
25/12/2022
Pig: Características
• Dos componentes
– Lenguaje llamado Pig latin
– Compilador
187. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 190
25/12/2022
Ejemplo de tarea de analisis de datos
• Encuentra usuarios que tienden a visitar
“paginas rankeadas”
user url time
Amy www.cnn.com 8:00
Amy www.crap.com 8:05
Amy www.myblog.com 10:00
Amy www.flickr.com 10:05
Fred cnn.com/index.htm 12:00
url pagerank
www.cnn.com 0.9
www.flickr.com 0.9
www.myblog.com 0.7
www.crap.com 0.2
Paginas
Visitas
.
.
.
.
.
.
188. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 191
25/12/2022
Flujo de datos conceptual
Canonicalize URLs
Join
url = url
Group by user
Compute Average Pagerank
Filter
avgPR > 0.5
Load
Pages(url, pagerank)
Load
Visits(user, url, time)
189. Aplicaciones Distribuidas Carrera de Software
Ph.D. Franklin Parrales 192
25/12/2022
Flujo de datos de sistema
. . . . . .
Visits Pages
.
.
.
.
.
. join by url
the answer
load
load
canonicalize
compute average pagerank
filter
group by user