25/08/2025
A memória do computador é organizada de forma hierárquica. No nível mais perto do processador estão os registradores. Em seguida, vem um ou mais níveis de cache, indicados por L1, L2, e assim por diante. Após, vem a memória principal, que normalmente é de acesso aleatório e dinâmico (RAM). Esses níveis de memória são considerados internos ao computador. Existem também níveis hierárquicos de memória externa, com o próximo nível sendo um ou mais discos rígidos fixos (HD ou SSD), e por último as mídias removíveis (CD, Pen-drive, etc).
À medida que descemos na hierarquia de memória, o custo por bit diminui, o que permite uma maior capacidade de armazenamento. Em contrapartida, o tempo de acesso também aumenta conforme avançamos na hierarquia. Em um mundo ideal, apenas memórias mais rápidas são utilizadas, mas por conta do alto custo, as hierarquias existem para baratear o projeto. O desafio então se torna organizar os dados e os programas na memória de modo que os blocos de memória acessados com mais frequência estejam nas memórias mais rápidas possíveis.
Em geral, existe uma maior probabilidade que a maioria dos acessos futuros à memória principal, feitos pelo processador, sejam para blocos de memória acessados recentemente. Assim, a cache mantém automaticamente uma cópia de alguns dos blocos de memória usados recentemente. Se o cache for projetado corretamente, na maior parte do tempo o processador solicitará palavras da memória que já estão no cache.
A seguir estão as principais características dos sistemas de memória:
Como citado anteriormente, empregar uma hierarquia de memória pode ajudar a equilibrar o custo monetário de um projeto computacional.
Uma hierarquia comum é composta por:
Enquanto se desce na hierarquia, ocorre normalmente o seguinte:
O uso da memória cache visa encontrar um meio-termo, obtendo velocidades mais próximas das memórias mais rápidas e, ao mesmo tempo, disponibilizar uma capacidade ao preço de memórias mais baratas.
O cache contém uma cópia de partes da memória principal. Quando o processador tenta ler uma palavra da memória, primeiro verifica-se se a palavra já está no cache. Se estiver, ela já é entregue ao processador. Se não, um bloco da memória principal, consistindo em um número fixo de palavras, é lido para o cache e depois a palavra é fornecida ao processador. Quando um bloco de dados é levado para o cache por conta de uma única referência de memória, é provável haver referências futuras a esse mesmo local ou a outras palavras no mesmo bloco, e isto se chama fenômeno de localidade de referência.
%%{init: {'theme':'forest'}}%% flowchart LR CPU[CPU] <-- Transferência\nde palavra\n<em>(rápida)</em> --> MC[Memória cache] MC <-- Transferência\n de bloco\n<em>(lenta)</em> --> MP[Memória principal]
Uma vez que o cache estiver cheio e um novo bloco precisar ser trazido, um dos blocos existentes precisa ser substituído. Existem vários algoritmos de substituição na literatura, e os quatro mais comuns são:
Quando um bloco estiver para ser substituído do cache, existem dois casos a se considerar: se o bloco não tiver sido alterado, ele pode ser substituído sem problemas. Se pelo menos uma operação de escrita tiver sido realizada em uma palavra desse bloco no cache, é necessário atualizar a memória principal com o novo valor. Existem diversas políticas de escrita na RAM para essas alterações, sendo os principais: