
En las memorias compartidas distribuidas es importante tener presente un modelo de consistencia, puesto que están relacionados entre sí formando un conjunto sólido, donde dicho modelo establece la forma en que se hacen visibles a los distintos nodos del sistema las actualizaciones hechas a la memoria compartida mediante la estructura de todos los modelos, los cuales son cruzados entre sí para revisar la consistencia de los mismos para una especificación balanceada o equilibrada, con el objetivo de mejorar el rendimiento y la seguridad especificando las garantías de consistencia que un sistema MCD realiza sobre los valores que los procesos leen desde los objetos, dado que en realidad acceden sobre una réplica de cada objeto y que múltiples procesos pueden actualizar los objetos.
Los modelos de memoria compartida se fundamentan en:
- Especifica las restricciones en el orden en el que las operaciones de memoria deben hacerse visibles a los procesadores.
- Los programadores se basan en el modelo de consistencia para razonar acerca de los posibles resultados (corrección de los programas).
- Para el diseñador del compilador o del hardware el modelo impone limitaciones a posibles reordenaciones (optimizaciones).
Los modelos que estudiaremos son:
Consistencia estricta
Consistencia secuencial
Consistencia causal
PRAM
Consistencia débil
Consistencia relajada
CONSISTENCIA ESTRICTA
Cualquier lectura a la localidad de memoria x retorna el valor almacenado por la última operación de escritura (antes de la lectura).
Supone la existencia de un tiempo global. Determinar cuál fue la escritura más reciente no siempre es posible.
Dado un cierto modelo de consistencia, los programadores y el sistema acuerdan un determinado comportamiento para la memoria. Así, bajo un modelo de consistencia estricto, cada actualización es vista en forma instantánea por todos los nodos en el sistema. Aunque este será el ideal para cualquier programador, en la práctica es imposible de implementar y mucho menos en una red de computadores.
CONSISTENCIA SECUENCIAL
Bajo este modelo, las actualizaciones a la memoria compartida son vistas en el mismo orden por todos los nodos. Sin embargo, este orden puede variar en distintas ejecuciones, en la misma forma en que podrá variar bajo un modelo estricto dada la concurrencia con que se realizan las actualizaciones. Para poder cumplir con este modelo es necesario hacer del conocimiento de todos los nodos la ocurrencia de una actualización, provocando una alta tasa de comunicación por la red y por consiguiente un desempeño muy pobre del sistema en general.
Por otra parte, cuando se ejecutan procesos en paralelo sobre diferentes máquinas, cualquier mezcla de ejecución es un resultado aceptable, no obstante todos los procesos deben ver la misma secuencia de referencias a memoria y se respeta el orden de los programas.
CONSISTENCIA CAUSAL
Determina las actualizaciones que deben propagarse de acuerdo a una relación de causalidad entre los accesos a memoria. Dos escrituras a la memoria están causalmente relacionadas si el producto de una de ellas puede depender del producto de la otra, a través de una lectura. De acuerdo a este modelo, las escrituras que están causalmente relacionadas deben verse en el mismo orden en todos los nodos. El resto de las actualizaciones no tienen restricción en su propagación.
Por ejemplo; Si un evento B es causado o influenciado por un evento A, la causalidad requiere que todo el mundo vea primero el evento A y luego el B.
Cuando encontramos una lectura seguida por una escritura, los dos eventos están potencialmente relacionados en forma causal.
CONSISTENCIA PRAM (PIPELINED RAM)
Las escrituras realizadas por un proceso, son recibidas por el resto en el orden en el cual éstas fueron ejecutadas, no obstante, las escrituras realizadas por diferentes procesos pueden ser vistas en órdenes diferentes por todos ellos.
CONSISTENCIA DÉBIL
Aprovecha el conocimiento de las operaciones de sincronización para relajar la consistencia de memoria, mientras se muestra al programador para implementar una consistencia secuencial.
Se introduce un nuevo tipo de variable: variables de sincronización.
Los accesos a las variables de sincronización son secuencialmente consistentes. Todos los procesos ven todos los accesos a las variables de sincronización en el mismo orden.
No se permite el acceso a ninguna variable de sincronización hasta que todas las escrituras previas se hayan completado: Hacer una sincronización después de operaciones de escritura obliga a que los nuevos valores se propaguen a todas las memorias.
El hacer una operación de sincronización antes de leer los datos, le garantiza a un proceso que leerá los últimos valores.
Operación de sincronización: garantiza que las escrituras locales sean propagadas a todas las otras máquinas y se actualiza la memoria actual con escrituras hechas remotamente.
CONSISTENCIA RELAJADA
Se basa en el supuesto de que los accesos a variables compartidas se protegen en secciones críticas empleando primitivas de sincronización, como locks. En este caso, todo acceso esta precedido por una operación acquire y seguido por una operación release. Puesto que ningún otro proceso, ni local ni remoto, puede acceder a las variables modificadas protegidas en la sección crítica hasta tener control del lock, la actualización de cualquier modificación puede postergarse hasta el momento en que se lleva a cabo la operación release. El release no se completa hasta que la actualización se haya llevado a cabo en todos los nodos donde haya copias.
Acquire: la memoria se asegura que todas las copias locales de las variables protegidas se actualizan con las variables remotas.
Release: con esta operación se propagan los cambios realizados a las variables protegidas al resto de las máquinas.
Por ultimo es importante resaltar que 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 acudir a los modelos antes expuestos, ya que los mismos, permiten establecer un nivel aceptable de acercamiento tanto a la consistencia como al rendimiento.