1. 4.1.- Configuraciones memoria compartida distribuida
Computación paralela
Un computador paralelo es un conjunto de procesadores capaces de cooperar en la solución
de un problema.
El problema se divide en partes. Cada parte se compone de un conjunto de instrucciones.
Las instrucciones de cada parte se ejecutan simultáneamente en diferentes CPUs.
Técnicas computacionales que descomponen un problema en sus tareas y pistas que pueden
ser computadas en diferentes máquinas o elementos de proceso al mismo tiempo.
¿Por qué utilizar computación paralela?
Reducir el tiempo de procesamiento.
Resolver problemas de gran envergadura.
Proveer concurrencia.
Utilizar recursos remotos de cómputo cuando los locales son escasos.
Reducción de costos usando múltiples recursos ”baratos” en lugar de costosas
supercomputadoras.
Ampliar los límites de memoria para resolver problemas grandes.
El mayor problema de la computación paralela radica en la complejidad de sincronizar unas
tareas con otras, ya sea mediante secciones críticas, semáforos o paso de mensajes, para
garantizar la exclusión mutua en las zonas del código en las que sea necesario.
La computación paralela está penetrando en todos los niveles de la computación, desde
computadoras masivamente paralelas usados en las ciencias de larga escala computacional,
hasta servidores múltiples procesadores que soportan procesamiento de transacciones. Los
principales problemas originados en cada uno de las áreas básicas de la informática (por
ejemplo, algoritmos, sistemas, lenguajes, arquitecturas, etc.) se vuelven aún más complejos
dentro del contexto de computación paralela.
4.1.1.- De circuitos basados en bus, anillo o con
2. conmutador
En la topología de bus todos los nodos (computadoras) están conectadas a un circuito
común (bus).
La información que se envía de una computadora a otra viaja directamente o
indirectamente, si existe un controlador que en ruta los datos al destino correcto.
La información viaja por el cable en ambos sentidos a una velocidad aproximada de 10/100
Mbps y tiene en sus dos extremos una resistencia (terminador).
Se pueden conectar una gran cantidad de computadores al bus, si un computador falla, la
comunicación se mantiene, no sucede lo mismo si el bus es el que falla.
El tipo de cableado que se usa puede ser coaxial, par trenzado o fibra óptica.
Topología de anillo:
En la topología de anillo los nodos computadoras (nodos) están conectadas a la siguiente,
formando un anillo. Cada computadora tiene una dirección única.
Cuando un mensaje es enviado, este viaja a través del lazo de computadora en
computadora. Cada una de ellas examina la dirección de destino.
3. Si el mensaje no está direccionado a ella, reenvía el mensaje a la próxima computadora, y
así hasta que el mensaje encuentre la computadora destino.
Si se daña el cable, la comunicación no es posible.
4. 4.2.- Modelos de consistencia
La duplicidad de los bloques compartidos aumenta el rendimiento, pero produce un
problema de consistencia entre las diferentes copias de la página en caso de una escritura.
Si con cada escritura es necesario actualizar todas las copias, el envío de las páginas por la
red provoca que el tiempo de espera aumente demasiado, convirtiendo este método en
impracticable. Para solucionar este problema se proponen diferentes modelos de
consistencia, que establezcan un nivel aceptable de acercamiento tanto a la consistencia
como al rendimiento. Nombramos algunos modelos de consistencia, del más fuerte al más
débil: consistencia estricta, secuencial, causal, PRAM, del procesador, débil, de liberación
y de entrada.
4.2.1.- Estricta, causal, secuencial, débil, de liberación y
de entrada
Consistencia Estricta
El modelo de consistencia más restrictivo es llamado consistencia estricta y es definido por
la siguiente condición Cualquier lectura sobre un ítem de dato x retorna un valor
correspondiente con la más reciente escritura sobre x.
a) Un almacenamiento estrictamente consistente.
b) Un almacenamiento que no es estrictamente consistente.
Consistencia Causal:
El modelo de consistencia causal (Hutto and Ahamad, 1990) es un debilitamiento de la
consistencia secuencial. Se hace una diferenciación entre eventos que están potencialmente
relacionados en forma causal y aquellos que no. Las operaciones que no están causalmente
relacionadas se dicen concurrentes.
La condición a cumplir para que unos datos sean causalmente consistentes es:
Escrituras que están potencialmente relacionadas en forma causal deben ser vistas por todos
los procesos en el mismo orden. Escrituras concurrentes pueden ser vistas en un orden
diferente sobre diferentes máquinas.
5. Esta secuencia es permitida con un almacenamiento causalmente consistente, pero no con
un almacenamiento secuencialmente consistente o con un almacenamiento consistente en
forma estricta.
Consistencia secuencial:
La consistencia secuencial es una forma ligeramente más débil de la consistencia estricta.
Satisface la siguiente condición:
El resultado de una ejecución es el mismo si las operaciones (lectura y escritura) de todos
los procesos sobre el dato fueron ejecutadas en algún orden secuencial y las operaciones de
cada proceso individual aparecen en esta operaciones de cada proceso individual aparecen
en esta secuencia en el orden especificado por su programa.
a) Un dato almacenado secuencialmente consistente.
b) Un dato almacenado que no es secuencialmente consistente.
Consistencia Débil:
Los accesos a variables de sincronización asociadas con los datos almacenados son
secuencialmente consistentes.
Propiedades:
No se permite operación sobre una variable de sincronización hasta que todas las escrituras
previas de hayan completado. No se permiten operaciones de escritura o lectura sobre ítems
de datos hasta que no se hayan completado operaciones previas sobre variables de
sincronización.
Consistencia liberación (Release):
El modelo de consistencia release, se basa en el supuesto de que los accesos a variables
compartidas se protegen en secciones críticas empleando primitivas de sincronización,
como por ejemplo locks. En tal caso, todo acceso esta precedido por una operación
adquiere y seguido por una operación release. Es responsabilidad del programador que esta
propiedad se cumpla en todos los programas.
Puesto que ningún otro proceso, ni local ni remoto, puede acceder a las variables que han
sido modificadas mientras se encuentren protegidas en la sección crítica, la actualización de
cualquier modificación puede postergarse hasta el momento en que se lleva a cabo la
operación release.
La operación release no se da por completada hasta que la actualización haya sido
propagada a todos aquellos procesadores en donde haya replicas. Con RC, la propagación
de un conjunto de modificaciones a memoria compartida se lleva a cabo con un costo fijo.
Propagación de Actualizaciones bajo RC y LRC de código sin proteger. En consecuencia
obtuvo un valor inconsistente para la variable leída.
6. 4.3.- Mcd en base a páginas
El esquema de MCD propone un espacio de direcciones de memoria virtual que integre la
memoria de todas las computadoras del sistema, y su uso mediante paginación. Las páginas
quedan restringidas a estar necesariamente en un único ordenador. Cuando un programa intenta
acceder a una posición virtual de memoria, se comprueba si esa página se encuentra de forma
local. Si no se encuentra, se provoca un fallo de página, y el sistema operativo solicita la página al
resto de computadoras. El sistema funciona de forma análoga al sistema de memoria virtual
tradicional, pero en este caso los fallos de página se propagan al resto de ordenadores, hasta que
la petición llega al ordenador que tiene la página virtual solicitada en su memoria local. A primera
vista este sistema parece más eficiente que el acceso a la memoria virtual en disco, pero en la
realidad ha mostrado ser un sistema demasiado lento en ciertas aplicaciones, ya que provoca un
tráfico de páginas excesivo.
Una mejora dirigida a mejorar el rendimiento sugiere dividir el espacio de direcciones en
una zona local y privada y una zona de memoria compartida, que se usará únicamente por
procesos que necesiten compartir datos. Esta abstracción se acerca a la idea de
programación mediante la declaración explícita de datos públicos y privados, y minimiza el
envío de información, ya que sólo se enviarán los datos que realmente vayan a compartirse.
4.3.1.- Diseño, replica, granularidad, consistencia, propietario y copias
Diseño
De la descripción del sistema DSM-PEPE, es evidente que la especificación de los
protocolos que implementan los distintos modelos de consistencia de memoria se encuentra
dispersa entre los componentes del sistema. Esto está relacionado con el hecho que los
protocolos implementados desencadenan sus acciones de consistencia bajo distintas
condiciones. En el caso del protocolo de consistencia secuencial, las acciones de
consistencia se desencadenan a partir de faltas de página detectadas por el sistema
operativo, y en el caso del protocolo de consistencia de entrada, por acciones de
sincronización explícitas dentro del código del usuario.
El hecho que la especificación se encuentre dispersa dificulta tanto la incorporación de
nuevos protocolos de consistencia como la modificación de los ya existentes, debido a que
los componentes tienen además de su funcionalidad básica responsabilidades que no les
corresponden. Por ejemplo, los objetos DSMPage y DSMLock se encargan de ejecutar
acciones de consistencia, a pesar que no es función de ellos manejar este tipo de acciones.
Específicamente la clase DSMPage debería encargarse de realizar actualizaciones de las
páginas y mantener el estado de ellas; la clase DSMLock debería manejar únicamente
acciones de sincronización como el envío y recepción del token de exclusión mutua. Sería
deseable con el propósito de tener un mejor diseño que estas clases no incluyeran acciones
ligadas a los protocolos de consistencia como ocurre en este momento.
7. Para mejorar el diseño de este sistema es necesario extraer y luego encapsular la
especificación de los protocolos de consistencia de manera que sea el aspecto quien tome
las acciones de consistencia necesaria. Más aún, a partir del hecho que los protocolos de
consistencia dependiendo de su tipo toman acciones de consistencia en diferentes
componentes se propone que cada modelo de consistencia de memoria en DSM-PEPE sea
considerado como un aspecto.
A partir del análisis de los protocolos de consistencia de DSM-PEPE ya explicados
ejemplificaremos nuestra propuesta, detallando las modificaciones que se deben realizar
para conseguir un mejor diseño.
Replica
1. Replicar los bloques de sólo lectura
2. Replicar todos los bloques: en este caso se tienen que tomar acciones
para mantener la consistencia de los datos.
Granularidad
Los distintos tipos de grafo se diferencian por la granularidad de sus nodos y la información
contenida en las aristas. En todos los casos, los nodos del grafo contienen un apuntador a
una operación de la representación en WHIRL. A su vez, las operaciones de la
representación intermedia también tienen asociado un apuntador que les va a permitir
acceder al nodo correspondiente del grafo de dependencias. En el grafo de dependencias
entre arrays, los nodos apuntan a operaciones de load y store sobre arrays, mientras que en
el grafo de niveles de dependencia, los nodos apuntan a sentencias, que son elementos de
mayor granularidad.
Respecto a las aristas, estas van a contener vectores de dependencia en el grafo de
dependencias entre arrays o una etiqueta indicando el nivel de la dependencia en el caso del
grafo de niveles de dependencia.
La figura muestra de forma esquemática como se guardan los grafos. La estructura de datos
que se utiliza es la clase ARRAY DIRECTED GRAPH16, que se declara en /be/com/dep
graph.h. El tipo de dato que se utiliza para declarar las aristas es una unión de tres tipos
distintos, que son DEPV ARRAY para el grafo de dependencias entre arrays, LEVEL
8. STRUCT para el de niveles de dependencia y DEP STRUCT para el utilizado en
generación de código.
La clase DEPV ARRAY contiene una lista de vectores de dependencia, cada uno de ellos
de tipo DEPV. Cada dimensión de un vector de dependencia guarda un elemento de tipo
DEP, que es un entero de dieciséis bits organizado de la siguiente forma:
Bit 15: indica si la distancia es constante.
Bits 12-14: señalan la dirección de la dependencia.
Bits 0-11: indica la distancia, en caso que esta sea constante, o un límite en caso contrario.
Consistencia
*Un modelo de consistencia de memoria (Mosberger 1993) especifica las garantías de
consistencia que un sistema otorga sobre los valores que los procesos leen de los objetos,
dado que en realidad acceden a una réplica de cada objeto y que múltiples procesos pueden
actualizar los objetos.
*La principal interrogante que se plantea al caracterizar un modelo de consistencia de
memoria es: cuándo se realiza un acceso de lectura sobre una posición de memoria, qué
accesos de escritura son candidatos para que sus valores sean proporcionados en la lectura.
*Cualquier lectura realizada antes.
*La ultimo lectura.
*Etc.
Propietario
El modelo de consistencia secuencial dice que todos los nodos deben ver las escrituras
sobre una variable en el mismo orden. El protocolo secuencial implementado en DSM-
PEPE funciona sobre la base de que en todo momento un nodo es el propietario (owner) de
una página y es sólo él quien puede escribir en ella. En caso que alguien más desee escribir
en ella, primero debe encontrar al propietario y solicitarle la página, en cuyo caso el nodo
receptor pasa a ser el nuevo propietario. La información de los propietarios de cada página
se mantiene como un atributo del objeto DSMPage, llamado probOwner, el cual indica
quién es su probable propietario.
Las acciones de consistencia se generan en cuatro tipos de eventos, que corresponden a
métodos del objeto.
DSMPage: faltas de páginas locales para lectura (ReadFault), faltas de página locales para
escritura (WriteFault), faltas de página remotas para lectura (RemoteReadFault), y faltas de
página remotas para escritura (RemoteWriteFault). En cada uno de esos casos se toman las
acciones necesarias para invalidar páginas, enviar copias actualizadas a quien las pide, y
9. actualizar los propietarios. La figura 1 muestra una descripción parcial de los objetos
involucrados con el protocolo de consistencia secuencial.
En el caso de la falta de lectura local, se envía una petición al probable propietario de la
página utilizando el atributo probOwner; eventualmente el mensaje llegará al propietario
actual, y éste enviará un mensaje con la copia actualizada de la página. En el caso de la
falta de escritura local, se realiza el mismo procedimiento para hallar al propietario actual
de la página, pero éste junto con enviar la copia actualizada, además invalida su copia local
y todas las copias que ha distribuido entre los demás nodos mientras fue propietario, y
entrega la propiedad de la página al nodo receptor. Las faltas remotas se utilizan para ubicar
al propietario de la página. Cuando llega una falta remota, el nodo evalúa si él es el
propietario de la página; si es así, contesta con la acción de copia o invalidación
correspondiente, y si no es así, reenvía la petición a quien él cree que es el probable
propietario utilizando su atributo probOwner. La recepción de faltas remotas se hace a
través de un objeto receptor de mensajes llamado msgMgrThread, el cual transmite el
evento de falta de página al objeto DSMPage correspondiente.
Copias
En el caso del protocolo de consistencia secuencial, se propone extraer de la especificación
del objeto DSMPage la información relativa al probable propietario de la página y de los
nodos que poseen copias de ella, ya que ésta es únicamente utilizada por el protocolo de
consistencia secuencial, y extraer del msgMgrThread la funcionalidad relativa al protocolo
de consistencia. Esto significa eliminar de la especificación del objeto DSMPage el atributo
probOwner, y también los métodos que manejan la consistencia actualmente, ReadFault,
WriteFault, RemoteReadFault, y RemoteWriteFault.
El sistema operativo y el objeto msgMgrThread generan los puntos de entrada a las
acciones de consistencia. La detección de una falta de página por el sistema operativo o la
recepción de un mensaje por el msgMgrThread corresponden a los puntos de unión del
aspecto encargado del protocolo de consistencia secuencial con el resto del sistema. El
aspecto recibirá el nombre de sequentialAspect. La figura muestra las modificaciones
propuestas y los puntos de unión para el aspecto sequentialAspect.
El aspecto sequentialAspect será el encargado de invalidar las páginas y enviar las copias
actualizadas cuando reciba un mensaje de falta de página remota y el nodo sea el
propietario de la página, o bien de redirigir mensajes de consistencia hacia los probables
propietarios de las páginas cuando no lo sea y reciba este mismo mensaje. Además, tendrá
que generar mensajes solicitando la página que se requiera cuando se produzca una falta de
página local.
Con esto el diseño del objeto DSMPage se hace más cohesionado, ya que ahora contiene
sólo la funcionalidad referente a la representación de una página de memoria y el
msgMgrThread se encarga sólo de la recepción de mensajes entre los nodos y transmisión
de estos mensajes hacia los objetos.
10. 4.4.- Mcd en base a variables
La compartición falsa se produce cuando dos procesos se pelean el acceso a la misma
página de memoria, ya que contiene variables que requieren los dos, pero estas no son las
mismas. Esto pasa por un mal diseño del tamaño de las páginas y por la poca relación
existente entre variables de la misma página.
En los MCD basados en variables se busca evitar la compartición falsa ejecutando un
programa en cada CPU que se comunica con una central, la que le provee de variables
compartidas, administrando este cualquier tipo de variable, poniendo variables grandes en
varias páginas o en la misma página muchas variables del mismo tipo, en este protocolo es
muy importante declarar las variables compartidas.
En los MCD basados en objetos se busca el acceso a datos por medio de la encapsulación
de la info. Y repartida a través de la red, estos objetos serán definidos por el Programador y
las CPU´s cambiaran los estados según procedan con los accesos.
4.5.- Mcd en base a objetos
Una alternativa al uso de páginas es tomar el objeto como base de la transferencia de
memoria. Aunque el control de la memoria resulta más complejo, el resultado es al mismo
tiempo modular y flexible, y la sincronización y el acceso se pueden integrar limpiamente.
Otra de las restricciones de este modelo es que todos los accesos a los objetos compartidos
han de realizarse mediante llamadas a los métodos de los objetos, con lo que no se admiten
programas no modulares y se consideran incompatibles.