Diferença entre consistência estrita e consistência sequencial


8

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?


Eu acho que você está confundindo consistência seqüencial e causal. SC é uma condição mais forte do que seu fraseado intuitivo ... se estou entendendo corretamente. Sua segunda execução é CC (e PRAM C), mas não SC.
— Aaron Sterling

Sim, talvez. Minha pergunta é especificamente por que a segunda execução NÃO é sequencialmente consistente? Se o primeiro for, qual é o raciocínio especial que torna a execução 2 inconsistente?
— jetru

Obrigado por todas as respostas. Eu também li sobre consistência causal e entendi que o que eu estava pensando era exatamente isso.
— jetru

Respostas:


8

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.


Portanto, considerando a propagação de atualizações de memória, estou relaxando o modelo de memória, portanto, no meu modelo de memória imaginado, a execução 2 é possível. Em um armazenamento de memória adequadamente sequencialmente consistente, as gravações se propagam instantaneamente. Isto está certo?
— jetru

1
Sim. Se todo processo observar apenas sua memória local, é possível executar 2. Em uma consistência adequadamente seqüencial, as gravações não precisam se propagar instantaneamente, mas quando outro local se refere ou atualiza para o local gravado, o que normalmente ocorre.
— Sai Venkat

4

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:

a idéia de que a consistência sequencial permite que as gravações se propaguem lentamente e um encadeamento pode não ter idéia do que outros processadores estão fazendo.

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.


3

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

P1:  W1(x,1)  R2(y)0
-------------------
P2:  W2(y,1)  R2(x)0

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 foi W1(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).


Desculpe pelo comentário tardio, mas será possível que W1 (x, 1) W2 (y, 1) R1 (y) 1 R2 (x) 1 também ocorra em um ambiente sequencialmente consistente? Se a ordem de execução está planejada para acontecer nessa ordem antes que aconteça a tempo?
— William

A execução W1 (x, 1) W2 (y, 1) R1 (y) 1 R2 (x) 1 é sequencialmente consistente, até estritamente consistente, se não me engano (já estou um pouco cansado hoje).
— Martin B.

Quanto ao que você quer dizer exatamente com "ordem de execução está planejada para acontecer", não sei se entendi.
— Martin B.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.