Articulo de referencia

Modelo de consistencia

En informática , un modelo de consistencia especifica un contrato entre el programador y un sistema, en el que el sistema garantiza que si el programador sigue las reglas para l...

En informática , un modelo de consistencia especifica un contrato entre el programador y un sistema, en el que el sistema garantiza que si el programador sigue las reglas para las operaciones en memoria, esta será consistente y los resultados de lectura, escritura o actualización de memoria serán predecibles. Los modelos de consistencia se utilizan en sistemas distribuidos, como sistemas de memoria compartida distribuida o almacenes de datos distribuidos (como sistemas de archivos , bases de datos , sistemas de replicación optimista o almacenamiento en caché web ). La consistencia es diferente de la coherencia, que se da en sistemas con o sin caché , y se refiere a la consistencia de los datos con respecto a todos los procesadores. La coherencia se ocupa de mantener un orden global en el que las escrituras en una única ubicación o variable sean vistas por todos los procesadores. La consistencia se ocupa del ordenamiento de las operaciones en múltiples ubicaciones con respecto a todos los procesadores.

Los lenguajes de alto nivel , como C++ y Java , mantienen el contrato de consistencia traduciendo las operaciones de memoria a operaciones de bajo nivel de manera que se preserve la semántica de la memoria , reordenando algunas instrucciones de memoria y encapsulando la sincronización requerida con llamadas a bibliotecas como pthread_mutex_lock(). [ 1 ]

Ejemplo

Supongamos que ocurre el siguiente caso: [ 2 ]

  • La fila X se replica en los nodos M y N.
  • El cliente A escribe la fila X en el nodo M.
  • Después de un período de tiempo t, el cliente B lee la fila X del nodo N.

El modelo de consistencia determina si el cliente B verá con certeza la escritura realizada por el cliente A, si no la verá con certeza o si no puede confiar en verla.

Tipos

Los modelos de consistencia definen reglas para el orden aparente y la visibilidad de las actualizaciones, y se encuentran en un continuo con compensaciones. [ 2 ] Hay dos métodos para definir y categorizar los modelos de consistencia: emisión y vista.

Asunto
El método de emisión describe las restricciones que definen cómo un proceso puede emitir operaciones.
Vista
Método de vista que define el orden de las operaciones visibles para los procesos.

Por ejemplo, un modelo de consistencia puede definir que un proceso no puede emitir una operación hasta que se hayan completado todas las operaciones emitidas previamente. Los distintos modelos de consistencia imponen diferentes condiciones. Un modelo de consistencia se considera más estricto que otro si requiere todas las condiciones de ese modelo y más. En otras palabras, un modelo con menos restricciones se considera un modelo de consistencia más débil.

Estos modelos definen cómo debe estar dispuesto el hardware y, a grandes rasgos, cómo debe programar el desarrollador. El modelo elegido también influye en cómo el compilador puede reordenar las instrucciones. Generalmente, si existen dependencias de control entre las instrucciones y si las escrituras en la misma ubicación están ordenadas, el compilador puede reordenarlas según sea necesario. Sin embargo, con los modelos que se describen a continuación, algunos permiten reordenar las escrituras antes de las cargas, mientras que otros no.

Modelos de consistencia fuerte

Consistencia estricta

La consistencia estricta es el modelo de consistencia más robusto. Según este modelo, cualquier procesador debe percibir instantáneamente la escritura en una variable.

Los diagramas de modelo estricto y no estricto describen la restricción de tiempo: instantánea. Se puede entender mejor como si existiera un reloj global en el que cada escritura debe reflejarse en todas las cachés del procesador al final de ese período de reloj. La siguiente operación debe realizarse únicamente en el siguiente período de reloj.

En el siguiente diagrama, P significa "proceso" y el valor del reloj global está representado en la columna Secuencia.

Este es el modelo más rígido. En este modelo, el programador recibirá siempre el resultado esperado. Es determinista. Su relevancia práctica se limita a un experimento mental y a un formalismo, ya que el intercambio instantáneo de mensajes es imposible. No ayuda a resolver el problema de la resolución de conflictos en escrituras concurrentes sobre el mismo elemento de datos, puesto que presupone que las escrituras concurrentes son imposibles.

Consistencia secuencial

El modelo de consistencia secuencial fue propuesto por Lamport (1979). Es un modelo de memoria más débil que el modelo de consistencia estricta. [ 3 ] Una escritura en una variable no tiene que ser vista instantáneamente, sin embargo, las escrituras en variables por diferentes procesadores deben ser vistas en el mismo orden por todos los procesadores. La consistencia secuencial se cumple si "el resultado de cualquier ejecución es el mismo que si las operaciones (de lectura y escritura) de todos los procesos en el almacén de datos se ejecutaran en algún orden secuencial, y las operaciones de cada procesador individual aparecen en esta secuencia en el orden especificado por su programa". [ 3 ] [ 4 ] Adve y Gharachorloo, 1996 [ 5 ] definen dos requisitos para implementar la consistencia secuencial: orden del programa y atomicidad de escritura.

  • Orden del programa: El orden del programa garantiza que cada proceso emita una solicitud de memoria ordenada según su programa.
  • Atomicidad de escritura: La atomicidad de escritura define que las solicitudes de memoria se atienden en función del orden de una única cola FIFO.

En la consistencia secuencial, no existe la noción de tiempo ni de la operación de escritura más reciente. Algunas operaciones se intercalan y son las mismas para todos los procesos. Un proceso puede ver las operaciones de escritura de todos los demás, pero solo puede ver sus propias operaciones de lectura. Se debe mantener el orden de los programas dentro de cada procesador y el orden secuencial de las operaciones entre procesadores. Para preservar el orden secuencial de ejecución entre procesadores, todas las operaciones deben parecer ejecutarse instantáneamente o de forma atómica con respecto a los demás procesadores.

Estas operaciones solo necesitan "aparentar" completarse, ya que es físicamente imposible enviar información instantáneamente. Por ejemplo, en un sistema que utiliza un único bus compartido globalmente, una vez que se publica información en una línea del bus, se garantiza que todos los procesadores la verán al mismo tiempo. Por lo tanto, al pasar la información a la línea del bus, la ejecución se completa para todos los procesadores y parece haberse ejecutado. Las arquitecturas sin caché o las arquitecturas con caché y redes de interconexión que no son instantáneas pueden contener una ruta lenta entre los procesadores y las memorias. Estas rutas lentas pueden provocar inconsistencias secuenciales, ya que algunas memorias reciben los datos de difusión más rápido que otras.

La consistencia secuencial puede producir resultados no deterministas. Esto se debe a que la secuencia de operaciones secuenciales entre procesadores puede variar durante las distintas ejecuciones del programa. Todas las operaciones de memoria deben realizarse en el orden del programa.

La linealizabilidad [ 6 ] (también conocida como consistencia atómica o memoria atómica) [ 7 ] se define como consistencia secuencial con una restricción de tiempo real, considerando un tiempo de inicio y un tiempo de finalización para cada operación. Una ejecución es linealizable si cada operación se realiza en un orden linealizable, estableciendo un punto entre su tiempo de inicio y su tiempo de finalización, lo que garantiza la consistencia secuencial.

La verificación de la consistencia secuencial mediante verificación de modelos es indecidible en general, incluso para protocolos de coherencia de caché de estado finito . [ 8 ]

Consistencia causal

La consistencia causal [ 4 ] definida por Hutto y Ahamad, 1990, [ 9 ] es un debilitamiento del modelo de consistencia secuencial al categorizar los eventos en aquellos relacionados causalmente y aquellos que no lo están. Define que solo las operaciones de escritura que están relacionadas causalmente deben ser vistas en el mismo orden por todos los procesos. Por ejemplo, si un evento b tiene efecto a partir de un evento anterior a, la consistencia causal garantiza que todos los procesos vean el evento b después del evento a. Tanenbaum et al., 2007 proporcionan una definición más estricta, que un almacén de datos se considera causalmente consistente bajo las siguientes condiciones: [ 4 ]

  • Los procesos que potencialmente guardan una relación causal deben ser vistos por todos en el mismo orden.
  • Las escrituras simultáneas pueden aparecer en un orden diferente en distintas máquinas.

Este modelo flexibiliza la consistencia secuencial en escrituras concurrentes realizadas por un procesador y en escrituras que no están relacionadas causalmente. Dos escrituras pueden estar relacionadas causalmente si una escritura en una variable depende de una escritura previa en cualquier variable, siempre que el procesador que realiza la segunda escritura haya leído la primera. Ambas escrituras podrían haber sido realizadas por el mismo procesador o por procesadores diferentes.

Al igual que en la consistencia secuencial, las lecturas no necesitan reflejar los cambios instantáneamente, pero sí necesitan reflejar todos los cambios en una variable de forma secuencial.

W(x)2 ocurre después de W(x)1 debido a la lectura que P2 realiza a x antes de W(x)2; por lo tanto, este ejemplo es causalmente consistente según la definición de Hutto y Ahamad (aunque no según la de Tanenbaum et al., porque W(x)2 y W(x)3 no se observan en el mismo orden para todos los procesos). Sin embargo, R(x)2 y R(x)3 ocurren en un orden diferente en P3 y P4; por lo tanto, este ejemplo es secuencialmente inconsistente . [ 10 ]

Consistencia del procesador

Para mantener la consistencia de los datos y lograr sistemas de procesamiento escalables donde cada procesador tenga su propia memoria, se derivó el modelo de consistencia del procesador . [ 10 ] Todos los procesadores deben ser consistentes en el orden en que ven las escrituras realizadas por un procesador y en la forma en que ven las escrituras de diferentes procesadores en la misma ubicación (se mantiene la coherencia). Sin embargo, no necesitan ser consistentes cuando las escrituras son realizadas por diferentes procesadores en diferentes ubicaciones.

Cada operación de escritura se puede dividir en varias subescrituras en todas las memorias. Una lectura de una de estas memorias puede ocurrir antes de que se complete la escritura en ella. Por lo tanto, los datos leídos pueden estar desactualizados. De esta manera, un procesador bajo PC puede ejecutar una carga más reciente cuando una escritura más antigua necesita ser bloqueada. El orden de lectura antes de la escritura, lectura después de la lectura y escritura antes de la escritura se mantiene en este modelo.

El modelo de consistencia del procesador [ 11 ] es similar al modelo de consistencia de la PRAM, con una condición más estricta que define que todas las escrituras en la misma ubicación de memoria deben ser vistas en el mismo orden secuencial por todos los demás procesos. La consistencia del procesador es más débil que la consistencia secuencial, pero más fuerte que el modelo de consistencia de la PRAM.

El sistema multiprocesador Stanford DASH implementa una variación de la consistencia del procesador que no se compara (ni más débil ni más fuerte) con las definiciones de Goodman. [ 12 ] Todos los procesadores deben ser consistentes en el orden en que ven las escrituras de un procesador y en la forma en que ven las escrituras de diferentes procesadores en la misma ubicación. Sin embargo, no necesitan ser consistentes cuando las escrituras son de diferentes procesadores en diferentes ubicaciones.

Consistencia de RAM segmentada o consistencia FIFO

La consistencia RAM segmentada (consistencia PRAM) fue presentada por Lipton y Sandberg en 1988 [ 13 ] como uno de los primeros modelos de consistencia descritos. Debido a su definición informal, existen al menos dos implementaciones sutilmente diferentes [ 12 ] , una de Ahamad et al. y otra de Mosberger.

En la consistencia PRAM, todos los procesos ven las operaciones de un único proceso en el mismo orden en que fueron emitidas por dicho proceso, mientras que las operaciones emitidas por diferentes procesos pueden ser vistas en un orden distinto por cada uno de ellos. La consistencia PRAM es menos estricta que la consistencia del procesador. PRAM reduce la necesidad de mantener la coherencia de una ubicación en todos sus procesadores. En este modelo, las lecturas de cualquier variable pueden ejecutarse antes que las escrituras. El orden de lectura antes de la escritura, lectura después de la lectura y escritura antes de la escritura se conserva.

Consistencia de la caché

La consistencia de la caché [ 11 ] [ 14 ] requiere que todas las operaciones de escritura en la misma ubicación de memoria se realicen en un orden secuencial. La consistencia de la caché es más débil que la consistencia del procesador y no se puede comparar con la consistencia de la PRAM.

Consistencia lenta

Memoria lenta

En la consistencia lenta, [ 14 ] si un proceso lee un valor previamente escrito en una ubicación de memoria, no puede leer posteriormente ningún valor anterior de esa ubicación. Las escrituras realizadas por un proceso son inmediatamente visibles para ese proceso. La consistencia lenta es un modelo más débil que la consistencia de PRAM y de caché.

Ejemplo: El diagrama de memoria lenta muestra un ejemplo de consistencia lenta. El primer proceso escribe 1 en la ubicación de memoria X y luego escribe 1 en la ubicación de memoria Y. El segundo proceso lee 1 de Y y luego lee 0 de X, aunque X se escribió antes que Y.

Hutto, Phillip W. y Mustaque Ahamad (1990) [ 9 ] ilustran que, mediante una programación adecuada, la memoria lenta (consistencia) puede ser expresiva y eficiente. Mencionan que la memoria lenta posee dos propiedades valiosas: localidad y soporte para la reducción a partir de la memoria atómica. Proponen dos algoritmos para demostrar la expresividad de la memoria lenta.

Garantías de sesión

Estos cuatro modelos de consistencia fueron propuestos en un artículo de 1994. Se centran en las garantías en la situación en la que solo un único usuario o aplicación realiza modificaciones de datos. [ 15 ]

Consistencia de lectura monótona

Si un proceso lee el valor de un elemento de datos x, cualquier operación de lectura sucesiva sobre x realizada por ese proceso siempre devolverá ese mismo valor o un valor más reciente. [ 4 ]

Consistencia de escritura monótona

Una operación de escritura realizada por un proceso sobre un elemento de datos X se completa antes de cualquier operación de escritura sucesiva sobre X realizada por el mismo proceso. [ 4 ]

Coherencia en la lectura de tus escritos

Un valor escrito por un proceso en un elemento de datos X siempre estará disponible para una operación de lectura sucesiva realizada por el mismo proceso en el elemento de datos X. [ 4 ]

Consistencia de escritura-seguimiento-lectura

Se garantiza que una operación de escritura realizada por un proceso sobre un elemento de datos x, tras una operación de lectura previa sobre x realizada por el mismo proceso, tendrá lugar sobre el mismo valor de x o sobre uno más reciente que el que se leyó. [ 4 ]

Modelos de consistencia de memoria débil

Los siguientes modelos requieren una sincronización específica por parte de los programadores.

orden débil

El ordenamiento débil clasifica las operaciones de memoria en dos categorías: operaciones de datos y operaciones de sincronización . Para garantizar el orden del programa, un programador necesita encontrar al menos una operación de sincronización. Las operaciones de sincronización le indican al procesador que se asegure de haber completado y visto todas las operaciones previas realizadas por todos los procesadores. El orden y la atomicidad del programa se mantienen solo en las operaciones de sincronización y no en todas las lecturas y escrituras. Esto se derivó de la comprensión de que ciertas operaciones de memoria, como las realizadas en una sección crítica , no necesitan ser vistas por todos los procesadores hasta que se hayan completado todas las operaciones en la sección crítica. Se supone que reordenar las operaciones de memoria a las regiones de datos entre las operaciones de sincronización no afecta el resultado del programa. Esto aprovecha el hecho de que los programas escritos para ejecutarse en un sistema multiprocesador contienen la sincronización necesaria para asegurar que no se produzcan condiciones de carrera y que siempre se generen resultados SC. [ 16 ]

En este modelo, la coherencia no se relaja. Una vez que se cumplen estos requisitos, todas las demás operaciones de datos pueden reordenarse. Esto se logra mediante un contador que registra el número de operaciones de datos y, hasta que este contador llegue a cero, no se ejecuta la operación de sincronización. Además, no se ejecutan más operaciones de datos hasta que se hayan completado todas las sincronizaciones anteriores. Las operaciones de memoria entre dos variables de sincronización pueden superponerse y reordenarse sin afectar la corrección del programa. Este modelo garantiza que la atomicidad de escritura se mantenga siempre, por lo que no se requiere ninguna medida de seguridad adicional para el ordenamiento débil.

Para mantener un ordenamiento débil, las operaciones de escritura previas a una operación de sincronización deben ejecutarse globalmente antes de dicha operación. Las operaciones posteriores a una operación de sincronización también deben ejecutarse únicamente después de que esta haya finalizado. Por lo tanto, el acceso a las variables de sincronización es secuencialmente consistente y cualquier lectura o escritura debe realizarse solo después de que las operaciones de sincronización previas hayan finalizado.

El programa depende en gran medida de la sincronización explícita. Para modelos de ordenación débiles, el programador debe usar instrucciones de bloqueo atómico como test-and-set, fetch-and-op, store conditional, load linked o debe etiquetar las variables de sincronización o usar barreras.

Coherencia de lanzamiento

El modelo de consistencia de liberación flexibiliza el modelo de consistencia débil al distinguir la operación de sincronización de entrada de la de salida. Bajo el ordenamiento débil, para que se observe una operación de sincronización, todas las operaciones en todos los procesadores deben ser visibles antes de que se complete la operación y el procesador continúe. Sin embargo, bajo el modelo de consistencia de liberación, durante la entrada a una sección crítica, denominada "adquisición", todas las operaciones con respecto a las variables de memoria local deben completarse. Durante la salida, denominada "liberación", todos los cambios realizados por el procesador local deben propagarse a todos los demás procesadores. La coherencia se mantiene.

La operación de adquisición es una operación de carga/lectura que se realiza para acceder a la sección crítica. La operación de liberación es una operación de almacenamiento/escritura que permite a otros procesadores utilizar las variables compartidas.

Entre las variables de sincronización, se puede mantener la consistencia secuencial o la consistencia del procesador. Con la consistencia secuencial (CS), todas las variables de sincronización en competencia deben procesarse en orden. Sin embargo, con la consistencia del procesador (CP), un par de variables en competencia solo necesitan seguir este orden. Se puede permitir que las adquisiciones más recientes se realicen antes que las liberaciones más antiguas.

RCsc y RCpc

Existen dos tipos de consistencia de lanzamiento: consistencia de lanzamiento con consistencia secuencial (RCsc) y consistencia de lanzamiento con consistencia de procesador (RCpc). Este último tipo indica qué tipo de consistencia se aplica a las operaciones que se describen a continuación como especiales.

Existen operaciones de memoria especiales (a diferencia de las ordinarias), que a su vez se dividen en dos clases: operaciones síncronas (sync ) y no síncronas (nsync) . Estas últimas no se utilizan para la sincronización; las primeras sí, y consisten en operaciones de adquisición y liberación . Una adquisición es, en esencia, una operación de lectura de memoria que se utiliza para obtener acceso a un conjunto determinado de ubicaciones compartidas. Por otro lado, una liberación es una operación de escritura que se realiza para otorgar permiso de acceso a dichas ubicaciones.

Para la consistencia secuencial (RCsc), las restricciones son:

  • adquirir → todo,
  • todos → liberación,
  • especial → especial.

Para la consistencia del procesador (RCpc), el orden de escritura a lectura del programa se relaja, teniendo las siguientes restricciones:

  • adquirir → todo,
  • todos → liberación,
  • especial → especial (excepto cuando a la escritura especial le sigue una lectura especial).

Nota: la notación anterior A → B implica que si la operación A precede a B en el orden del programa, entonces se respeta el orden del programa.

Consistencia de entrada

Esta es una variante del modelo de consistencia de liberación. También requiere el uso de instrucciones de adquisición y liberación para indicar explícitamente la entrada o salida a una sección crítica. Sin embargo, bajo la consistencia de entrada, a cada variable compartida se le asigna una variable de sincronización específica. De esta forma, solo cuando la adquisición se realiza sobre la variable x, todas las operaciones relacionadas con x deben completarse con respecto a ese procesador. Esto permite que se produzcan operaciones concurrentes de diferentes secciones críticas de diferentes variables compartidas. La concurrencia no se observa para operaciones críticas sobre la misma variable compartida. Este modelo de consistencia será útil cuando se puedan procesar diferentes elementos de la matriz al mismo tiempo.

Consistencia local

En la consistencia local, [ 14 ] cada proceso realiza sus propias operaciones en el orden definido por su programa. No existe ninguna restricción sobre el orden en que parecen realizarse las operaciones de escritura de otros procesos. La consistencia local es el modelo de consistencia más débil en sistemas de memoria compartida.

Coherencia general

En general, la consistencia [ 17 ] todas las copias de una ubicación de memoria son eventualmente idénticas después de que se completan las escrituras de todos los procesos.

Consistencia eventual

La consistencia eventual [ 4 ] es un modelo de consistencia débil en un sistema con falta de actualizaciones simultáneas. Define que si ninguna actualización tarda mucho tiempo, todas las réplicas eventualmente se vuelven consistentes.

La mayoría de las bases de datos descentralizadas compartidas tienen un modelo de consistencia eventual, ya sea BASE: básicamente disponible; estado flexible; eventualmente consistente, o una combinación de ACID y BASE, a veces llamada SALT: secuencial; acordada; registrada; resistente a manipulaciones, y también simétrica; sin administración; registrada; y consensual en el tiempo. [ 18 ] [ 19 ] [ 20 ]

Modelos de consistencia de memoria relajados

Algunos modelos de consistencia pueden definirse relajando uno o más requisitos de consistencia secuencial , denominados modelos de consistencia relajada. [ 7 ] Estos modelos no proporcionan consistencia de memoria a nivel de hardware. De hecho, los programadores son responsables de implementar la consistencia de memoria mediante técnicas de sincronización. Los modelos mencionados se clasifican según cuatro criterios y se detallan a continuación.

Existen cuatro comparaciones para definir la consistencia relajada:

Relajación
Una forma de categorizar la consistencia relajada es definir qué requisitos de consistencia secuencial se relajan. Podemos tener modelos menos estrictos relajando los requisitos de orden de programa o atomicidad de escritura definidos por Adve y Gharachorloo, 1996. [ 5 ] El orden de programa garantiza que cada proceso emita una solicitud de memoria ordenada por su programa y la atomicidad de escritura define que las solicitudes de memoria se atienden en función del orden de una única cola FIFO. Al relajar el orden de programa, se puede relajar cualquiera o todos los ordenamientos de pares de operaciones, escritura después de escritura, lectura después de escritura o lectura/escritura después de lectura. En el modelo de atomicidad de escritura relajada, un proceso puede ver sus propias escrituras antes que cualquier otro procesador.
Sincronización frente a no sincronización
Un modelo sincronizado se define dividiendo los accesos a memoria en dos grupos y asignando diferentes restricciones de consistencia a cada uno, considerando que un grupo puede tener un modelo de consistencia débil, mientras que el otro requiere uno más restrictivo. Por el contrario, un modelo no sincronizado asigna el mismo modelo de consistencia a todos los tipos de acceso a memoria.
Problema vs. basado en vistas
[ 14 ] El método Issue proporciona una simulación de consistencia secuencial al definir las restricciones para que los procesos emitan operaciones de memoria. Mientras que el método View describe las restricciones de visibilidad en el orden de los eventos para los procesos.
Fuerza relativa del modelo
Algunos modelos de consistencia son más restrictivos que otros. En otras palabras, los modelos de consistencia estricta imponen más restricciones como requisitos de consistencia. La robustez de un modelo se puede definir mediante el orden del programa o las relajaciones de atomicidad, y también se puede comparar la robustez de los modelos. Algunos modelos están directamente relacionados si aplican las mismas relajaciones o más. Por otro lado, los modelos que relajan diferentes requisitos no están directamente relacionados.

La consistencia secuencial requiere dos elementos: el orden del programa y la atomicidad de la escritura. Al relajar estos requisitos, se pueden obtener diferentes modelos de consistencia relajada. Esto se hace para que, junto con la relajación de las restricciones, aumente el rendimiento, pero el programador es responsable de implementar la consistencia de la memoria mediante técnicas de sincronización y debe tener un buen conocimiento del hardware.

Posibles flexibilizaciones:

  • Escribir para leer el orden del programa
  • Escribir para escribir el orden del programa
  • programas de lectura para leer y lectura para escribir

Escritura relajada para leer

Una estrategia para mejorar el rendimiento a nivel de hardware consiste en flexibilizar el orden de ejecución de una escritura seguida de una lectura, lo que disimula la latencia de las operaciones de escritura. Esta flexibilización permite que las lecturas subsiguientes se ejecuten en un orden menos estricto con respecto a las escrituras previas del procesador. Debido a esta flexibilización, algunos programas, como XXX, podrían no arrojar resultados consistentes. En cambio, se espera que programas como YYY sigan ofreciendo resultados consistentes gracias al cumplimiento de las restricciones de orden de ejecución restantes.

Tres modelos se incluyen en esta categoría. El modelo IBM 370 es el más estricto. Una lectura puede completarse antes que una escritura anterior en una dirección diferente, pero está prohibido devolver el valor de la escritura a menos que todos los procesadores la hayan visto. El modelo de ordenación de almacenamiento total (TSO) de SPARC V8 relaja parcialmente el modelo IBM 370, permitiendo que una lectura devuelva el valor de la escritura de su propio procesador con respecto a otras escrituras en la misma ubicación, es decir, devuelve el valor de su propia escritura antes de que otros la vean. De forma similar al modelo anterior, este no puede devolver el valor de la escritura a menos que todos los procesadores la hayan visto. El modelo de consistencia del procesador (PC) es el más relajado de los tres y relaja ambas restricciones de tal manera que una lectura puede completarse antes que una escritura anterior incluso antes de que sea visible para otros procesadores.

En el Ejemplo A, el resultado solo es posible en IBM 370 porque read(A) no se ejecuta hasta que write(A) se completa en ese procesador. Por otro lado, este resultado es posible en TSO y PC porque permiten leer los indicadores antes de escribirlos en un mismo procesador.

En el ejemplo B, el resultado solo es posible con PC, ya que permite que P2 devuelva el valor de una escritura incluso antes de que sea visible para P3. Esto no será posible en los otros dos modelos.

Para garantizar la coherencia secuencial en los modelos anteriores, se utilizan redes de seguridad o barreras para aplicar manualmente la restricción. El modelo IBM370 tiene algunas instrucciones de serialización especializadas que se colocan manualmente entre las operaciones. Estas instrucciones pueden consistir en instrucciones de memoria o instrucciones que no son de memoria, como bifurcaciones. Por otro lado, los modelos TSO y PC no proporcionan redes de seguridad, pero los programadores aún pueden usar operaciones de lectura-modificación-escritura para que parezca que el orden del programa se mantiene entre una escritura y una lectura posterior. En el caso de TSO, el orden del programa parece mantenerse si la R o la W que ya forma parte de una R-modificación-W se reemplaza por una R-modificación-W, lo que requiere que la W en la R-modificación-W sea una 'ficticia' que devuelva el valor leído. De manera similar para PC, el orden del programa parece mantenerse si la lectura se reemplaza por una escritura o ya forma parte de una R-modificación-W.

Sin embargo, no es posible optimizar el compilador simplemente aplicando esta relajación. Las optimizaciones del compilador requieren la flexibilidad total para reordenar cualquier par de operaciones en el PO, por lo que la capacidad de reordenar una escritura con respecto a una lectura no resulta suficientemente útil en este caso.

Escribir relajado para leer y escribir para escribir

Algunos modelos flexibilizan aún más el orden del programa al relajar incluso las restricciones de orden entre escrituras en diferentes ubicaciones. El modelo de ordenamiento de almacenamiento parcial (PSO) de SPARC V8 es el único ejemplo de este tipo de modelo. La capacidad de segmentar y superponer escrituras en diferentes ubicaciones desde el mismo procesador es la optimización de hardware clave que permite PSO. PSO es similar a TSO en términos de requisitos de atomicidad, ya que permite que un procesador lea el valor de su propia escritura e impide que otros procesadores lean la escritura de otro procesador antes de que esta sea visible para todos los demás. El orden del programa entre dos escrituras se mantiene mediante PSO utilizando una instrucción STBAR explícita. La instrucción STBAR se inserta en un búfer de escritura en implementaciones con búferes de escritura FIFO. Se utiliza un contador para determinar cuándo se han completado todas las escrituras anteriores a la instrucción STBAR, lo que activa una escritura en el sistema de memoria para incrementar el contador. Un acuse de recibo de escritura decrementa el contador, y cuando este llega a 0, significa que todas las escrituras anteriores se han completado.

En los ejemplos A y B, PSO permite ambos resultados no secuencialmente consistentes. La red de seguridad que proporciona PSO es similar a la de TSO: impone un orden de programa desde la escritura hasta la lectura y garantiza la atomicidad de la escritura.

Al igual que en los modelos anteriores, las relajaciones permitidas por PSO no son lo suficientemente flexibles como para ser útiles en la optimización del compilador, que requiere una optimización mucho más flexible.

Programas de lectura relajante y de lectura para escribir: Alpha, RMO y PowerPC

En algunos modelos, todas las operaciones a distintas ubicaciones se flexibilizan. Una lectura o escritura puede reordenarse con respecto a otra lectura o escritura en una ubicación diferente. El ordenamiento débil se clasifica dentro de esta categoría, y dos tipos de modelos de consistencia de lanzamiento (RCsc y RCpc) también se incluyen en ella. Tres arquitecturas comerciales se proponen dentro de esta categoría de flexibilización: Digital Alpha, SPARC V9 con ordenamiento de memoria relajado (RMO) y los modelos IBM PowerPC .

Estas tres arquitecturas comerciales presentan instrucciones de barrera explícitas como medidas de seguridad. El modelo Alpha proporciona dos tipos de instrucciones de barrera: barrera de memoria (MB) y barrera de escritura de memoria (WMB). La operación MB se puede utilizar para mantener el orden del programa de cualquier operación de memoria anterior a la MB con una operación de memoria posterior a la barrera. De manera similar, la WMB mantiene el orden del programa solo entre escrituras. El modelo SPARC V9 RMO proporciona una instrucción MEMBAR que se puede personalizar para ordenar lecturas y escrituras anteriores con respecto a operaciones de lectura y escritura futuras. No es necesario utilizar lectura-modificación-escritura para lograr este orden, ya que la instrucción MEMBAR se puede utilizar para ordenar una escritura con respecto a una lectura posterior. El modelo PowerPC utiliza una única instrucción de barrera llamada instrucción SYNC. Es similar a la instrucción MB, pero con la pequeña excepción de que las lecturas pueden ocurrir fuera del orden del programa incluso si se coloca una instrucción SYNC entre dos lecturas a la misma ubicación. Este modelo también difiere de Alpha y RMO en términos de atomicidad. Permite que una escritura se vea antes de que se complete una lectura. Puede ser necesaria una combinación de operaciones de lectura, modificación y escritura para crear la ilusión de atomicidad en la escritura.

RMO y PowerPC permiten reordenar las lecturas a la misma ubicación. Estos modelos violan el orden secuencial en los ejemplos A y B. Una relajación adicional permitida en estos modelos es que las operaciones de memoria posteriores a una lectura pueden superponerse y reordenarse con respecto a la lectura. Alpha y RMO permiten que una lectura devuelva el valor de una escritura temprana de otro procesador. Desde la perspectiva del programador, estos modelos deben mantener la ilusión de atomicidad de escritura, aunque permitan que el procesador lea su propia escritura de forma anticipada.

Modelos de memoria transaccional

El modelo de memoria transaccional [ 7 ] combina la coherencia de caché y la consistencia de memoria como modelo de comunicación para sistemas de memoria compartida, ya sea por software o hardware. Este modelo proporciona tanto consistencia de memoria como coherencia de caché. Una transacción es una secuencia de operaciones ejecutadas por un proceso que transforma datos de un estado consistente a otro. Una transacción se confirma cuando no hay conflictos o se aborta. En las confirmaciones, todos los cambios son visibles para los demás procesos una vez completada la transacción, mientras que las abortaciones descartan todos los cambios. En comparación con los modelos de consistencia relajada, un modelo transaccional es más fácil de usar y puede ofrecer un rendimiento superior al de un modelo de consistencia secuencial.

Otros modelos de consistencia

Otros modelos de consistencia son los siguientes:

Se han concebido otros modelos de consistencia para expresar restricciones con respecto al orden o la visibilidad de las operaciones, o para abordar supuestos de fallas específicos. [ 24 ]

Consistencia y replicación

Tanenbaum et al., 2007 [ 4 ] define dos razones principales para la replicación: fiabilidad y rendimiento. La fiabilidad se logra en un sistema de archivos replicado mediante el cambio a otra réplica en caso de fallo de la actual. La replicación también protege los datos de la corrupción al proporcionar múltiples copias en diferentes réplicas. Además, mejora el rendimiento al dividir la carga de trabajo. Si bien la replicación puede mejorar el rendimiento y la fiabilidad, puede causar problemas de consistencia entre las múltiples copias de datos. Las múltiples copias son consistentes si una operación de lectura devuelve el mismo valor en todas ellas y una operación de escritura, como una única operación atómica (transacción), actualiza todas las copias antes de que se realice cualquier otra operación. Tanenbaum, Andrew y Maarten Van Steen, 2007 [ 4 ] se refieren a este tipo de consistencia como consistencia estricta , proporcionada por la replicación síncrona. Sin embargo, aplicar sincronizaciones globales para mantener la consistencia de todas las copias es costoso. Una forma de reducir el coste de la sincronización global y mejorar el rendimiento es debilitar las restricciones de consistencia.

Modelos de consistencia centrados en los datos

Tanenbaum et al., 2007 [ 4 ] define el modelo de consistencia como un contrato entre el software (procesos) y la implementación de memoria (almacenamiento de datos). Este modelo garantiza que, si el software sigue ciertas reglas, la memoria funciona correctamente. Dado que, en un sistema sin reloj global, definir la última operación entre escrituras es difícil, se pueden aplicar algunas restricciones a los valores que puede devolver una operación de lectura. El objetivo de los modelos de consistencia centrados en datos es proporcionar una vista consistente de un almacén de datos donde los procesos pueden realizar actualizaciones concurrentes.

Ordenación coherente de las operaciones

Algunos modelos de consistencia, como los secuenciales y los causales, gestionan el orden de las operaciones en datos replicados compartidos para garantizar la consistencia. En estos modelos, todas las réplicas deben acordar un orden global y consistente de las actualizaciones.

Operaciones de agrupación

En la operación de agrupación, los accesos a las variables de sincronización son secuencialmente consistentes. Un proceso puede acceder a una variable de sincronización una vez que se hayan completado todas las escrituras anteriores. En otras palabras, no se permiten accesos a las variables de sincronización hasta que se hayan realizado por completo todas las operaciones sobre dichas variables. [ 4 ]

Modelos de coherencia centrados en el cliente

En los sistemas distribuidos, mantener la consistencia secuencial para controlar las operaciones concurrentes es esencial. En algunos almacenes de datos especiales sin actualizaciones simultáneas, los modelos de consistencia centrados en el cliente pueden manejar las inconsistencias de una manera menos costosa. Los siguientes son algunos modelos de consistencia centrados en el cliente: [ 4 ]

protocolos de consistencia

La implementación de un modelo de consistencia se define mediante un protocolo de consistencia. Tanenbaum et al., 2007 [ 4 ] ilustra algunos protocolos de consistencia para modelos centrados en datos.

Consistencia continua

Consistencia continua introducida por Yu y Vahdat (2000). [ 25 ] En este modelo, la semántica de consistencia de una aplicación se describe mediante el uso de conits en la aplicación. Dado que los requisitos de consistencia pueden diferir según la semántica de la aplicación, Yu y Vahdat (2000) [ 25 ] creen que un modelo de consistencia uniforme predefinido puede no ser un enfoque apropiado. La aplicación debe especificar los requisitos de consistencia que satisfacen la semántica de la aplicación. En este modelo, una aplicación especifica cada requisito de consistencia como un conit (abreviatura de unidades de consistencia). Un conit puede ser una consistencia física o lógica y se utiliza para medir la consistencia. Tanenbaum et al., 2007 [ 4 ] describe la noción de un conit dando un ejemplo.

Existen tres inconsistencias que las aplicaciones pueden tolerar.

Desviación en los valores numéricos
[ 25 ] La desviación numérica delimita la diferencia entre el valor de conit y el valor relativo de la última actualización. Se puede asignar un peso a las escrituras que define su importancia en una aplicación específica. El peso total de las escrituras no vistas para un conit se puede definir como una desviación numérica en una aplicación. Existen dos tipos diferentes de desviación numérica: absoluta y relativa.
Desviación en el orden
[ 25 ] La desviación de orden es la discrepancia entre el orden local de las escrituras en una réplica y su orden relativo en la imagen final eventual.
Variación en la antigüedad entre réplicas
[ 25 ] La desviación de obsolescencia define la validez de la escritura más antigua al limitar la diferencia entre la hora actual y la hora de la escritura más antigua en un conit no visto localmente. Cada servidor tiene una cola local de escrituras inciertas que requiere que se determine y aplique un orden real en un conit. La longitud máxima de la cola de escrituras inciertas es el límite de la desviación de ordenación. Cuando el número de escrituras excede el límite, en lugar de aceptar una nueva escritura enviada, el servidor intentará confirmar las escrituras inciertas comunicándose con otros servidores según el orden en que se deben ejecutar las escrituras.

Si los tres límites de desviación se establecen en cero, el modelo de consistencia continua es la consistencia fuerte.

Protocolos basados ​​en material primario

Protocolo de respaldo principal
Protocolo de copia de seguridad principal (escritura local)

Los protocolos basados ​​en primarios [ 4 ] pueden considerarse una clase de protocolos de consistencia más sencillos de implementar. Por ejemplo, el ordenamiento secuencial es un modelo de consistencia popular cuando se busca un ordenamiento consistente de las operaciones. El ordenamiento secuencial se puede definir como un protocolo basado en primarios. En estos protocolos, existe un primario asociado a cada elemento de datos en un almacén de datos para coordinar las operaciones de escritura sobre dicho elemento.

Protocolos de escritura remota

En el protocolo más sencillo basado en un servidor primario que admite la replicación, también conocido como protocolo primario-secundario, las operaciones de escritura se envían a un único servidor y las operaciones de lectura se pueden realizar localmente.

Ejemplo: Tanenbaum et al., 2007 [ 4 ] proporciona un ejemplo de un protocolo primario-de respaldo. El diagrama del protocolo primario-de respaldo muestra un ejemplo de este protocolo. Cuando un cliente solicita una escritura, la solicitud se reenvía a un servidor primario. El servidor primario envía solicitudes a los respaldos para que realicen la actualización. El servidor recibe entonces la confirmación de actualización de todos los respaldos y envía la confirmación de finalización de las escrituras al cliente. Cualquier cliente puede leer la última actualización disponible localmente. La desventaja de este protocolo es que un cliente que envía la solicitud de actualización podría tener que esperar un tiempo considerable para obtener la confirmación y poder continuar. Este problema se puede resolver realizando las actualizaciones localmente y luego solicitando a otros respaldos que realicen sus actualizaciones. El protocolo primario-de respaldo no bloqueante no garantiza la consistencia de la actualización en todos los servidores de respaldo. Sin embargo, mejora el rendimiento. En el protocolo primario-de respaldo, todos los procesos verán el mismo orden de operaciones de escritura, ya que este protocolo ordena todas las escrituras entrantes en función de un tiempo globalmente único. Los protocolos de bloqueo garantizan que los procesos vean el resultado de la última operación de escritura.
Protocolos de escritura local

En los protocolos de escritura local basados ​​en primarios, [ 4 ] la copia primaria se mueve entre los procesos que desean realizar una actualización. Para actualizar un elemento de datos, un proceso primero lo mueve a su ubicación. Como resultado, en este enfoque, las operaciones de escritura sucesivas se pueden realizar localmente mientras cada proceso puede leer su copia local de los elementos de datos. Después de que el primario termina su actualización, la actualización se reenvía a otras réplicas y todas realizan la actualización localmente. Este enfoque sin bloqueo puede conducir a una mejora. El diagrama del protocolo de escritura local representa el enfoque de escritura local en protocolos basados ​​en primarios. Un proceso solicita una operación de escritura en un elemento de datos x. El servidor actual se considera el nuevo primario para un elemento de datos x. La operación de escritura se realiza y cuando la solicitud termina, el primario envía una solicitud de actualización a otros servidores de respaldo. Cada respaldo envía un acuse de recibo al primario después de terminar la operación de actualización.

Protocolos de escritura replicada

En los protocolos de escritura replicada, [ 4 ] a diferencia del protocolo basado en el primario, todas las actualizaciones se realizan en todas las réplicas.

replicación activa

En la replicación activa, [ 4 ] existe un proceso asociado a cada réplica para realizar la operación de escritura. En otras palabras, las actualizaciones se envían a cada réplica en forma de una operación para su ejecución. Todas las actualizaciones deben realizarse en el mismo orden en todas las réplicas. Como resultado, se requiere un mecanismo de multidifusión totalmente ordenado. Existe un problema de escalabilidad al implementar dicho mecanismo de multidifusión en grandes sistemas distribuidos. Existe otro enfoque en el que cada operación se envía a un coordinador central (secuenciador). El coordinador primero asigna un número de secuencia a cada operación y luego la reenvía a todas las réplicas. El segundo enfoque tampoco puede resolver el problema de escalabilidad.

Protocolos basados ​​en quórum

La votación puede ser otro enfoque en los protocolos de escritura replicada. En este enfoque, un cliente solicita y recibe permiso de múltiples servidores para leer y escribir datos replicados. Por ejemplo, supongamos que en un sistema de archivos distribuido, un archivo se replica en N servidores. Para actualizar un archivo, un cliente debe enviar una solicitud a al menos N/2 + 1 servidores para obtener su aprobación para realizar la actualización. Tras la aprobación, se aplican los cambios al archivo y se le asigna un nuevo número de versión. De manera similar, para leer un archivo replicado, un cliente envía una solicitud a N/2 + 1 servidores para recibir el número de versión correspondiente de dichos servidores. La operación de lectura se completa si todos los números de versión recibidos corresponden a la versión más reciente. [ 4 ]

Protocolos de coherencia de caché

En un sistema de archivos replicado, un protocolo de coherencia de caché [ 4 ] garantiza la consistencia de la caché, que generalmente es controlada por los clientes. En muchos casos, la consistencia de la caché la proporciona el hardware subyacente. Otros enfoques en sistemas distribuidos basados ​​en middleware aplican soluciones de software para garantizar dicha consistencia.

Los modelos de consistencia de caché pueden diferir en sus estrategias de detección de inconsistencias. Existen dos enfoques para detectarlas: soluciones estáticas y dinámicas. En la solución estática, el compilador determina qué variables pueden causar la inconsistencia de caché y, por lo tanto, aplica una instrucción para evitarla. En la solución dinámica, el servidor verifica las inconsistencias en tiempo de ejecución para controlar la consistencia de los datos almacenados en caché que hayan cambiado después de su almacenamiento.

La estrategia de imposición de coherencia es otro protocolo de coherencia de caché. Define cómo proporcionar consistencia en las cachés utilizando las copias ubicadas en el servidor. Una forma de mantener la consistencia de los datos es no almacenar nunca en caché los datos compartidos. Un servidor puede conservar los datos y aplicar algún protocolo de consistencia, como los protocolos basados ​​en el primario, para garantizar la consistencia de los datos compartidos. En esta solución, solo los clientes pueden almacenar en caché los datos privados. En el caso de que se almacenen en caché los datos compartidos, existen dos enfoques para imponer la coherencia de la caché.

En el primer enfoque, cuando se actualiza un dato compartido, el servidor reenvía la invalidación a todas las cachés. En el segundo enfoque, la actualización se propaga. La mayoría de los sistemas de almacenamiento en caché aplican estos dos enfoques o eligen dinámicamente entre ellos.

Véase también

Referencias

  1. Mark D. Hill (agosto de 1998). "Los multiprocesadores deberían admitir modelos simples de consistencia de memoria" . IEEE Computer . 31 (8): 28– 34. Bibcode : 1998Compr..31h..28H . doi : 10.1109/2.707614 .
  2. 1 2 Todd Lipcon (25-10-2014). "Patrones de diseño para bases de datos no relacionales distribuidas" (PDF) . Archivado del original (PDF) el 03-11-2014 . Recuperado el 24-03-2011 . Un modelo de consistencia determina las reglas de visibilidad y el orden aparente de las actualizaciones. Ejemplo: * La fila X se replica en los nodos M y N * El cliente A escribe la fila X en el nodo N * Transcurre un período de tiempo t. * El cliente B lee la fila X del nodo M * ¿Ve el cliente B la escritura del cliente A? La consistencia es un continuo con compensaciones
  3. 1 2 Lamport, Leslie (septiembre de 1979). "Cómo hacer una computadora multiprocesador que ejecute correctamente programas multiproceso". IEEE Transactions on Computers . C-28 (9): 690– 691. Bibcode : 1979ITCmp.100..690L . doi : 10.1109/TC.1979.1675439 . S2CID 5679366 . [Acceso abierto a través del sitio web de Lamport]
  4. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 Tanenbaum, Andrew; Maarten Van Steen (2007). "Sistemas distribuidos". Pearson Prentice Hall .
  5. 1 2 Sarita V. Adve; Kourosh Gharachorloo (diciembre de 1996). "Modelos de consistencia de memoria compartida: un tutorial" (PDF) . IEEE Computer . 29 (12): 66–76 . Bibcode : 1996Compr..29l..66A . CiteSeerX 10.1.1.36.8566 . doi : 10.1109/2.546611 . Archivado del original (PDF) el 7 de septiembre de 2008. Recuperado el 28 de mayo de 2008 . 
  6. Herlihy, Maurice P.; Jeannette M. Wing (julio de 1990)."Linealizabilidad: una condición de corrección para objetos concurrentes". ACM Transactions on Programming Languages ​​and Systems". ACM Transactions on Programming Languages ​​and Systems . 12 (3): 463– 492. CiteSeerX 10.1.1.142.5315 . doi : 10.1145/78969.78972 . S2CID 228785 .  
  7. 1 2 3 Mankin, Jenny (2007), CSG280: Modelos de consistencia de memoria en computación paralela: una revisión de la investigación pasada y presente
  8. Shaz Qadeer (agosto de 2003). "Verificación de la consistencia secuencial en multiprocesadores de memoria compartida mediante verificación de modelos". IEEE Transactions on Parallel and Distributed Systems . 14 (8): 730– 741. arXiv : cs/0108016 . Bibcode : 2003ITPDS..14..730Q . doi : 10.1109/TPDS.2003.1225053 . S2CID 1641693 . 
  9. 1 2 Hutto, Phillip W.; Mustaque Ahamad (1990). "Memoria lenta: Debilitar la consistencia para mejorar la concurrencia en memorias compartidas distribuidas". Actas de la 10.ª Conferencia Internacional sobre Sistemas de Computación Distribuida . IEEE. págs. 302–309 . doi : 10.1109/ICDCS.1990.89297 . ISBN  978-0-8186-2048-5. S2CID 798676 . 
  10. 1 2 "Modelos de consistencia de memoria" (PDF) . Archivado del original (PDF) el 3 de marzo de 2016. Recuperado el 17 de noviembre de 2016 .
  11. 1 2 Goodman, James R (1991). "Consistencia de caché y consistencia secuencial". Grupo de trabajo de la interfaz coherente escalable (SCI) del IEEE .
  12. 1 2 Senftleben, Maximilian (2013). Caracterización operacional de modelos de consistencia de memoria débil (PDF) (tesis de maestría). Universidad de Kaiserslautern.
  13. Lipton, RJ; JS Sandberg. (1988). PRAM: Una memoria compartida escalable (Informe técnico). Universidad de Princeton. CS-TR-180-88.
  14. 1 2 3 4 Steinke, Robert C.; Gary J. Nutt (2004). "Una teoría unificada de la consistencia de la memoria compartida". Journal of the ACM . 51 (5): 800– 849. arXiv : cs/0208027 . doi : 10.1145/1017460.1017464 . S2CID 3206071 . 
  15. Terry, Douglas B.; Demers, Alan J.; Petersen, Karin; Spreitzer, Mike J.; Theimer, Marvin M.; Welch, Brent B. (1 de octubre de 1994). «Garantías de sesión para datos replicados débilmente consistentes» . Actas de la 3.ª Conferencia Internacional sobre Sistemas de Información Paralelos y Distribuidos . IEEE Computer Society Press. págs. 140–150 . doi : 10.1109/PDIS.1994.331722 . ISBN  0-8186-6400-2. S2CID 2807044 . 
  16. "Modelos de consistencia de memoria compartida : un tutorial" (PDF) . Archivado del original (PDF) el 7 de septiembre de 2008. Consultado el 28 de mayo de 2008 . 
  17. Singhal, Mukesh; Niranjan G. Shivaratri (1994). "Conceptos avanzados en sistemas operativos" . McGraw-Hill, Inc.
  18. Collin Cusce. "SALT: Un modelo descriptivo para blockchain" Archivado el 3 de agosto de 2020 en Wayback Machine . 2018.
  19. Stefan Tai, Jacob Eberhardt y Markus Klems. "Ni ÁCIDO, ni BASE, sino SAL: una perspectiva de procesamiento de transacciones en cadenas de bloques" . 2017.
  20. ^ Chao Xie, Chunzhi Su, Manos Kapritsos, Yang Wang, Navid Yaghmazadeh, Lorenzo Alvisi, Príncipe Mahajan. "Sal: combinación de ACID y BASE en una base de datos distribuida" .
  21. Lloyd, Wyatt; Freedman, Michael; Kaminsky, Michael; Andersen, David. "No se conforme con lo eventual: consistencia causal escalable para almacenamiento de área amplia con COPS" (PDF) . Actas del 23.º Simposio ACM sobre Principios de Sistemas Operativos (SOSP'11) .
  22. Almeida, Sergio; Leitão, João; Rodrigues, Luis (2013). "ChainReaction: un almacén de datos causal + consistente basado en replicación en cadena". Actas de la octava conferencia europea ACM sobre sistemas informáticos . págs. 85– 98. doi : 10.1145/2465351.2465361 . ISBN  9781450319942. S2CID 651196 . 
  23. Ganesan, Aishwarya; Alagappan, Ramnatthan; Arpaci-Dusseau, Andrea; Arpaci-Dusseau, Remzi (2020). "Consistencia fuerte y eficiente con durabilidad consciente de la consistencia" (PDF) . 18.ª Conferencia USENIX sobre tecnologías de archivos y almacenamiento (FAST 20) .
  24. Paolo Viotti; Marko Vukolic (2016). "Consistencia en sistemas de almacenamiento distribuido no transaccionales". ACM Computing Surveys . 49 (1): 19:1–19:34. arXiv : 1512.00168 . doi : 10.1145/2926965 . S2CID 118557 . 
  25. 1 2 3 4 5 Yu, Haifeng; Amin Vahdat (2000). "Diseño y evaluación de un modelo de consistencia continua para servicios replicados". Actas de la 4.ª Conferencia sobre Simposio sobre Diseño e Implementación de Sistemas Operativos . 4 : 21.

Lecturas adicionales

  • Paolo Viotti; Marko Vukolic (2016). "Consistencia en sistemas de almacenamiento distribuido no transaccionales". ACM Computing Surveys . 49 (1): 19:1–19:34. arXiv : 1512.00168 . doi : 10.1145/2926965 . S2CID 118557 . 
  • Sezgin, Ali (agosto de 2004). Formalización y verificación de memoria compartida (PDF) (tesis doctoral). Universidad de Utah . Recuperado el 27 de junio de 2024 .(contiene numerosas referencias valiosas)
  • Yelick, Katherine; Bonachea, Dan; Wallace, Charles (2004), Propuesta para un modelo de consistencia de memoria UPC, v1.0 (PDF) , Informe técnico del Laboratorio Nacional Lawrence Berkeley, doi : 10.2172/823757 , OSTI 823757 , LBNL-54983, archivado del original (PDF) el 20 de mayo de 2005. 
  • Mosberger, David (1993). "Modelos de consistencia de memoria" . Operating Systems Review . 27 (1): 18– 26. CiteSeerX 10.1.1.331.2924 . doi : 10.1145/160551.160553 . S2CID 16123648 .  
  • Sarita V. Adve; Kourosh Gharachorloo (diciembre de 1996). "Modelos de consistencia de memoria compartida: un tutorial" (PDF) . IEEE Computer . 29 (12): 66–76 . Bibcode : 1996Compr..29l..66A . CiteSeerX 10.1.1.36.8566 . doi : 10.1109/2.546611 . Archivado del original (PDF) el 7 de septiembre de 2008. Recuperado el 28 de mayo de 2008 . 
  • Steinke, Robert C.; Gary J. Nutt (2004). "Una teoría unificada de la consistencia de la memoria compartida". Journal of the ACM . 51 (5): 800– 849. arXiv : cs.DC/0208027 . doi : 10.1145/1017460.1017464 . S2CID 3206071 . 
  • Terry, Doug. "La consistencia de los datos replicados explicada a través del béisbol". Communications of the ACM 56.12 (2013): 82-89. https://www.microsoft.com/en-us/research/wp-content/uploads/2011/10/ConsistencyAndBaseballReport.pdf
  • Diapositivas del IETF
  • Ordenación de la memoria en microprocesadores modernos, parte I y parte II , por Paul E. McKenney (2005). Linux Journal