Nem todos sabem, mas os processadores passam por aperfeiçoamentos constantes, tornando-os cada vez mais rápidos e eficientes, porém este aperfeiçoamento não ocorre com a mesma velocidade para a memória RAM, fazendo com que em grande parte das vezes ele, o processador, fique esperando a liberação dos dados por parte da memória RAM para que possa executar as tarefas. Pensando em uma solução para este problema que foi criada a memória cache, que é um tipo ultra-rápido de memória que fica embutida no processador e é utilizada para armazenar os dados que são utilizados com mais freqüência pelo processador, fazendo com que na maioria das vezes ele não tenha que recorrer à memória RAM para obter tais dados.
A cahe é dividida em duas partes, cache primário (L1) e cache secundário (L2).
A L1 fica embutida no processador e é rápida o suficiente para acompanhá-lo em velocidade. Por ser tão veloz, este tipo de memória é muito caro e por isso é utilizado apenas uma pequena quantidade dela. Já a cache L2 é um pouco mais lenta que a L1, mas é utilizada em maior quantidade por ser mais barata. Esta começou a ser utilizada quando a L1 mostrou-se insuficiente, pois funciona como mais uma saída para que a informação requisitada não tenha que ser procurada na memória RAM. A cache L2 é um dos elementos mais importantes para um bom rendimento do processador, mesmo que este tenha um clock baixo. Um grande exemplo disto é o processador Intel Xeon utilizado em servidores, este possui um clock interno de apenas 1.4GHz, mas por outro lado possui 12Mb de cache.
Cache Associativa: Possui um campo válido que diz se o slot está em uso ou não, o número do bloco e o valor, sua ordem de entrada é aleatória. Inicialmente, todas as entradas da cache estão vagas (todos os bits válidos são colocados em zero). O microprograma deverá calcular o número de blocos e então procurá-lo na cache entre as entradas marcadas como válidas. Caso não haja nenhuma, ele busca na memória e traz para a cache. Este tipo é o mais caro, pois necessita de um hardware especial para comparar todas as entradas com o número do bloco dado. No caso de a cache estar cheia e ser preciso trazer mais palavras da memória, uma palavra velha será descartada para dar lugar a nova. Muitas máquinas fazem esta escolha aleatoriamente.
Exemplo de cache associativa:
Cache com Mapeamento Direto: Este tipo de cache foi criado com a intenção de baixar o custo. Esta cache evita a pesquisa, pois coloca cada bloco num slot cujo número pode ser facilmente calculado a partir do número do bloco. Ela possui o campo válido (como na associativa), um campo TAG que contém parte do endereço e serve para dizer qual endereço está atualmente na memória (já que vários endereços são mapeados para o mesmo slot), além do valor. O hardware extrai diretamente do endereço de memória o número do slot e o TAG. O fato de que vários blocos mapeiam o mesmo slot na cache pode causar problemas, pois caso um novo endereço caia em um slot que já está sendo usado, ele sobrepõe o antigo. Se estes dois endereços forem muito utilizados o desempenho da cache será prejudicado.
Exemplo de cache com mapeamento direto:
Cache Associativa por Conjunto: É um híbrido das duas caches anteriores. Foi criado para resolver o problema da cache por mapeamento direto, criando uma cache com múltiplas entradas por slot. Assim como a cache por mapeamento direto possui para cada entrada um campo válido, um TAG e o valor. Se reduzirmos o número de slots para um teremos novamente cache associativa e se reduzirmos o número de entradas para um teremos cache por mapeamento direto.
Exemplo de cache associativa por conjunto:
A cache por mapeamento direto é mais simples e mais barata, além de ter tempo de acesso menor, já a cache associativa tem uma taxa de acerto maior, pois nunca há conflitos.
Existem duas maneiras de manipular a escrita:
Write Trough: a palavra escrita na cache é imediatamente reescrita na memória, garantindo que a entrada na cache será igual a da memória;
Copy Back: não utiliza a memória quando a cachê é alterada. A memória só é atualizada quando uma entrada sai da cache para a entrada de outra, necessitando de um bit para dizer se foi alterada. Ou seja, write trough causa mais tráfego no barramento enquanto copy back pode gravar dados não atualizados (errados) no disco.
Abaixo está uma aula que explica de maneira ilustrativa a memória cache (em inglês):