Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porLidia Soler Peña Modificado hace 10 años
1
Memoria Compartida Distribuida José A. Gil Salinas Universidad Politécnica de Valencia Departamento de Informática de Sistemas y Computadores
2
© José A. Gil1 Introducción Memoria compartida distribuida: Esfuerzo para combinar las mejores características de dos aproximaciones diferentes SMP - shared memory multiprocessing SMP - shared memory multiprocessing DCS - distributed computing systems DCS - distributed computing systems SMP Modelo de programación simple, basado en un espacio de direcciones compartido No es escalable DCS Es escalable Modelo de programación difícil de usar, basado en varios espacios de dirección distintos, y paso de mensajes
3
© José A. Gil2 Modelo de programación: Locks y Barreras Lock (bloqueo): mecanismo de protección en el acceso a recursos (memoria) compartidos. Operaciones: aquire y release Barrera: mecanismo de sincronización adicional a los locks. Sean N procesos distribuidos cooperantes. Cada vez que uno de ellos encuentra una barrera, se bloquea hasta que el resto (N-1) alcanza la misma barrera. Cada vez que uno de ellos encuentra una barrera, se bloquea hasta que el resto (N-1) alcanza la misma barrera. Se utilizan para separar fases del cómputo. Se utilizan para separar fases del cómputo. Es un punto donde se alcanza total consistencia, incluyendo datos externos a secciones críticas. Es un punto donde se alcanza total consistencia, incluyendo datos externos a secciones críticas. Se asemejan a un par release-acquire. Se asemejan a un par release-acquire. Epoch: porción de código comprendido entre dos barreras.
4
© José A. Gil3 Barreras
5
4 Estructura y organización de un sistema DSM
6
© José A. Gil5 Introducción Características principales de DSM Modelo de programación simple de usar Y es escalable Modelo de programación simple Es una consecuencia del hecho que DSM está basado en un solo espacio de dirección lógico. Escalabilidad Es una consecuencia del hecho que porciones diferentes del espacio de direcciones (qué es lógicamente único) están implementadas en nodos de proceso diferentes (físicamente distintos).
7
© José A. Gil6 DSM y disciplinas asociadas
8
© José A. Gil7 DSM y su implementación Software Primeras implementaciones (multicomputadores y clusters con paso de mensajes) Nivel: Biblioteca de rutinas Biblioteca de rutinas Primitivas insertadas por el compilador Primitivas insertadas por el compilador Sistema operativo Sistema operativo En el núcleo En el núcleo Fuera del núcleo Fuera del núcleo Fáciles de construir y baratas de implementar Lentas e ineficientes
9
© José A. Gil8 DSM y su implementación Hardware Rápidas y eficientes Relativamente complejas y caras Mixta (híbrida) Cada mecanismo puede ser implementado en el nivel adecuado (Hw o Sw) La mejor aproximación coste/prestaciones
10
© José A. Gil9 Organización interna de los datos compartidos Los datos compartidos pueden ser de cualquier tipo No estructurados Estructurados Tipos de datos tradicionales Tipos de datos tradicionales Objetos Objetos Los datos compartidos son accedidos por segmentos de programa denominados secciones críticas (que deben estar protegidas)
11
© José A. Gil10 Granularidad de la consistencia Tamaño de grano (determinado por el diseñador) palabra bloque página pequeña pequeña grande grande objeto segmento Implementaciones Hw ~ grano pequeño palabra, bloque o página pequeña Implementaciones Sw ~ grano grande página grande, objeto o segmento Implementaciones híbridas ~ grano mediano página pequeña o grande
12
© José A. Gil11 Algoritmos de acceso SRSW (single reader / single writer) Un solo nodo tiene permiso de lectura en un periodo de tiempo y sólo un nodo tiene permiso de escritura en ese mismo periodo Dos réplicas Dos réplicas En sistemas con dos nodos ~ productor consumidor. En sistemas con dos nodos ~ productor consumidor. En sistemas con más nodos el algoritmo de gestión debe permitir la migración. En sistemas con más nodos el algoritmo de gestión debe permitir la migración. MRSW (multiple reader / single writer) Varios nodos tienen permiso de lectura en un periodo de tiempo y sólo un nodo tiene permiso de escritura en un periodo de tiempo. Múltiples réplicas Múltiples réplicas No es necesaria la migración en lectura. No es necesaria la migración en lectura. Migración de escritura necesaria. Migración de escritura necesaria.
13
© José A. Gil12 Algoritmos de acceso MRMW (multiple reader / multiple writer) Varios nodos tienen permiso de lectura y escritura en un periodo de tiempo. Múltiples réplicas Múltiples réplicas Es necesario un mecanismo (protocolo) para mantener la consistencia de los datos Es necesario un mecanismo (protocolo) para mantener la consistencia de los datos
14
© José A. Gil13 Gestión de la propiedad Cada unidad de consistencia (grano) debe tener un nodo "home" responsable de la gestión de propiedad de esa unidad. Una unidad de consistencia puede ser poseída por varios nodos en distintos intervalos de tiempo. El mecanismo de gestión puede ser centralizado o distribuido.
15
© José A. Gil14 Protocolos de consistencia Al haber varias réplicas es necesario mantener la consistencia. Los protocolos se basan en una de estas políticas: actualización invalidación El modelo de consistencia determina CUANDO se enteran los nodos de los cambios de valor de las variables. Cuanto más relajado el modelo más difícil la programación, pero mejores prestaciones. Modelos de consistencia Restringidos Estricta Secuencial Relajados Procesador Débil (weak) Liberación (release) Perezoso (lazy) Liberación perezosa (lazy release) Entrada (entry) AURC Ámbito (scope) Generalizada (generalized) Necesitan primitivas de sincronización
16
© José A. Gil15 Clasificación de los sistemas DSM Criterio: nivel de implementación DSM 1.Hardware 2.Software 2.1. El sistema operativo 2.1.1. Dentro del núcleo 2.1.2. Fuera del núcleo 2.2. Biblioteca de rutinas 2.3. Primitivas insertadas por el compilador 3. Combinación de hardware/software Parámetros: 1. Conf. Arquitectónica 1.1. Configuración del cluster (num. Procesadores, mem. Compartida, mem. Cache, niveles de cache) 1.2. Red de interconexión (jerarquías de bus, anillo, malla, hipercubo, LAN específica etc.) 2. Organización de los datos compartidos 2.1. Estructura de datos (no estructurados o estructurados en objetos, tipos, etc.) 2.2 Grano de coherencia (palabra, bloque de cache, página, estructura de datos, etc.)
17
© José A. Gil16 Clasificación de los sistemas DSM Segundo criterio: algoritmo de DSM 1. SRSW (single reader / single writer) 1.1. Sin migración 1.2. Con migración 2.MRSW (multiple reader / single writer) 3. MRMW (multiple reader / multiple writer) Replicación: pueden existir copias múltiples de los mismos datos Migración: una sola copia de datos que migra cuando se accede, si no es local Parámetros: 1. Responsabilidad de gestión de DSM (centralizada, distribuida/fija, distribuida/dinámica) 2. Modelo de consistencia (strict, sequential, processor, weak, release, lazy release, entry, etc.) 3. Política de coherencia (write-invalidate, write- update, type-specific, etc.)
18
© José A. Gil17 Protocolos de consistencia Cronológicamente, las implementaciones relajadas software son anteriores. La idea básica detrás de DSM software, a menudo llamado SVM (Memoria Virtual Compartida), es emular un protocolo de coherencia de cache de granularidad de página en lugar de los bloques de cache. En esas condiciones (granularidad más basta), el mayor problemas es la falsa compartición. la falsa compartición aparece cuando dos procesadores semánticamente no relacionados comparten la misma página (accediendo datos no relacionado que están en la misma página), y uno de ellos escribe sus datos. la falsa compartición aparece cuando dos procesadores semánticamente no relacionados comparten la misma página (accediendo datos no relacionado que están en la misma página), y uno de ellos escribe sus datos. el uso de consistencia relajada permite al sistema demorar la actividad de coherencia desde el instante de modificación al instante del próximo punto de sincronización (liberación, adquisición o ambos). Posponer la actividad de coherencia significa que puede que la actualización/invalidación no ocurra. el uso de consistencia relajada permite al sistema demorar la actividad de coherencia desde el instante de modificación al instante del próximo punto de sincronización (liberación, adquisición o ambos). Posponer la actividad de coherencia significa que puede que la actualización/invalidación no ocurra.
19
© José A. Gil18 Protocolos de consistencia Consistencia estricta TODOS los nodos se enteran INSTANTANEAMENTE de los cambios (solo modelo teórico). Consistencia secuencial El flujo particular de acceso y el flujo global de acceso que ve cada uno de los nodos son los mismos en todos los nodos. Consistencia de procesador El flujo particular de acceso que ve cada uno de los nodos es el mismo en todos los nodos. El flujo global de acceso que ve cada uno de los nodos puede ser distinto.
20
© José A. Gil19 Protocolos de consistencia Consistencia débil (weak) Necesita puntos de sincronización (acquire - release) que delimiten las secciones críticas. No se mantiene la consistencia fuera de las secciones críticas. La consistencia se mantiene en ambos puntos de sincronización. El código no puede continuar hasta que se establezca la consistencia en el punto de sincronización. Los puntos de sincronización siguen las reglas de la consistencia secuencial. (todos los nodos ven el mismo orden global de accesos).
21
© José A. Gil20 Protocolos de consistencia Consistencia de liberación (release) La consistencia de memoria solamente se establece en los puntos de liberación. Los puntos de liberación siguen un modelo de consistencia de procesador. En cada punto de liberación se actualizan el resto de los procesadores/procesos con los cambios de las variables. Esto genera tráfico potencialmente innecesario que puede tener un impacto negativo en la velocidad de ejecución de la aplicación. Esto genera tráfico potencialmente innecesario que puede tener un impacto negativo en la velocidad de ejecución de la aplicación.
22
© José A. Gil21 Protocolos de consistencia Release Consistency Dash (hw) Munin (sw)
23
© José A. Gil22 Protocolos de consistencia Liberación perezosa (lazy release) La consistencia de memoria sólo tiene que ser establecida en el punto de la siguiente adquisición El tráfico incluirá sólo las variables actualizadas que podrían usarse por la sección crítica de código que está a punto de empezar. El tráfico incluirá sólo las variables actualizadas que podrían usarse por la sección crítica de código que está a punto de empezar. Se necesitará más espacio de "buffering" en cada procesador, para guardar las variables actualizadas hasta el comienzo de las siguientes secciones críticas. Notese que algunas de las variables actualizadas no se usarán en la siguiente sección crítica. Sin embargo, esas variables contribuirán al tráfico (porque podrían ser usadas). Notese que algunas de las variables actualizadas no se usarán en la siguiente sección crítica. Sin embargo, esas variables contribuirán al tráfico (porque podrían ser usadas).
24
© José A. Gil23 Protocolos de consistencia Lazy Release Consistency TreadMarks (sw) Protocolo de escritor múltiple que usa invalidación. Protocolo de escritor múltiple que usa invalidación. Cada escritor guarda todos los cambios (diff) que hace en todas las páginas compartidas, desde el último punto de acquire. Cada escritor guarda todos los cambios (diff) que hace en todas las páginas compartidas, desde el último punto de acquire. En el siguiente punto de acquire, se envían write notices que invalidan las páginas modificadas. En el siguiente punto de acquire, se envían write notices que invalidan las páginas modificadas. En el primer acceso a una página invalidada, se recogen los diffs y se aplican en el orden causal apropiado, para reconstruir la página coherentemente. En el primer acceso a una página invalidada, se recogen los diffs y se aplican en el orden causal apropiado, para reconstruir la página coherentemente. P1 W(x)REL ACQ W(x) REL ACQW(x)REL ACQR(x)REL t t t t P2 P3 P4 x x x fallo(x)difffallo(x)difffallo(x)diff
25
© José A. Gil24 TreadMarks (estados y fallos) Estados: UNMAPPED Páginas compartidas que no están en ese procesador Páginas compartidas que no están en ese procesador READ-ONLY Protegida para lectura Protegida para lectura READ-WRITE Protegida para escritura Protegida para escritura INVALID Otro procesador ha escrito en ella Otro procesador ha escrito en ella Tipos de Fallos de Página cold_miss la primera vez que un procesador que no es el manager accede a ella coherence_miss acceso a una página invalidada protection_fault acceso de ESCRITURA a una página protegida para lectura
26
© José A. Gil25 TreadMarks (gestor de fallos) if ( p READ-ONLY ) then Allocate twin Change protection to READ-WRITE else if ( cold_miss) then get copy from manager if ( write notices ) then Retrieve diffs if ( write miss ) then Allocate twin Change protection to READ-WRITE else Change protection to READ-ONLY
27
© José A. Gil26 TreadMarks (diagrama de estados) UNMAPPED READ- WRITE READ-ONLY INVALID READFAULT WRITEFAULT READFAULTWRITEFAULT WRITENOTICE WRITENOTICE WRITEFAULT DIFFCREATE Los WRITE FALUT generan TWIN Los DIFF CREATE eliminan los TWIN
28
© José A. Gil27 TreadMarks (ejemplo de programa) #include #include #include "Tmk.h" struct shared { int sum; int turn; int* array; } *shared; main(int argc, char **argv) { int start, end, i, p; int arrayDim = 100; /* Read array size from command line */ { int c; extern char* optarg; while ((c = getopt(argc, argv, "d:")) != -1) switch (c) { case 'd': arrayDim = atoi(optarg); break;}} Tmk_startup(argc, argv);...
29
© José A. Gil28 TreadMarks (ejemplo de programa)... Tmk_startup(argc, argv); if (Tmk_proc_id == 0) { shared = (struct shared *) Tmk_malloc(sizeof(shared)); if (shared == NULL) Tmk_exit(-1); /* share common pointer with all procs */ Tmk_distribute(&shared, sizeof(shared)); shared->array = (int *) Tmk_malloc(arrayDim * sizeof(int)); if (shared->array == NULL) Tmk_exit(-1); shared->turn = 0; shared->sum = 0; }Tmk_barrier(0);...
30
© José A. Gil29 TreadMarks (ejemplo de programa)...Tmk_barrier(0); /* Determine array range for each processor */ { int id0 = Tmk_proc_id, id1 = Tmk_proc_id+1; int perProc = arrayDim / Tmk_nprocs; int leftOver = arrayDim % Tmk_nprocs; start = id0 * perProc + id0 * leftOver / Tmk_nprocs; end = id1 * perProc + id1 * leftOver / Tmk_nprocs; } for (i = start; i < end; i++) shared->array[i] = i; Tmk_barrier(0);...
31
© José A. Gil30 TreadMarks (ejemplo de programa)...Tmk_barrier(0); /* Print array elements, in the natural output order */ for (p = 0; p < Tmk_nprocs; p++) { if (shared->turn == Tmk_proc_id) { for (i = start; i < end; i++) printf("%d: %d\n", i, shared->array[i]); shared->turn++;}Tmk_barrier(0);}...
32
© José A. Gil31 TreadMarks (ejemplo de programa)...Tmk_barrier(0);} /* Compute local sum, then add to global sum */ { int mySum = 0; for (i = start; i < end; i++) mySum += shared->array[i]; Tmk_lock_acquire(0); shared->sum += mySum; Tmk_lock_release(0);} if (Tmk_proc_id == 0) { Tmk_free(shared->array);Tmk_free(shared); printf("Sum is %d\n", shared->sum); }Tmk_exit(0);}
33
© José A. Gil32 Protocolos de consistencia Entrada (entry) Las variables compartidas (o grupo de variables compartidas) están protegidas por una variable de sincronización (una sección crítica está limitada por un par de accesos a la variable de sincronización). Se pasarán las variables actualizadas por la red cuando sean absolutamente necesarias para las siguientes secciones críticas. Semejante aproximación lleva a prestaciones potencialmente mejores. Sin embargo, las prestaciones concretas dependen de los detalles de la aplicación.
34
© José A. Gil33 Protocolos de consistencia Entry consistency Midway (sw) Protocolo de escritor único que usa actualización Protocolo de escritor único que usa actualización Entry consistency garantiza que los datos compartidos sólo se hacen consistentes cuando el procesador adquiere un objeto de sincronización. Entry consistency garantiza que los datos compartidos sólo se hacen consistentes cuando el procesador adquiere un objeto de sincronización. Las ventajas de la consistencia de entrada pueden ser difíciles de obtener con un esfuerzo limitado en la programación Las ventajas de la consistencia de entrada pueden ser difíciles de obtener con un esfuerzo limitado en la programación Por consiguiente, además de entry consistency, Midway soporta también liberación y consistencia del procesador. Por consiguiente, además de entry consistency, Midway soporta también liberación y consistencia del procesador.
35
© José A. Gil34 Protocolos de consistencia Automatic Update Release Consistency (AURC) SHRIMP (Scalable High-performance Really Inexpensive Multi-Processor) El mecanismo de actualización hardware funciona punto a punto El mecanismo de actualización hardware funciona punto a punto Cuando un nodo escribe, sólo se actualiza un nodo remoto (el home). Cuando un nodo escribe, sólo se actualiza un nodo remoto (el home). El nodo home es aquel que escribió primero en la página. El nodo home es aquel que escribió primero en la página. En los puntos de acquire se envía un mensaje al último propietario del lock (a través del home del lock). En los puntos de acquire se envía un mensaje al último propietario del lock (a través del home del lock). El nodo adquisitor obtiene los "write notices" junto con el lock. El nodo adquisitor obtiene los "write notices" junto con el lock. Los "write notices" indican todas las páginas que fueron actualizadas en el pasado de ese acquire de acuerdo con el orden parcial sucedió-primero. Los "write notices" indican todas las páginas que fueron actualizadas en el pasado de ese acquire de acuerdo con el orden parcial sucedió-primero. Las páginas indicadas en el "write notice" son invalidadas, a menos que las versiones locales sean posteriores. Las páginas indicadas en el "write notice" son invalidadas, a menos que las versiones locales sean posteriores. Cuando una página falla se envía una petición al home indicando la versión. Cuando una página falla se envía una petición al home indicando la versión.
36
© José A. Gil35 Protocolos de consistencia Automatic Update Release Consistency (AURC) Cont. El home mantiene el "copy set" (lista de nodos que comparten la página) y el "vector de versiones" actualizado (que locks escribieron en una determinada versión de la página). El home mantiene el "copy set" (lista de nodos que comparten la página) y el "vector de versiones" actualizado (que locks escribieron en una determinada versión de la página). Cada nodo mantiene una copia del elemento del vector de versiones que le atañe. Relacionado con las páginas replicadas en ese nodo. Cada nodo mantiene una copia del elemento del vector de versiones que le atañe. Relacionado con las páginas replicadas en ese nodo. Cuando al home le llega una petición de página (por un fallo remoto). Cuando al home le llega una petición de página (por un fallo remoto). Si tiene al menos la versión requerida: contesta. Si tiene al menos la versión requerida: contesta. Si no: espera hasta conseguir la versión o posterior. Si no: espera hasta conseguir la versión o posterior.
37
© José A. Gil36 Protocolos de consistencia Automatic Update Release Consistency (AURC) Cont. Cuando llega al nodo la página que ha fallado se protege para escritura y se despierta al proceso que generó el fallo. Cuando llega al nodo la página que ha fallado se protege para escritura y se despierta al proceso que generó el fallo. La primera escritura en la página después del acquire generará un fallo de escritura, que se utilizará para añadir la página a la "lista de actualizaciones" y desprotegerla. La primera escritura en la página después del acquire generará un fallo de escritura, que se utilizará para añadir la página a la "lista de actualizaciones" y desprotegerla. Cada escritura es realizada sobre la copia local y propagada (hw) al home. Cada escritura es realizada sobre la copia local y propagada (hw) al home. El resto de nodos serán actualizados cuando adquieran el lock y contacten con el home para obtener la última actualización de la página El resto de nodos serán actualizados cuando adquieran el lock y contacten con el home para obtener la última actualización de la página En el punto de release el nodo incrementa su timestamp local y lo envía a todos los homes de las páginas de su "lista de actualizaciones" para que actualicen el vector de versiones, al mismo tiempo que se vacían los enlaces entre el nodo y los homes. Se protegen para escritura todas las páginas y se vacía la "lista de actualizaciones". En el punto de release el nodo incrementa su timestamp local y lo envía a todos los homes de las páginas de su "lista de actualizaciones" para que actualicen el vector de versiones, al mismo tiempo que se vacían los enlaces entre el nodo y los homes. Se protegen para escritura todas las páginas y se vacía la "lista de actualizaciones".
38
© José A. Gil37 Protocolos de consistencia Automatic Update Release Consistency (AURC) Copyset-2. comunicación punto a punto hardware entre el nodo de escritura y el nodo dueño de la página escrita Copyset-2. comunicación punto a punto hardware entre el nodo de escritura y el nodo dueño de la página escrita Copyset-N. Modelo de comunicaciones más general. Copyset-N. Modelo de comunicaciones más general.
39
© José A. Gil38 Protocolos de consistencia Automatic Update Release Consistency (AURC)
40
© José A. Gil39 Protocolos de consistencia Scope consistency (ScC) SHRIMP (Scalable High-performance Really Inexpensive Multi-Processor), idéntico a AURC excepto: Noticias de escritura mantenidas por lock, no por procesador Noticias de escritura mantenidas por lock, no por procesador El vector de actualización de versiones en el home incluye campos (para cada lock) indicando qué variables fueron escritas; esto se repite para cada versión de la página. El vector de actualización de versiones en el home incluye campos (para cada lock) indicando qué variables fueron escritas; esto se repite para cada versión de la página. En la adquisición, el nodo recibe del que libera solo las noticias de escritura que corresponden al lock. En la adquisición, el nodo recibe del que libera solo las noticias de escritura que corresponden al lock. Invalidación de páginas (igual que LRC/AURC). Cuando falla una página se trae del home (igual que AURC). Invalidación de páginas (igual que LRC/AURC). Cuando falla una página se trae del home (igual que AURC). No se consulta al home en el acquire, sino cuando se invoca la variable (como en ENTRY) No se consulta al home en el acquire, sino cuando se invoca la variable (como en ENTRY) La actividad de invocar una variable se relaciona con la página entera (diferencia con ENTRY). La actividad de invocar una variable se relaciona con la página entera (diferencia con ENTRY). Cada nodo mantiene una lista de listas de actualizaciones, una por cada lock (scope) abierto Cada nodo mantiene una lista de listas de actualizaciones, una por cada lock (scope) abierto
41
© José A. Gil40 Protocolos de consistencia Scope consistency (ScC) Cont. En el release el procesador incrementa su timestamp y el número de época del lock (el núm. de época se utiliza para determinar qué write notices enviar al siguiente acquire). En el release el procesador incrementa su timestamp y el número de época del lock (el núm. de época se utiliza para determinar qué write notices enviar al siguiente acquire). En tiempo de barrera se actualizan todas las write notices desde la última barrera (scope global). Lo que asegura que cuando se alcanza la barrera todo el espacio de direcciones se hace coherente. En tiempo de barrera se actualizan todas las write notices desde la última barrera (scope global). Lo que asegura que cuando se alcanza la barrera todo el espacio de direcciones se hace coherente.
42
© José A. Gil41 Protocolos de consistencia Implementaciones DSM (hw-mayormente vs sw-mayormente ) :
43
© José A. Gil42 DASH Origen y Entorno LENOSKI + LAUDON + GHARACHORLOO + WEBER + GUPTA + HENNESSY + HOROWITZ + LAM Universidad de Stanford El sistema: nodo SG 4D/340 (4 Proc., 2-niveles cache local, memoria) SG 4D/340 (4 Proc., 2-niveles cache local, memoria) + tarjetas (controladora de directorio, interface de la red) + tarjetas (controladora de directorio, interface de la red) dos mallas 2-D wormhole (petición + respuesta) prototipo: 16 nodos memoria compartido particionada protocolo de coherencia cache distribuido por directorio Referencia: Lenoski, D., et al., "The Stanford DASH Multiprocessor," IEEE Computer, Vol. 25, No. 3, March 1992, pp. 63-79.
44
© José A. Gil43 DASH Memoria distribuída con un solo espacio de dirección y un protocolo de coherencia de cache basado en directorio Granularidad: bloque de cache (16 bytes) Cada bloque tiene su home cluster: el lugar físico + entrada de directorio correspondiente
45
© José A. Gil44 DASH Jerarquía de memoria: 4 niveles 1. el cache de procesador 1. el cache de procesador 2. las caches de otros procesadores del cluster local 2. las caches de otros procesadores del cluster local 3. el cluster de home 3. el cluster de home 4. el cluster remoto 4. el cluster remoto Protocolo de coherencia Directorio distribuido completamente mapeado Basado en invalidación Entrada del directorio: vector de bits de presencia + bit de sucio + bits de estado Estados: uncached: no cacheado por ningún otro cluster shared: copias cacheadas no-modificadas dirty: modificada la copia en una sola cache de algún cluster
46
© José A. Gil45 DASH Operación de lectura: Si no se satisface dentro del cluster la petición se envía al directorio home la petición se envía al directorio home Si el bloque está en estado SHARED o UNCACHED la petición se satisface por el cluster home la petición se satisface por el cluster home Si el estado era UNCACHED se cambia a SHARED. Si el estado era UNCACHED se cambia a SHARED. Si el bloque está en estado DIRTY la petición se reenvía al cluster remoto la petición se reenvía al cluster remoto la petición se satisface por el cluster remoto la petición se satisface por el cluster remoto se envía un mensaje de escritura al cluster home se envía un mensaje de escritura al cluster home el cluster home actualiza el estado a shared el cluster home actualiza el estado a shared
47
© José A. Gil46 DASH Operación de escritura: Petición de lectura exclusiva al cluster home Si el bloque está SHARED El cluster home satisface la petición El cluster home satisface la petición El cluster home cambia el estado a DIRTY El cluster home cambia el estado a DIRTY El cluster home envía invalidaciones a las copias compartidas El cluster home envía invalidaciones a las copias compartidas Los clusters en sahed envían reconocimientos de invalidación al cluster que hizo la petición Los clusters en sahed envían reconocimientos de invalidación al cluster que hizo la petición Si el bloque está DIRTY El cluster home retransmite la petición al cluster remoto El cluster home retransmite la petición al cluster remoto El cluster remoto satisface la petición. El cluster remoto satisface la petición.
48
© José A. Gil47 DASH Diagrama de bloques de las tarjetas Reply Controller (RC) Remote Access Cache (RAC) almacena el estado de las peticiones de memoria pendientes y las respuestas remotasRemote Access Cache (RAC) almacena el estado de las peticiones de memoria pendientes y las respuestas remotas Contadores de invalidación por procesadorContadores de invalidación por procesador la RAC husmea en el busla RAC husmea en el bus Pseudo-CPU (PCPU) Retranmite las peticiones remotas al MPbusRetranmite las peticiones remotas al MPbus Genera invalidaciones de líneas de cache y bloqueo de premisosGenera invalidaciones de líneas de cache y bloqueo de premisos Encaminador Rply dimensión Y Directory Controller (DC) Directorio DRAMDirectorio DRAM Retranmite las peticiones locales a clusters remotosRetranmite las peticiones locales a clusters remotos Responde petic. remotasResponde petic. remotas Responde al Mpbus con información del directorioResponde al Mpbus con información del directorio Almacena bloqueos y colas de bloqueosAlmacena bloqueos y colas de bloqueos Monitor de Prestaciones Cuentas, distribuciones y trazas del bus, red y eventos internos.Cuentas, distribuciones y trazas del bus, red y eventos internos. Encaminador Rply dimensión X Respuestas a clusters Y ± 1 Peticiones a clusters Y ± 1 Respuestas a clusters X ± 1 Peticiones a clusters X ± 1 Mpbus Direcciones, Control y Datos Reply Controller (RC) board Directory Controller (DC) board
49
© José A. Gil48 DASH Petición de lectura de un bloque DIRTY Una CPU genera una lectura en el bus y es forzada a reintentarUna CPU genera una lectura en el bus y es forzada a reintentar Se genera una nueva entrada en la RACSe genera una nueva entrada en la RAC DC envía una Read-Req al homeDC envía una Read-Req al home La PCPU genera una lectura en el busLa PCPU genera una lectura en el bus La entrada en el directorio está en DIRTYLa entrada en el directorio está en DIRTY DC retransmite una Read-Req al cluster dirtyDC retransmite una Read-Req al cluster dirty La PCPU genera una lectura en el busLa PCPU genera una lectura en el bus La cache dirty responde con los datosLa cache dirty responde con los datos DC envía una Read-Rply al cluster localDC envía una Read-Rply al cluster local DC envía una Sharing-Writeback al cluster homeDC envía una Sharing-Writeback al cluster home La PCPU genera Sharing-Writeback en el busLa PCPU genera Sharing-Writeback en el bus DC actualiza la entrada del directorio al estado sharedDC actualiza la entrada del directorio al estado shared RC obtiene la Read-Rply y libera la CPURC obtiene la Read-Rply y libera la CPU La CPU reintenta la lectura y la RAC responde con los datosLa CPU reintenta la lectura y la RAC responde con los datos 1 2 3a 3b Cluster Local Cluster Home Cluster Dirty Read-Req al home Read-Req al dirty Read-Rply al local Sharing-Writeback al home
50
© José A. Gil49 DASH Petición de escritura de un bloque SHARED El buffer de escritura de la CPU genera una lectura-exclusiva en el bus y es forzado a reintentarEl buffer de escritura de la CPU genera una lectura-exclusiva en el bus y es forzado a reintentar Se genera una nueva entrada en la RACSe genera una nueva entrada en la RAC DC envía una Read-Ex-Req al homeDC envía una Read-Ex-Req al home La PCPU genera una lectura-excl en el busLa PCPU genera una lectura-excl en el bus La entrada en el directorio está en SHAREDLa entrada en el directorio está en SHARED DC envía una Read-Ex-Rply con la cuenta de invalidación al cluster localDC envía una Read-Ex-Rply con la cuenta de invalidación al cluster local DC envía una Inv-Req a los cluster sharedDC envía una Inv-Req a los cluster shared DC actualiza el estado a DIRTYDC actualiza el estado a DIRTY La PCPU genera una lectura-excl. en el bus para invalidar las copias compartidasLa PCPU genera una lectura-excl. en el bus para invalidar las copias compartidas DC envía una Inv-Ack al cluster localDC envía una Inv-Ack al cluster local La cuenta de inv. de la entrada de la RAC se decrementa a cada Inv-AckLa cuenta de inv. de la entrada de la RAC se decrementa a cada Inv-Ack Cuando la cuenta llega a 0 se libera la entrada de la RACCuando la cuenta llega a 0 se libera la entrada de la RAC 1 2a Cluster Local Cluster Home Clusters Remotos Read-Ex-Req al home Read-EXRply al local Inv-Ack al local RC recibe Read-Ex-Rply con datos y cuenta de invalidación y libera la CPURC recibe Read-Ex-Rply con datos y cuenta de invalidación y libera la CPU El buffer reintenta la lectura-exclusiva y el RAC contesta con los datosEl buffer reintenta la lectura-exclusiva y el RAC contesta con los datos El buffer reintenta la escrituraEl buffer reintenta la escritura La PCPU genera una lectura-excl. en el bus para invalidar las copias compartidasLa PCPU genera una lectura-excl. en el bus para invalidar las copias compartidas DC envía una Inv-Ack al cluster localDC envía una Inv-Ack al cluster local La PCPU genera una lectura-excl. en el bus para invalidar las copias compartidasLa PCPU genera una lectura-excl. en el bus para invalidar las copias compartidas DC envía una Inv-Ack al cluster localDC envía una Inv-Ack al cluster local 2b1:n 31:n Inv-Req a los shared
51
© José A. Gil50 DIPC: semáforos Primitivas de gestión de semáforos Declaración (creación, apertura de uno existente,...) semget (...) semget (...) Control (inicialización, consulta, destrucción,...) semctl (...) semctl (...) Operaciones semop (...) semop (...) Includes necesarios: # include # include
52
© José A. Gil51 DIPC: semget int semget ( key_t key, int nsems, int semflg ) Parámetros key: clave de acceso al conjunto de semáforos key: clave de acceso al conjunto de semáforos nsems: num. de semáforos en el conjunto nsems: num. de semáforos en el conjunto semflg: flags de creación semflg: flags de creación Retorna: un identificador del conjunto de semáforos o error si negativo un identificador del conjunto de semáforos o error si negativo Ejemplo: #ifdef __GLIBC__ #define IPC_DIPC 00010000 /*make it distributed*/ #endif #define SEM_KEY 31 #define SEM_MODE (IPC_DIPC | IPC_EXCL | 0777)... semid = semget(SEM_KEY, 2, SEM_MODE | IPC_CREAT); if(semid < 0) { fprintf(stderr,"semget() failed BECAUSE %s\n", strerror(errno)); exit(-1); }
53
© José A. Gil52 DIPC: semctl int semctl ( int semid, int semnum, int cmd, union semun arg ) Parámetros semid: identificador del conjunto de semáforos semid: identificador del conjunto de semáforos semnum : num. del semáforo en el conjunto empezando por 0 semnum : num. del semáforo en el conjunto empezando por 0 cmd: orden cmd: orden arg: argumentos de la orden arg: argumentos de la orden Retorna: resultado de la operación o error si negativo resultado de la operación o error si negativo Argumentos: #if !defined(__GNU_LIBRARY__) || defined(_SEM_SEMUN_UNDEFINED) union semun { int val; /* value for SETVAL */ struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */ unsigned short int *array; /* array for GETALL, SETALL */ struct seminfo *__buf; /* buffer for IPC_INFO */ };#endif
54
© José A. Gil53 DIPC: semctl int semctl ( int semid, int semnum, int cmd, union semun arg ) Ordenes: cmd = IPC_STAT cmd = IPC_STAT Copia en arg.buf la estructura completa del conjunto Copia en arg.buf la estructura completa del conjunto cmd = IPC_SET cmd = IPC_SET Copia de arg.buf la estructura completa en el conjunto Copia de arg.buf la estructura completa en el conjunto cmd = IPC_RMID cmd = IPC_RMID Destruye el semáforo y despierta procesos (necesita permisos) Destruye el semáforo y despierta procesos (necesita permisos) cmd = GETALL cmd = GETALL Retorna en arg.array los valores de todos los semáforos (semval) Retorna en arg.array los valores de todos los semáforos (semval) cmd = GETNCTN cmd = GETNCTN Retorna un int con el número de procesos esperando que se incremente semval del semáforo semnum. Retorna un int con el número de procesos esperando que se incremente semval del semáforo semnum. cmd = GETPID cmd = GETPID Retorna un int con el identificador del último proceso que ejecutó un semop sobre el semáforo semnum. Retorna un int con el identificador del último proceso que ejecutó un semop sobre el semáforo semnum.
55
© José A. Gil54 DIPC: semctl int semctl ( int semid, int semnum, int cmd, union semun arg ) Ordenes: cmd = GETVAL cmd = GETVAL Retorna un int con el valor de semval del semáforo semnum. Retorna un int con el valor de semval del semáforo semnum. cmd = GETZCNT cmd = GETZCNT Retorna un int con el número de procesos esperando que semval del semáforo semnum tome el valor cero. Retorna un int con el número de procesos esperando que semval del semáforo semnum tome el valor cero. cmd = SETALL cmd = SETALL Posiciona los valores de los semáforos de acuerdo con arg.array, los procesos que esperan "pueden" ser despertados. Posiciona los valores de los semáforos de acuerdo con arg.array, los procesos que esperan "pueden" ser despertados. cmd = SETVAL cmd = SETVAL Posiciona semval del semáforo semnum de acuerdo con arg.val, los procesos que esperan "pueden" ser despertados. Posiciona semval del semáforo semnum de acuerdo con arg.val, los procesos que esperan "pueden" ser despertados.
56
© José A. Gil55 DIPC: semctl int semctl ( int semid, int semnum, int cmd, union semun arg ) Ejemplo: unsigned short seminit[2];... seminit[0] = seminit[1] = 0; if(semctl(semid, 0, SETALL, (union semun) seminit) < 0) { fprintf(stderr,"can't initialize the semaphores BECAUSE %s\n", strerror(errno)); exit(-1); }
57
© José A. Gil56 DIPC: semop int semop ( int semid, struct sembuf *sops, unsigned nsops ) Parámetros semid: identificador del conjunto de semáforos semid: identificador del conjunto de semáforos sops: vector de operaciones empezando por 0 sops: vector de operaciones empezando por 0 nsops: num. de operaciones a realizar nsops: num. de operaciones a realizar Retorna: resultado de la operación o error si negativo resultado de la operación o error si negativo Cada elemento del struct sembuf incluye: short sem_num; /* semaphore number: 0 = first */ short sem_num; /* semaphore number: 0 = first */ short sem_op; /* semaphore operation */ short sem_op; /* semaphore operation */ short sem_flg; /* operation flags */ short sem_flg; /* operation flags */
58
© José A. Gil57 DIPC: semop int semop ( int semid, struct sembuf *sops, unsigned nsops ) Operaciones Si sem_op > 0 Si sem_op > 0 semval = semval + sem_op semval = semval + sem_op Si sem_op < 0 Si sem_op < 0 Si semval >= abs(sem_op) Si semval >= abs(sem_op) semval = semval - abs(sem_op) Si no Si no semncnt = semncnt +1 dormir hasta semval >= abs(sem_op) semncnt = semncnt -1 semval = semval - abs(sem_op) Si sem_op = 0 Si sem_op = 0 Si semval <> 0 Si semval <> 0 semzcnt = semzcnt +1 dormir hasta semval = 0 semzcnt = semzcnt -1
59
© José A. Gil58 DIPC: semop int semop ( int semid, struct sembuf *sops, unsigned nsops ) Flags: SEM_UNDO: la operación será deshecha cuando el proceso haga exit. SEM_UNDO: la operación será deshecha cuando el proceso haga exit. IPC_NOWAIT: el proceso no se esperará en el semáforo, en caso de que hubiera tenido que esperarse se devuelve el error EAGAIN IPC_NOWAIT: el proceso no se esperará en el semáforo, en caso de que hubiera tenido que esperarse se devuelve el error EAGAIN Ejemplo: struct sembuf sem[2];... sem[1].sem_num = 1; sem[1].sem_op = -1; sem[1].sem_flg = SEM_UNDO; if(semop(semid, &sem[1], 1) <0) { printf("mio: semop() failed BECAUSE %s\n", strerror(errno)); exit(-1);}
60
© José A. Gil59 DIPC: mensajes Primitivas de gestión de mensajes Declaración (creación, apertura de uno existente,...) msgget (...) msgget (...) Control (inicialización, consulta, destrucción,...) msgctl (...) msgctl (...) Operaciones msgsnd (...) msgsnd (...) msgrcv (...) msgrcv (...) Includes necesarios: # include # include
61
© José A. Gil60 DIPC: msgget int msgget ( key_t key, int msgflg ) Parámetros key: clave de acceso a la cola de mensajes key: clave de acceso a la cola de mensajes msgflg: flags de creación msgflg: flags de creación Retorna: un identificador de la cola de mensajes o error si negativo un identificador de la cola de mensajes o error si negativo Ejemplo: #ifdef __GLIBC__ #define IPC_DIPC 00010000 /* make it distributed */ #endif #define MSG_KEY 40 #define MSG_MODE (IPC_DIPC | IPC_EXCL | 0777)... msgid = msgget(MSG_KEY, MSG_MODE | IPC_CREAT); msgid = msgget(MSG_KEY, MSG_MODE | IPC_CREAT); if(msgid < 0) { if(msgid < 0) { fprintf(stderr,"msgget() failed BECAUSE %s\n", strerror(errno)); exit(20); exit(20); }
62
© José A. Gil61 DIPC: msgctl int msgctl (int msqid, int cmd, struct msqid_ds *buf) Parámetros msqid: identificador de la cola de mensajes msqid: identificador de la cola de mensajes cmd: orden cmd: orden buf: puntero a estructura de cola buf: puntero a estructura de cola Retorna: error si negativo error si negativo Ordenes: cmd = IPC_STAT cmd = IPC_STAT Copia en buf la estructura completa de la cola Copia en buf la estructura completa de la cola cmd = IPC_SET cmd = IPC_SET Copia de buf la estructura completa en la cola Copia de buf la estructura completa en la cola cmd = IPC_RMID cmd = IPC_RMID Destruye la cola y su estructura y despierta procesos (necesita permisos) Destruye la cola y su estructura y despierta procesos (necesita permisos) Ejemplo: msgctl(msgid,IPC_RMID,NULL);
63
© José A. Gil62 DIPC: msgctl int msgctl (int msqid, int cmd, struct msqid_ds *buf) Estructura de la cola: struct msqid_ds { struct ipc_perm msg_perm;/*structure describing operation permission*/ struct ipc_perm msg_perm;/*structure describing operation permission*/ struct msg *__msg_first;/*pointer to first message on queue*/ struct msg *__msg_first;/*pointer to first message on queue*/ struct msg *__msg_last;/*pointer to last message on queue*/ struct msg *__msg_last;/*pointer to last message on queue*/ __time_t msg_stime;/*time of last msgsnd command*/ __time_t msg_stime;/*time of last msgsnd command*/ __time_t msg_rtime;/*time of last msgrcv command*/ __time_t msg_rtime;/*time of last msgrcv command*/ __time_t msg_ctime;/*time of last change*/ __time_t msg_ctime;/*time of last change*/ struct wait_queue *__wwait;/*???*/ struct wait_queue *__wwait;/*???*/ struct wait_queue *__rwait;/*???*/ struct wait_queue *__rwait;/*???*/ unsigned short int __msg_cbytes; /*current number of bytes on queue*/ unsigned short int __msg_cbytes; /*current number of bytes on queue*/ unsigned short int msg_qnum;/*num of messages currently queued*/ unsigned short int msg_qnum;/*num of messages currently queued*/ unsigned short int msg_qbytes; /*max number of bytes allowed on queue*/ unsigned short int msg_qbytes; /*max number of bytes allowed on queue*/ __ipc_pid_t msg_lspid;/*pid of last msgsnd()*/ __ipc_pid_t msg_lspid;/*pid of last msgsnd()*/ __ipc_pid_t msg_lrpid;/*pid of last msgrcv()*/ __ipc_pid_t msg_lrpid;/*pid of last msgrcv()*/};
64
© José A. Gil63 DIPC: msgsnd int msgsnd (int msqid, struct msgbuf *msgp, int msgsz, int msgflg) Parámetros msqid: identificador de la cola de mensajes msqid: identificador de la cola de mensajes msgp: puntero al buffer del mensaje msgp: puntero al buffer del mensaje msgsz: tamaño del mensaje en bytes msgsz: tamaño del mensaje en bytes msgflg: comportamiento de la llamada msgflg: comportamiento de la llamada Si msgsz > msg_qbytes Si msgflg = IPC_NOWAIT retorna ERROR Sino espera hasta msgsz <= msg_qbytes Retorna: error si negativo error si negativo El struct msgbuf incluye: struct msgbuf { long mtype; /* message type, must be > 0 */ char mtext[1]; /* message data */ };
65
© José A. Gil64 DIPC: msgsnd int msgsnd (int msqid, struct msgbuf *msgp, int msgsz, int msgflg) Ejemplo: #define MSG_TYPE 10 #define MSG_SIZE 512 struct message { long mtype; long mtype; char mtext[MSG_SIZE]; }; char mtext[MSG_SIZE]; }; struct message mess;... mess.mtype = MSG_TYPE; /* not necessary here */ strcpy(mess.mtext,"Hello, Distributed Programming!"); if(msgsnd(msgid, (struct msgbuf *)&mess, sizeof(mess.mtext), 0) < 0) { fprintf(stderr,"msgsnd() failed BECAUSE %s\n", strerror(errno)); fprintf(stderr,"msgsnd() failed BECAUSE %s\n", strerror(errno)); exit(20); exit(20); }
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.