A Memória Cache
Vamos tentar contar a história da Cache na pessoa de um idoso responsável por um arquivo de uma empresa, já nosso conhecido de anteriores histórias.
De cada vez que alguém precisava de um documento pedia-o ao nosso velho conhecido e ele lá ia corredor após corredor, entrava na sala devida, procurava a estante indicada, verificava qual a prateleira em questão, ia buscar um escadote para aceder à prateleira, procurava a pasta em questão e finalmente tirava dessa pasta o documento solicitado, fotocopiava-o e voltava a guardar o original.
Depois percorria todo o caminho de volta, entregava a fotocópia a quem lha tinha pedido e como já tinha mais pessoas à espera, lá ia ele percorrer de novo caminhos idênticos para satisfazer os pedidos seguintes.
Como o nosso amigo já não era propriamente um jovem, chegava ao fim de cada dia de trabalho extremamente cansado de tanto correr.
Então começou a pensar numa forma de não se cansar tanto. Começou a anotar os locais onde ia buscar os documentos que lhe pediam e verificou que ia várias vezes aos mesmos sítios para ir buscar documentação que se encontrava na proximidade ou até a mesma documentação por várias vezes.
Então, resolveu começar a fazer duas fotocópias em lugar de uma, guardando numa gaveta grande da sua secretária a segunda fotocópia.
Verificou que já se deslocava menos vezes para longe da sua secretária, pois muitas vezes já lá tinha aquilo que lhe iam pedir, limitando-se a fazer uma fotocópia numa fotocopiadora que tinha junto de si.
Também reparou que quanto mais folhas tinha dentro da gaveta, menos eram as vezes que tinha de se deslocar ao arquivo.
Entretanto, porque os documentos na gaveta já eram muitos, arranjou separadores onde colocava as cópias identificadas pelo seu endereço no arquivo, isto é, a sala, a estante, a prateleira e a pasta. Assim, quando lhe pediam qualquer documento verificava o seu endereço e procurava na gaveta pelo separador com o mesmo endereço. Se encontrasse, verificava se o documento em questão lá estava. Se não encontrasse, ia buscar o documento ao arquivo, fazia as tais duas fotocópias e guardava uma, criando o separador para a mesma se ainda não existisse.
De cada vez que o nosso bom amigo não encontrava o documento pedido na gaveta ficava furioso e por isso tentava melhorar a sua atuação para isso acontecer cada vez menos. Verificou que havia sempre uma proximidade das folhas que lhe pediam, isto é, eram habitualmente vizinhas. Então decidiu que, de cada vez que ia ao arquivo buscar uma folha, trazia não só fotocópia dessa como das que lhe estavam à volta e guardava-as na gaveta.
O resultado era positivo, pois cada vez se deslocava menos ao arquivo. Só havia um problema. A gaveta estava completamente cheia. Mas o método estava a resultar. Já lhe doíam menos as pernas e as costas ao fim do dia. Não era altura de parar.
Vai daí, o nosso amigo imaginou uma outra solução. Pediu ajuda a uns colegas, foi buscar uma estante que estava desocupada e colocou-a por detrás da sua secretária. Agora, em lugar de 2 cópias fazia 3 e por cada vez que colocava uma cópia na gaveta colocava outra na estante. Assim, quando era preciso tirar cópias da gaveta podia mantê-las ainda perto de si, guardadas na estante. Só tinha que se levantar da secretária, o que era muito mais simples do que percorrer todo o caminho para o arquivo. Como tinha anotado que os documentos que lhe pediam eram normalmente os mais recentes começou por retirar da gaveta os mais antigos, mantendo no entanto as cópias que estavam na estante. Mas isso revelou-se uma má solução, porque esses mais antigos eram muitas vezes os mais pedidos.
Então começou a marcar nos documentos o número de vezes que eram pedidos, para saber sempre dentro de cada separador qual era o menos pedido, aquele que devia retirar.
Conforme a estante se ia enchendo o nosso deliciado amigo verificava que cada vez ia menos ao arquivo. E gabava-se aos seus amigos da estratégia que tinha inventado que, quando a estante ficou cheia, lhe proporcionava escassas idas ao arquivo durante o dia.
E esta é a história da Cache, contada na pessoa do nosso responsável do arquivo.
A Cache não é mais nem menos do que o espaço onde o nosso responsável do arquivo guardava as suas cópias. A gaveta era a Cache L1 (de nível 1) e a estante a Cache L2 (de nível 2). As pessoas que lhe iam pedir os documentos representam a CPU e o nosso responsável do arquivo é a Interface de Memória ou MMU (Memory Management Unit).
A Memória Cache é portanto mais uma das formas que a nossa imaginação encontrou para estabelecer o melhor compromisso técnico/económico para obter a melhor performance possível por parte da CPU.
Quando dizemos que todos os elementos de trabalho da CPU (instruções do programa em execução e dados de trabalho) têm que estar na memória para a mesma os poder utilizar, confirmamos afirmações já feitas de que a CPU só fala com a memória. Porque a conversa com a memória principal se pode tornar muito lenta, como já pudemos verificar no Capítulo anterior, encontrou-se uma solução alternativa onde, jogando com os princípios de localidade e temporalidade se colocam dados recolhidos em bloco a partir da memória principal, tentando assim reduzir o número de acessos necessários a esta última durante a execução de um programa. E os resultados obtidos já ultrapassam reduções de 95%.
É portanto com a memória cache que a CPU conversa, onde procura as instruções do programa que executa e os dados que necessita para trabalhar e onde escreve os resultados temporários ou definitivos dos programas em execução. Para a CPU só existe Cache, isto é, caches, pois contrariamente ao mais antigo princípio da arquitetura de computadores as caches de dados e instruções são separadas. Mas só na cache mesmo, e na de nível 1. A partir daí voltam ao normal e juntam tudo. Veremos como.
A cache encontra-se no nível hierárquico imediatamente a seguir aos registadores, de que já falámos quando abordámos a CPU. O acesso aos níveis hierárquicos inferiores já não é gerido pela CPU pertencendo à MMU (Memory Management Unit ou Unidade de Gestão de Memória).
As células da memória Cache são estáticas, isto é, não precisam de refrescamento, mantendo os valores armazenados enquanto forem alimentadas. São voláteis portanto, tal como as da memória principal. As células de memória estáticas são conseguidas por circuitos lógicos do tipo Flip Flop, que já vimos atrás. Veremos como, numa cache imaginária que iremos tentar reproduzir.
Porque a CPU se dirige aos endereços da memória principal, que não têm obviamente correspondência na memória cache, os dados ao serem armazenados na cache sê-lo-ão de forma a que possam ser encontrados de forma automática em qualquer procura, sem necessidade de buscas. Para isso são usados diversos tipos de caches que variam entre a de maior performance, com enorme volume de lógica associado, até à de menor performance, já com muito menos lógica associada.
Tentaremos reproduzir em circuitos os vários tipos de cache, em memórias imaginárias que nada têm a ver com a realidade mas que cumprem os objetivos pretendidos.
Por fim iremos analisar a forma de funcionamento de uma cache de um processador de última geração, o Intel core i7, com 4 núcleos, onde a gestão da concorrência é já uma questão de enorme complexidade.
Ver a síntese global deste trabalho
Inserimos de seguida o índice da edição em livro como forma de descrição dos temas abordados neste Capítulo