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 .
Crédito da imagem: Lemsipmatt (Flickr)