# Protocolo MESI

O protocolo MESI (conhecido também como protocolo de Illinois) é um protocolo de coerência de cache e coerência de memória largamente usado, que foi introduzido pela Intel no processador Pentium para "dar suporte a uma escrita de volta na cache mais eficiente, além da escrita-direta, anteriormente usada no processador Intel 486".

## Estados

Cada linha da cache é marcada com um dos quatro estados seguintes (codificados em dois bits adicionais):
* M - linha Modificada: a linha da cache está presente apenas na cache atual, e está suja; ela foi modificada (é diferente da memória principal). A cache é solicitada a escrever os dados de volta na memória principal em algum momento, antes de permitir qualquer outra leitura do estado da memória principal, já não válido.
* E - linha Exclusiva: a linha de cache está presente apenas na cache atual, mas está limpa; ela é igual à da memória principal.
* S - Shared line, linha compartilhada: Indica que esta linha de cache pode ser armazenada em outras caches da máquina.
* I - linha Inválida: indica que esta linha de cache é inválida.

## Operação

Uma cache pode satisfazer uma leitura de qualquer estado, exceto o inválido. Uma linha inválida deve ser buscada (nos estados compartilhada e exclusiva) para satisfazer uma leitura.
Uma escrita só pode ser executada se a linha de cache estiver no estado modificado ou exclusivo. Se ela estiver no estado compartilhado, todas as outras cópias em cache devem ser invalidadas primeiro. Essa invalidação é geralmente feita através de uma operação de transmissão conhecida como Read For Ownership (RFO).
Uma cache pode rejeitar uma linha não-modificada a qualquer momento, modificando-a para o estado inválido. Uma linha modificada deve ser, antes, escrita de volta.
Uma cache que guarda uma linha no estado modificado deve interceptar (intercept) todas as tentativas de leitura (de todas as outras CPUs no sistema) o local correspondente da memória principal e inserir os dados que ela armazena. Isso é geralmente feito forçando a leitura ao back off (por exemplo, para abortar a transmissão entre memória e barramento), escrevendo então os dados na memória principal, e mudando a linha de cache para o estado compartilhado.
Uma cache que tem uma linha no estado compartilhado deve interceptar todas as transmissões inválidas de outras CPU'S, e rejeitar a linha (alterando-a para o estado inválido) correspondente.
Uma cache que tem uma linha no estado exclusivo deve também rejeitar todas as transações de leitura de todas as outras CPUs, e mudar a linha para o estado compartilhado.
Os estados modificado e exclusivo são sempre precisos: por exemplo, eles encontram uma situação de posse da verdadeira linha de cache no sistema. O estado compartilhado pode ser impreciso: se outra CPU rejeitar uma linha compartilhada, e esta CPU se tornar a única proprietária desta linha de cache, a linha não será promovida ao estado exclusivo (porque não é prático, no caso de interceptação de transmissão, transmitir todas as substituições das linhas de cache a todas as CPUs).
Neste sentido, o estado exclusivo é uma otimização oportuna: se a CPU quiser modificar uma linha de cache que está no estado compartilhado, uma transmissão de barramento é necessária para invalidar todas as outras cópias na cache. O estado exclusivo permite modificar uma linha de cache sem nenhuma transmissão por barramento.

### RFO

O RFO - Read For Ownership é uma operação usada nos protocolos de coerência de cache. Ao tentar escrever numa linha de cache que não é exclusiva para tal cache (quando a linha está no estado compartilhado (S) ou inválido (I) do protocolo MESI), a operação faz com que todos os outros processadores definam neles o estado da linha correspondente para inválido.