Se eu tiver uma CPU com dois núcleos, cada núcleo possui seu próprio cache L1, é possível que Core1 e 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 tanto o Core1 quanto o Core2 tiverem editado seus valores no cache?
Responder1
Se eu tiver uma CPU com dois núcleos, cada núcleo possui seu próprio cache L1, é possível que Core1 e Core2 armazenem em cache a mesma parte da memória ao mesmo tempo?
Sim. O desempenho seria terrível se não fosse esse o caso. Considere dois threads executando o mesmo código. Você deseja esse código em ambos os caches L1.
Se for possível, qual será o valor da memória principal se tanto o Core1 quanto o Core2 editaram seus valores no cache?
O valor antigo estará na memória principal, o que não importa, pois nenhuma CPU irá lê-lo. Antes de ejetar um valor modificado do cache, ele deve ser gravado na memória. Normalmente alguma variante doProtocolo MESIé usado. Na implementação tradicional do MESI, se um valor for modificado em um cache, ele não poderá estar presente em nenhum outro cache no mesmo nível.
Responder2
Sim, isso (ter dois caches armazenando a mesma região de memória) pode acontecer, 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 monitore todos os caches e os atualize de acordo
- cada processador monitora as áreas de memória armazenadas em cache e, quando detecta uma gravação, descarta seu cache (agora inválido).
O problema é chamadocoerência de cache. OArtigo da Wikipédia sobre o tematem uma boa visão geral do problema e possíveis soluções.
Responder3
Para responder à pergunta do seu título, depende de qual é o protocolo de cache. Se for write-back, o cache só será liberado 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 for escrito no nível n, o bloco correspondente no nível (n+1) será atualizado. (É semelhante em conceito a preencher nosso formulário com papel carbono embaixo; tudo o que você escreve em cima é copiado na folha abaixo.) Isso é mais lento porque obviamente envolve mais operações de escrita, mas os valores entre 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.