Quando o cache da CPU é liberado de volta para a memória principal?

Se você está apenas começando a aprender como funcionam as CPUs de múltiplos núcleos, cache, coerência de cache e memória, pode parecer um pouco confuso no início. Com isso em mente, o post de perguntas e respostas do superusuário de hoje tem respostas para a pergunta de um leitor curioso.

A sessão de perguntas e respostas de hoje chega até nós como cortesia do SuperUser – uma subdivisão do Stack Exchange, um grupo de sites de perguntas e respostas voltado para a comunidade.

A questão

O leitor de superusuário CarmeloS deseja saber quando o cache de uma CPU é liberado de volta para a memória principal:

Se eu tiver uma CPU com dois núcleos e cada núcleo tiver seu próprio cache L1, é possível que o Core1 e o Core2 armazenem em cache a mesma parte da memória ao mesmo tempo? Se for possível, qual será o valor da memória principal se Core1 e Core2 editarem seus valores no cache?

Quando o cache da CPU é liberado de volta para a memória principal?

A resposta

Os contribuidores do SuperUser David Schwartz, sleske e Kimberly W têm a resposta para nós. Primeiro, David Schwartz:

Se eu tiver uma CPU com dois núcleos e cada núcleo tiver seu próprio cache L1, é possível que o Core1 e o Core2 armazenem em cache a mesma parte da memória ao mesmo tempo?

Sim, o desempenho seria terrível se não fosse o caso. Considere dois threads executando o mesmo código. Você quer esse código em ambos os caches L1.

Se for possível, qual será o valor da memória principal se Core1 e Core2 editarem seus valores no cache?

O valor antigo estará na memória principal, o que não importa, pois nenhum dos núcleos o lerá. Antes de ejetar um valor modificado do cache, ele deve ser gravado na memória. Normalmente, alguma variante do protocolo MESI é usada. Na implementação tradicional do MESI, se um valor é modificado em um cache, ele não pode estar presente em nenhum outro cache no mesmo nível.

Seguido pela resposta de sleske:

Sim, ter dois caches em cache na mesma região de memória pode acontecer e na verdade é um problema que ocorre muito na prática. Existem várias soluções, por exemplo:

  • Os dois caches podem se comunicar para garantir que não discordem
  • Você pode ter algum tipo de supervisor que monitora todos os caches e os atualiza de acordo
  • Cada processador monitora as áreas de memória que armazenou em cache e, quando detecta uma gravação, joga fora seu cache (agora inválido)

O problema é chamado de coerência de cache e o artigo da Wikipedia sobre o assunto tem uma boa visão geral do problema e possíveis soluções.

E nossa resposta final de Kimberly W:

Para responder à pergunta no título do seu post, depende de qual é o protocolo de cache. Se for write-back, o cache só será descarregado de volta para a memória principal quando o controlador de cache não tiver escolha a não ser colocar um novo bloco de cache no espaço já ocupado. O bloco que anteriormente ocupava o espaço é removido e seu valor é gravado de volta na memória principal.

O outro protocolo é write-through. Nesse caso, sempre que o bloco de cache é gravado no nível n , o bloco correspondente no nível n + 1 é atualizado. É semelhante em conceito ao preenchimento de um formulário com papel carbono por baixo; tudo o que você escreve no topo é copiado na folha abaixo. Isso é mais lento porque obviamente envolve mais operações de gravação, mas os valores entre os caches são mais consistentes. No esquema de write-back, apenas o cache de nível mais alto teria o valor mais atualizado para um determinado bloco de memória.


Tem algo a acrescentar à explicação? Som desligado nos comentários. Quer ler mais respostas de outros usuários do Stack Exchange com experiência em tecnologia? Confira o tópico de discussão completo aqui .

Recomendado:  Como acessar as opções do desenvolvedor e ativar a depuração USB no Android

Crédito da imagem: Lemsipmatt (Flickr)