Memória cache – Parte I – Localidade

28 05 2011

Um dos fatores mais significativos quando pensamos em desempenho de um computador é a velocidade de acesso a uma informação. Isso vai desde a estrutura do hardware, até os algoritmos de busca e estruturas de dados.

Em relação à máquina, as memórias cada vez maiores criaram a necessidade do desenvolvimento de um mecanismo que permitisse ao processador obter os dados necessários para a execução de uma dada instrução de forma mais rápida. Caso contrário, o processamento de um conjunto de operações estaria demasiadamente preso ao tempo necessário para o acesso das informações, ao invés da operação em si.

Uma das opções para dar esta velocidade o uso de tipos de memórias com acesso mais rápido do que a memória principal (conhecida popularmente como RAM) que pudessem guardar as informações utilizadas com maior freqüência durante um período de execução. Entretanto, estas memórias mais rápidas seriam também muito mais caras, e portanto, para se tornarem viáveis deveriam ter um tamanho bem reduzido em relação a memória principal. Esta memória é chamada cache, e já nos acompanham desde 1960, sendo um dos principais componentes de um projeto de hardware de um computador.

Para se ter uma idéia de relação custo benefício da memória cache, podemos citar rapidamente que um gigabyte de memória do tipo SRAM (Static Random Access Memory) usada nas cachês custa de dois mil a cinco mil dólares, enquanto a mesma quantidade de memória DRAM( Dynamic Randomic Access Memory) usada em algumas memórias principais custa entre vinte e setenta e cinco dólares. Por outro lado, o tempo de acesso na memória SRAM é de 0.5 a 2.5 nanosegundos, enquanto na memória DRAM chega a 70 nanosegundos.

A memória cachê foi fundamentada sobre o principio de localidade. Como já dito anteriormente, ela guarda os dados utilizados com maior freqüência pelo processador, observando que um dado utilizado várias vezes tem grande possibilidade de ser usado novamente (localidade temporal) e que as posições contiguas a outra na memória tem uma probabilidade de acesso consecutivo alta (localidade espacial). Assim, quando o processador solicita um dado que não esteja presente nos seus registradores, ou seja, precise ser buscado na memória, ele irá procurar primeiro na cache, onde o dado pode ser acessado mais rapidamente.Se for encontrado(hit), ele executa a operação de leitura/escrita que lhe foi passada, caso contrário, ai sim ele vai em busca da informação na memória principal, gastando um tempo maior para isso. O projeto da cachê é feito de forma que a localidade se torne útil e observável nela, ou melhor dizendo, que a probabilidade de se encontrar o dado na cache seja razoavelmente grande para compensar a busca duplicada caso seja preciso ir a memória principal.

A partir da temporalidade, portanto, têm-se uma segurança que, de acordo com o tamanho da cache e do código em relação a memória principal, a chance de ser necessário o acesso da memória principal ser acessada diminui significativamente, agilizando a execução dos processos no hardware.

Podemos notar a localidade temporal quando executamos um loop, em especial com a variável contadora em um for, e a localidade espacial no caso dos vetores, que guardam informações semelhantes em sequência. Contextualizando em uma situação real, é como se estivéssemos em uma biblioteca com vários livros em nossa mesa(cache) que tratam de assuntos parecidos(localidade espacial) e que são acessados repetidamente (localidade temporal).

Outros pontos considerados no projeto de um cache é o seu tamanho, que impacta diretamente no seu custo, e a política de acesso, atualização e consistência dos dados, tanto na cache quanto na memória principal. Estes pontos serão discutidos nos post seguintes desta série.


Ações

Information

Deixe um comentário