Entendo consistência estrita e seqüencial de forma independente bastante bem.
C estrito basicamente impõe a ordem real na qual as instruções foram executadas no relógio global.
Consistência sequencial basicamente impõe o pedido apenas em um processador.
Estou tendo problemas para montar alguma literatura. http://www.cs.nmsu.edu/~pfeiffer/classes/573/notes/consistency.html descreve a consistência sequencial como permitindo o 'atraso' da memória. Pode levar algum tempo para uma gravação se propagar por todos os processadores. Mas quando isso acontece, atinge todos eles ao mesmo tempo, o que é bom. Portanto, o seguinte é válido em Consistência sequencial
P1: W(x)1
-----------------------
P2: R(x)0 R(x)1
O que me preocupa agora são os seguintes processos, que são algo como o algoritmo de Dekker.
P1: W(x)1 R(y)0
-----------------
P2: W(y)1 R(x)0
Isso NÃO deve ser possível com consistência sequencial ( http://portal.acm.org/citation.cfm?id=1787234.1787255 pág 2). Não há um pedido total que possa dar esse resultado.
Mas faz sentido a ideia de que a consistência seqüencial permite que as gravações se propaguem lentamente e um encadeamento pode não ter idéia do que outros processadores estão fazendo.
O que estou perdendo aqui?
Respostas:
Você não está perdendo nada :)
O algoritmo de Dekker não será sequencialmente consistente no multiprocessador baseado em hierarquia de memória compartilhada, mas é muito possível, pois as atualizações de memória se propagam não acompanhando a atualização da memória local (cache), mas de forma assíncrona por meio de protocolos de coerência de cache como o MESI (modelo de memória mais fraca).
Em um uni-processador no qual o algoritmo de Dekker não é esse o caso, será estritamente consistente.
fonte
Você já tem a resposta correta. A segunda execução não é sequencialmente consistente porque "não existe uma ordem total que possa fornecer esse resultado".
Eu acho que sua confusão vem dessa idéia:
Isto está correto. A propagação pode ser lenta. A consistência sequencial permite que um encadeamento não esteja ciente do que outros processos estão fazendo (para quaisquer programas). No entanto, a consistência sequencial não permite que cada thread não esteja ciente do que outros processos estão fazendo (para alguns programas, incluindo o algoritmo de Dekker).
A frase acima "para alguns programas" vem dessa consideração: mesmo com consistência sequencial, se os threads não usarem memória compartilhada, nenhum thread está ciente do comportamento de outro thread.
fonte
Este documento também pode ajudar na compreensão, pois o título sugere a diferença entre as duas consistências mencionadas. (No entanto, é em grande parte sobre a implementação de objetos compartilhados SeqCon e StrictCon na passagem de mensagens, que é uma maneira de pensar sobre o atraso que você mencionou.)
Para responder sua pergunta específica: A consistência seqüencial exige que todos os eventos ocorram em alguma ordem sequencial e que o que acontece em um processo seja sempre consistente com o tempo.
Então, a razão pela qual
não é possível, é que deve haver alguma sequência global, por exemplo
W1(x,1) R1(y)0 W2(y,1) R2(x)?
. Nesta sequência, a última leitura claramente não pode retornar 0. Essa sequência não precisa ser consistente com o tempo real. É inteiramente possível (consistência sequencial) que em tempo real a sequência de eventos foiW1(x,1) W2(y,1) R1(y)0 R2(x)1
. Essa sequência é ilegal por consistência estrita (como R1 (y) não retornou o valor da gravação anterior).fonte