Camada Zero · 31 · Relógios & Ordenação de Eventos
Você não pode confiar no relógio de parede pra ordenar eventos entre máquinas, porque eles divergem. Relógio lógico resolve isso medindo causalidade em vez de tempo. Adiciona eventos e manda mensagens entre os 3 processos, alterna entre Lamport e Vector, e clica num evento pra ver quem é causa, quem é efeito e quem é concorrente.
A pergunta de fundo: "esse evento aconteceu antes daquele?" Entre máquinas, o relógio físico não responde com confiança. Lamport (1978) trocou tempo por causalidade: um contador que só cresce, que viaja junto com cada mensagem. O vector clock leva isso adiante e consegue dizer quando dois eventos são concorrentes, ou seja, nenhum pôde ter influenciado o outro.
Mecanismo
Detecta concorrência?
Custo/evento
Ordem
Lamport
Não
O(1)
total (arbitrária)
Vector
Sim
O(n)
parcial (causal)
Lamport clock em Go
typeLamportstruct{ t int }
// evento local ou sendfunc (c *Lamport) Tick() int {
c.t++
return c.t
}
// ao receber, msgT veio junto na mensagemfunc (c *Lamport) OnReceive(msgT int) int {
if msgT > c.t {
c.t = msgT
}
c.t++
return c.t
}
Vector clock em Go
typeVClock []int// um contador por nófunc (v VClock) Tick(self int) {
v[self]++
}
func (v VClock) Merge(o VClock, self int) {
for i := range v {
if o[i] > v[i] { v[i] = o[i] }
}
v[self]++
}
🧠 Desafio — Relógios & Eventos
Brinca com o visualizador antes de responder: carrega o exemplo, alterna pra Vector e clica nos eventos pra ver concorrência. As duas últimas são de reflexão: escreve a sua e só então revela o modelo.