Escritos
B. Piropo
Anteriores:
< Trilha Zero >
Volte de onde veio
16/12/1996

< Memórias XVII: >
< Mais Dois Tipos de Cache >


Antigamente, nos tempos do bom e velho DOS, usava-se um programa de cada vez. Depois as coisas mudaram. Com o OS/2 e os diversos sabores de Windows, pôs-se a multitarefa a nosso serviço. Hoje, carrega-se um monte de programas ao mesmo tempo e passa-se de um para outro com um simples toque nas teclas de atalho. Sem falar na transferência de dados via clipboard, DDE e OLE.

Mas o que tem isto a ver com o cache? Ora, muita coisa. Basta lembrar-se que o cache "direct mapped" subdivide a memória em blocos do tamanho de seu data store, que aos poucos vai enchendo de cópias dos últimos dados acessados. Como, enquanto se roda um programa, acessam-se endereços de memória RAM muito próximos, a tendência é que depois de algum tempo o cache seja um espelho dos trechos de memória onde estão as instruções o os dados daquele programa, provavelmente situados no mesmo bloco de memória. Daí para a frente, praticamente todos os acessos se farão no rápido cache, não mais na lenta memória RAM. Um tipo de cache que funciona maravilhosamente bem em um sistema operacional monotarefa como o DOS, que roda um programa de cada vez.

Mas quando se usa um sistema operacional multitarefa e se salta de um programa para outro, somente acessam-se endereços de memória RAM próximos uns dos outros enquanto se está em um mesmo programa. Quando se muda para outro, passa-se para um trecho de memória que pode estar situado a megabytes de distância do primeiro. Resultado: logo após o salto, é um cache miss atrás do outro - com o conseqüente retardo nos acessos. Mas como as novas linhas acessadas vão sendo copiadas no data store do cache, logo ele vai se enchendo de cópias de dados e instruções do novo programa e passam a ocorrer novos cache hits que aceleram o desempenho. Até que se troque novamente de programa e ocorra um novo festival de cache misses. Que acontecerá mesmo quando se retorna a um programa usado há pouco, pois seus dados que estavam no cache foram substituidos pelos do outro programa.

Para entender a forma pela qual se resolveu o problema é preciso entender antes como o cache direct mapped realmente funciona, ou seja, porque ele subdivide a memória em trechos do mesmo tamanho do data store. O que fica evidente quando se pensa na forma pela qual o controlador de cache verifica se a linha a ser acessada está ou não no cache: consultando o tag store e verificando se na posição correspondente à linha a ser acessada está armazenado o número do bloco da memória RAM onde a linha reside. E este é o segredo: o tag store não armazena o endereço inteiro, mas apenas o número do bloco, um número pequeno, em geral da ordem de algumas dezenas. O que traz vantagens no custo (armazenando números menores, o tag store pode ser de menor capacidade) e desempenho (números menores são comparados mais rápidamente).

Para permitir que dados situados nas mesmas posições relativas de diferentes blocos de memória RAM sejam armazenados no cache, o tag store precisa guardar o endereço completo do primeiro dos 16 bytes que compõem a linha, e não mais apenas o número do bloco. Caches que funcionam assim chamam-se "full associative", já que há uma associação plena entre o endereço da base da linha na memória RAM e no cache. É claro que isto exige um tag store de maior capacidade (portanto mais caro), já que terá que armazenar todo o endereço. Mas o maior inconveniente não é o preço, mas a queda do desempenho: o acesso a um cache full associative é mais lento, já que para verificar se há ou não uma cópia do dado no data store é preciso comparar endereços completos, e não mais apenas os índices dos blocos. Mas para quem usa um sistema operacional multitarefa, ainda assim o cache full associative é vantajoso.

Os caches modernos conseguiram aperfeiçoar ainda mais a coisa usando um misto de cache direct mapped e full associative, um expediente inteligente no qual o data store é subdividido em trechos, cada trecho se comportando como um cache direct mapped. Este tipo de cache chama-se "set associative" e junta as vantagens dos dois sistemas. O tipo mais comum é aquele que divide o data store em quatro trechos iguais (four-way set associative) e trata cada um deles como um cache direct mapped. O set associative é o cache de melhor desempenho, mas infelizmente é o mais caro.

PS: O primeiro dispositivo programável foi o bicentenário tear de Jacquard. Que originou uma infinidade de caixas de música, ou "autômatos musicais". Se você quiser conhecer estes tataravôs de seu computador, passe no segundo piso do Shopping da Gávea para visitar a coleção de caixinhas de música de Ernesto Leibovich, onde irá encontrar verdadeiras maravilhas do engenho e arte humanos.

 

B. Piropo