Entiendo la consistencia estricta y secuencial independientemente bastante bien.
El estricto C básicamente impone el orden real en el que se ejecutaron las instrucciones en el reloj global.
La coherencia secuencial básicamente impone el orden solo en un procesador.
Sin embargo, tengo problemas para reunir algo de literatura. http://www.cs.nmsu.edu/~pfeiffer/classes/573/notes/consistency.html describe la coherencia secuencial que permite el "retraso" de la memoria. Puede tomar tiempo para que una escritura se propague por todos los procesadores. Pero cuando lo hace, los alcanza a todos a la vez, lo cual está bien. Por lo tanto, lo siguiente es válido bajo Consistencia secuencial
P1: W(x)1
-----------------------
P2: R(x)0 R(x)1
Lo que me preocupa ahora son los siguientes procesos, que es algo así como el algoritmo de Dekker.
P1: W(x)1 R(y)0
-----------------
P2: W(y)1 R(x)0
Esto seguramente NO debería ser posible con la coherencia secuencial ( http://portal.acm.org/citation.cfm?id=1787234.1787255 pg 2). No hay un orden total que pueda dar este resultado.
Pero tiene sentido la idea de que la coherencia secuencial permite que las escrituras se propaguen lentamente y un hilo puede no tener idea de lo que otros procesadores están haciendo.
¿Que me estoy perdiendo aqui?
Respuestas:
Tu no te estas perdiendo nada :)
El algoritmo de Dekker no será secuencialmente consistente en el multiprocesador basado en la jerarquía de memoria compartida distribuida, pero es muy posible ya que las actualizaciones de memoria se propagan no al ritmo de la actualización de memoria local (caché) sino de forma asíncrona a través de protocolos de coherencia de caché como MESI (modelo de memoria más débil).
En un procesador uni en el cual el algoritmo de Dekker este no es el caso y será estrictamente consistente.
fuente
Ya tienes la respuesta correcta. La segunda ejecución no es secuencialmente consistente porque "no hay un orden total que pueda dar este resultado".
Supongo que tu confusión proviene de esta idea:
Esto es correcto. La propagación puede ser lenta. La coherencia secuencial permite que un hilo no sea consciente de lo que otros procesos están haciendo (para cualquier programa). Sin embargo, la coherencia secuencial no permite que cada hilo no sea consciente de lo que otros procesos están haciendo (para algunos programas, incluido el algoritmo de Dekker).
La frase anterior "para algunos programas" proviene de esta consideración: incluso con coherencia secuencial, si los hilos no usan memoria compartida, ningún hilo es consciente del comportamiento de otro hilo.
fuente
Este documento también podría ayudar a comprender, ya que su título sugiere la diferencia entre las dos consistencias que menciona. (Sin embargo, se trata en gran parte de la implementación de los objetos compartidos SeqCon y StrictCon en el paso de mensajes, que es una forma de pensar sobre el retraso que mencionó).
Para responder a su pregunta específica: la coherencia secuencial exige que todos los eventos sucedan en un orden secuencial y que lo que sucede en un proceso siempre es coherente con el tiempo.
Entonces la razón por la cual
no es posible, es que tiene que haber alguna secuencia global, por ejemplo
W1(x,1) R1(y)0 W2(y,1) R2(x)?
. En esta secuencia, la última lectura claramente no puede devolver 0. Sin embargo, esta secuencia no tiene que ser consistente con el tiempo real. Es completamente posible (consistencia secuencial) que en tiempo real la secuencia de eventos fueraW1(x,1) W2(y,1) R1(y)0 R2(x)1
. Esta secuencia es ilegal para una consistencia estricta (ya que R1 (y) no devolvió el valor de la escritura anterior).fuente