|
| |
Funcionamento da Memória Cache
Nos micros atuais a memória cache possui uma importância fundamental, armazenando os
dados mais requisitados pelo processador, e evitando na grande maioria das vezes que
seja necessário buscar ou escrever dados diretamente na lenta memória Ram.
Apesar de todos os processadores apartir do 486 possuírem uma pequena quantidade de
cache incorporado ao próprio núcleo do processador, chamado de cache primário ou L1,
ele é muito pequeno (justamente pelas memórias usadas no cache L1 serem extremamente
caras), e por isso, usamos também uma quantidade um pouco mais generosa de tipos um pouco
mais baratos de memória cache na placa mãe. Este cache é chamado de cache secundário,
ou L2.
O circuitos que controlam o cache primário, são incorporados ao próprio núcleo do
processador, enquanto os circuitos que controlam o funcionamento do cache L2 são
localizados no chipset, que por sua vez fica localizado na placa mãe. Os processadores
Pentium II, Celeron e Xeon são a exceção a esta regra, pois neles o cache L2 e seus
circuitos controladores fazem parte do próprio cartucho do processador.
O cache L1 e o cacha L2 trabalham conjuntamente, formando uma espécie de escada de
três degraus para os dados.
Inicialmente, o programa é carregado na memória Ram. Conforme o processador for
requisitando dados referentes ao programa aberto, estes dados vão sendo armazenados no
cache L2, sendo os dados mais requisitados armazenados no cache L1. No livro Guia de
Hardware Completo, eu uso como exemplo um secretário de uma companhia de seguros: Imagine
que o serviço deste secretário seja atender 10.000 clientes da seguradora que ligam
esporadicamente. Cada cliente possui uma ficha (imaginemos que seja uma companhia pobre
que não tenha dinheiro para comprar computadores, ehehe ;-) sendo que todas as 10.000
fichas estão organizadas num grande arquivo do outro lado da sala. Quando um cliente
liga, o secretário (que tal se o chamássemos de João? ;-) precisa se levantar e
procurar a ficha do cliente no arquivo, antes que possa atende-lo, fazendo com que o
cliente precise esperar um tempo razoável.
Com o passar do tempo, João percebe que dos 10.000 clientes, 50 ligam com mais
freqüência. Como ele não é nada bobo, ele coloca um pequeno fichário sobre a mesa, e
nele guarda as fichas destes 50 clientes que são responsáveis pela maioria dos chamados.
Quando um destes clientes ligar, João poderá localizar sua ficha em muito menos tempo,
já que elas já estarão sobre sua mesa. Enquanto estiver atendendo o cliente, ele
manterá sua ficha à mão, para que possa atender imediatamente a qualquer solicitação.
O grande arquivo ilustra a memória Ram, onde todos os programas abertos
são carregados, o pequeno fichário sobre a mesa ilustra o cache L2, que armazena os
dados usados com mais freqüência pelo processador, enquanto a ficha que é mantida à
mão enquanto o cliente é atendido, ilustra o cache L1, que é brutalmente mais rápido
do que a memória Ram e mesmo do que o cache L2, apesar do seu tamanho reduzido não
permitir a armazenagem de muitos dados, assim como não é possível (pelo menos no
exemplo) manter mais do que uma ficha à mão ao mesmo tempo.
Cache L1 e o Limite de Cacheamento
Na maioria dos processadores atuais, entre eles o Pentium II, o K6 e o 6x86 da Cyrix, o
cache L1 é subdividido em duas sessões, do mesmo tamanho. Num 6x86 MX que possui 64 KB
de cache L1 por exemplo, temos duas sessões de 32 kb cada uma. Um sessão se destina a
armazenar dados usados pelo programa, enquanto a outra se destina a armazenar instruções
Para ilustrar este procedimento, vou escrever um pequeno programa em pseudocódigo, que
escreve os números pares entre 0 e 100:
x: inteiro
Inicio
x=0
enquanto (x<100) faça:
x=x+2
Escreva x
Fim enquanto
Fim
Neste programa, o x é uma variável, que irá armazenar um numero (dados) enquanto a
função "enquanto", é uma instrução. Caso este pequeno programa fosse
compilado usando-se alguma linguagem de programação, e fosse executado, a instrução
"enquanto" seria armazenada em uma sessão do cache L1, enquanto o valor de x,
que representa os dados seria gravada na outra sessão do cache. Em programas maiores vale
o mesmo princípio, apenas em escala maior. Esta divisão do cache L1 aumenta sua
eficiência.
Uma coisa interessante sobre o funcionamento do cache, é que os controladores da
memória Ram e do cache são separados. Alguns chipsets mais antigos, como o i430FX,
o i430VX, e o i430TX possuem um problema quanto ao cacheamento da memória Ram, pois
apesar de possuírem controladores de memória capazes de acessar 128 MB de Ram (no caso
do i430FX e do i430VX) ou 256 MB (no caso do i430TX) possuem controladores de memória
cache capazes de acessar apenas 64 MB de memória. Mesmo usando os 128 ou 256 MB de
memória suportados pelo controlador da memória Ram, apenas os primeiros 64 MB seriam
cacheados. quando o processador precisasse ler ou escrever algum dado em algum endereço
de memória acima de 64 MB, não poderia contar com a ajuda do cache L1, perdendo tempo
devido à baixíssima velocidade das memórias.
Para piorar as coisas, o Windows 95/98, assim como o Dos acessa a memória
apartir do final. Ou seja, primeiro seriam usados todos os endereços que não são
atendidos pelo cache, para apenas depois que todos estivessem ocupados usar os primeiros
64 MB atendidos cacheados. Sem dúvida, neste caso, aumentar a quantidade de memória Ram
acima de 64 MB, iria diminuir o desempenho do micro ao invés de aumenta-lo, a menos é
claro, que você rodasse algum programa pesado o suficiente para ocupar toda a memória
Ram disponível, como algum editor de vídeo, já que mesmo não cacheada, a memória Ram
sempre será infinitamente mais rápida do que memória virtual em disco.
Vale lembrar que este problema só ocorre em chipsets mais antigos. No caso de chipsets
usados em placas mãe Super-7, como o Via Apollo MVP3, o Ali Aladdin V e o SIS 530 a
quantidade de memória Ram suportada é de 128 ou 256 MB, enquanto o controlador de cache
L2 do Pentium II é capaz de cachear até 512 MB de memória Ram.
A algum tempo atrás, discuti durante algum tempo no news de hardware do Uol este
assunto com o Lupini. Pelo bom nível técnico e pelo respeito mútuo demostrado nas
mensagens, resolvi inclui-las neste artigo. Ao longo destas mensagens o funcionamento da
memória cache, e o limite de cacheamento dos chipsets antigos será explicada com
mais detalhes. Espero que tenham paciência para ler tudo ;-)
As mensagens escritas pelo Lupini estão em Azul, enquanto as mensagens
escritas por mim estão em preto.
Mensagem 1
Primeira Mensagem do Lupini:
Atenção Leo, mais uma vez vou repetir. Não interessa a
quantidade de memória existente na máquina. Se o BIOS ler esta memória ela é
cacheável. O que muda é o MODO de escrita/leitura, pois sempre os dados estarão no
cache. Ou voce acredita que "acima" dos limites da TAG RAM a memória fica
sozinha sendo lida pelo processador sem ser escrita no cache?
Minha primeira mensagem em resposta à mensagem anterior do Lupini (como vocês podem
ver caí de para-quedas na conversa, ehehehe ;-)
No caso dos chipsets i430TX, i430VX, i430FX e equivalentes, o problema
não era nem a quantidade de memória Cache nem a quantidade de memória Tag, e sim uma
limitação do próprio chipset. Dentro do chipset os controladores da memória e os
circuitos responsáveis por cachear a memória são independentes. No caso destes chipsets
ultrapassados, o controlador do cache só enxergava 64 MB, enquanto o controlador da
memória suportava um pouco mais de memória, 128 no caso do VX por exemplo. Vc pode
colocar a quantidade de memória Tag ou cache que vc quiser nesses chipsets que o
controlador só vai enxergar 64 MB, não copiando para o cache um único bit das áreas de
memória acima disso.
É a mesma coisa que acontece com o chipset e o processador. Qualquer processador apartir
do 386 suporta o uso de até 4 GB de memória Ram. Por que não posso usar tudo isso de
memória na minha VX então? Por que o chipset só enxerga 128 MB de memória. No caso do
cache é a mesma coisa, apesar do controlador da
memória suportar 128 MB, o controlador de cache só enxerga e cacheia 64, o que você
colocar de memória acima disso não vai ser coberta pelo cache. O modo de escrita/leitura
(write back, write trough, etc.) não tem nada a ver com o espectro cacheável,
simplesmente com a eficiência do cache.
Mensagem 2
Não é isso naum Baga... o que determina essa possibilidade
de cachear toda a memória é o modo de escrita nela. Este assunto já foi mais que
discutido no tempo do "gênio" e eu continuo afirmando que:
Se voce utiliza o modo "escrever atrás/depois" voce
realmente fica limitado à capacidade da TAG. Mas se voce utiliza o modo "escrever
durante o processo" a memória cache fica com a informação de qualquer parte da
memória RAM. O processo desta mecânica é simples: suponha uma TAG que cacheia 64MB, num
computador com 128 MB. Esta TAG foi informada pela BIOS que o modo de escrita é
"write back" / escrever após, e para isso ela utiliza o bit sujo. Muito bem...
a CPU precisa de uma instrução e vai no cache, pega a instrução se lá estiver e usa.
Se não estiver no cache, a CPU vai na RAM e pega; usa e depois escreve no cache, se o
endereço de memória estiver dentro do espectro cacheável, ou seja, dentro dos 64 MB
cacheáveis. Se o endereço de memória estiver fora deste espectro, a instrução é
descartada.
Se voce pegar esta mesma máquina e informar à BIOS que o modo
de escrita é "write throug" ( escrever durante) , a BIOS não mais utilizará o
bit sujo e este bit servirá para armazenar instruções de endereçamento. Muito bem... a
CPU vai ao cache e vê se existe a instrução, se houver ele pega e usa. Se nao houver,
ele busca na RAM, escreve no cache e usa.
Veja que desta forma um ciclo foi atrasado no processamento ( a
escrita durante). e a instrução que está num local de endereçamento acima dos 64 Mb (
limite da TAG em W"B ) fica no cache, escrita e disponível, ou seja: Está cacheada!
.
É simples.... a diferença de modos de escrita é justamente o
que provoca a diminuição de velocidade no processo.
Hehehe eu lembro dessa discussão entre você e o "genio" (que
deus o tenha onde ele estiver ;-)
Mas voltando aos velhos tempos (lembra daquela discussão da formatação física, ehehe
:-), novamente tenho que discordar das suas ideias, veja:
O espectro cacheável é determinado por 2 fatores:
a) a capacidade do chipset e
b)a quantidade de memória Tag.
Assim como a quantidade máxima de memória Ram que poderá ser usada na máquina é
determinada pelo processador e pelo chipset. Usando um Pentium 133 montado sobre uma placa
mãe com chipset i430 VX como exemplo, poderíamos usar até 128 MB de memória Ram nesta
máquina.
-Mas por que se o Pentium suporta 4 gigas de memória?
Apesar do processador suportar essa quantidade enorme de memória, o chipset VX continua
suportando apenas 128 MB, limitando a quantidade de memória que poderá ser usada na
maquina a 128. Note que neste exemplo, pouco importaria se o processador pudesse acessar 8
GB, 16 TB, 4 TB ou 128 MB, pois a quantidade máxima de memória continuaria limitada pelo
chipset a apenas 128 MB.
Voltando ao assunto principal, alterando o modo de escrita, estaríamos diminuindo a
eficiência do cache, mas liberando Tag Ram, o que permitiria aumentar o espectro
cacheável, este foi o seu raciocínio. Porém neste caso os 64 MB não são determinados
pela quantidade de Tag, e sim pela arquitetura do chipset! Pouco importa qual fosse a
quantidade de memória cache que você usasse numa placa mãe com chipset VX, ou o modo de
leitura que você usasse, o espectro cacheável continuaria limitado a 64 MB (desde que vc
usasse a quantidade mínima de Tag claro, caso contrario seria menos), é uma limitação
da arquitetura do chipset e não da Tag Ram, assim como o Pentium acessa no máximo 4 GB
de memória independentemente de qualquer outro fator.
No caso de outros chipsets, como o HX, a arquitetura do chipset permite um espectro
cacheável de mais de 64 MB (512 no HX), neste caso sim, a sua ideia poderia funcionar,
caso a quantidade de memória Tag fosse pequena. Mas repito, no caso do VX a limitação
é da arquitetura do chipset, mesmo que vc usasse 500 terabytes de TAG em modo Write Back
o espectro cacheável continuaria sendo 64 MB, por limitação da arquitetura destes
modelos obsoletos de chipset.
Mensagem 3
Apartir desta mensagem eu passei a responder as mensagens do Lupini trecho-a-trecho, os
trechos das mensagens do Lupini estão em azul.
Well, well, well... A TAG é a controladora dos bancos de
memória cache. Veja que em minha msg anterior eu disse que : SE a BIOS enxerga e
identifica as memórias, elas são cacheáveis
Pô Lupini, vc tá fazendo uma confusão dos diabos, a Tag não controla nada, ele é
simplesmente um espaço que o controlador de memória cache usa para escrever os
endereços a serem cacheados.
Por exemplo, digamos que vc compre uma agenda para guardar telefones, com espaço
suficiente para anotar 10.000 telefones. Ótimo, alguém com muitos contatos talvez
enchesse a agenda em poucos dias, mas digamos que vc tenha apenas 64 telefones para
colocar nessa agenda, que não conheça mais ninguém. A agenda continuaria com espaço
pra mais uma porrada de telefones, mas como vc estaria "limitado" a 64
telefones, este espaço ficaria vago. Note que a agenda não escreve nem controla nada, é
um objeto inanimado, apenas um meio para vc não esquecer os telefones, quem escreve os
telefones é vc.
Similarmente, a memória Tag, como toda memória, serve apenas para que o controlador do
cache (embutido no chipset) anote e não "esqueça" os endereços dos dados
cacheados, mas ele por si só não faz absolutamente nada, simplesmente obedece as ordens
do controlador do cache. Se o controlador for capaz de enxergar apenas 64 megas de
memória então não importa se o Tag é suficiente para 10.000 megas, simplesmente o
espaço ficará vago, assim como no exemplo da agenda não adiantaria comprar uma agenda
maior, já que vc está "limitado" a 64 telefones.
Não a eficiência, mas sim o tempo de execução do processo
da CPU; já que necessitaria de mais um ciclo para depois ir para a CPU.
Acho que vc ainda está fazendo confusão, quer dizer que um cache Write Through é tão
eficiente quanto um cache Write Back, apenas ocupando um pouco mais o processador?
Write Through:
Esse tipo de memória cache funciona apenas no modo de leitura, apenas quando o
processador precisa consultar os dados contidos na RAM. Quando é preciso escrever os
dados, é usado o processo convencional, envolvendo os eventuais estados de espera da RAM
principal. Este é um tipo obsoleto de cache encontrado
apenas em placas mais antigas ou de baixa qualidade.
Write Back:
Usado nas placas de melhor qualidade, este cache funciona tanto no modo de leitura quanto
no modo de escrita. Esta característica é suficiente para melhorar perceptivelmente o
desempenho do sistema. Quando o processador precisa escrever um determinado dado, o sinal
é interceptado pelo chipset, que ao invés de escrever este dado na lenta memória Ram, o
escreve no cache, que é muito mais rápido, perdendo menos tempo com a operação e
ficando livre para a próxima ordem.
Esta é a diferença. Não tem nada a ver com tempo de utilização do processador ou com
o espectro cacheável. Apenas o cache é implementado de maneira diferente
Nananinaná.... o que determina a quantidade de endereços
possíveis de ser cacheados é a arquitetura da TAG. E se a TAG pudesse cachear
"Write Back" até 1 Tb mas o chipset não, ela simplesmente ficaria com
capacidade ociosa.
Idem ao primeiro parágrafo. Apesar da memória Tag determinar *a quantidade máxima de
memória que poderá ser cacheada*, a quantidade que *efetivamente será cacheada* depende
da eficiência do chipset. Se vc só conhece 64 pessoas não adianta comprar uma agenda
para 50.000 telefones...
Só concordo nisso se o chipset tivesse esta limitação, mas
não é caso das VX, cujo chipset foi dimensionado para aceitar até 128 Mb de RAM
usando-se um pente de 512 Kb Pipeline Burst Synchronous cache.
Vc não entendeu Lupini, dentro do chipset, o controlador de cache e o controlador de
acesso à memória são dois circuitos distintos, com funcionamento independente.
Lembre-se que o chipset não é apenas um chip, mas sim um conjunto de vários chips, daí
o nome "chipset". É perfeitamente normal, levando-se em conta o fator
económico, e tbm estratégia de mercado que num chipset se use um controlador de memória
capaz de endereçar 128 MB de memória e um controlador de cache capaz de cachear apenas
64 MB desta memória. Se vc der uma olhada em especificações técnicas de vários
chipsets vai perceber isso.
Mensagem 4
Como última msg neste thread : TAG RAM - é o índice
das informações contidas no cache bank. ( ou chip de memória cache)
A sua definição está correta, eu só gostaria de reforçar que (como expliquei na outra
mensagem) a Tag Ram é apenas uma lista de endereços. Quem irá escrever os endereços
nesta lista é o chipset. A quantidade de Tag Ram determina apenas o máximo de memória
que o chipset (independente de qual fosse) poderia cachear, a quantidade de memória que
será realmente cacheada dependerá porém da capacidade do chipset, como no exemplo da
agenda...
O modo como este índice é utilizado ( nas memórias e
máquinas mais antigas) é determinado pelo SETUP do BIOS.
Sim, geralmente você encontrará no Setup opções referentes à velocidade de operação
do cache, e em maquinas mais antigas, também opções relacionadas ao método de escrita
utilizado. Porém, vc se esqueceu que o que determina a presença destas opções no Setup
são os recursos do chipset, se o chipset só é capaz de usar o método Write Through (um
chipset antigo) então não vai ter opção do Bios que o faca usar o cache como Write
Back...
Não existe tipo de memória "write qualquer coisa "
, mas tão somente o modo como o cache bank será utilizado. Se grava durante ou depois da
utilização pela CPU, da requisição da instrução. O modo Pipeline Burst mais moderno,
utiliza um método aleatório de preenchimento de bits, ( eles mudam de estado
constantemente e se a CPU der sorte aumenta a velocidade em 50%. Afinal só existem dois
estados.
Claro, o cache Pipeline Burst é substancialmente mais rápido do que os caches
assíncronos usados até certo tempo atrás.
Nas máquinas mais novas, ( o que não foi o caso da pergunta
que originou o thread) o método quase sempre é feito por Pipeline Burst sinchronous
"write"
Correto, o uso de caches assíncronos em maquinas modernas causaria uma queda brutal no
desempenho, pois com bus de 66 mhz estes caches funcionariam com temporização 3-2-2-2,
com bus de 100 mhz a temporização seria 4-3-3-3, quase a velocidade de uma memória
Pc-100 comum... :-)
Nas máquinas antigas, voce tem a opção de aumentar o banco
de cache, utilizando para isso uma tabela fornecida pelo fabricante da placa, e em
"todos" estes casos ( excetuando-se quando usado o pente pipeline) voce tinha
que trocar a TAG RAM que é o chip controlador das memórias cache, chip este ( olhem os
proprietários de máquinas mais antigas) menor que os outros e que normalmente fica ao
lado do cache bank.
Isso é obvio Lupini, se vc aumenta a quantidade de cache, claro que você terá que
aumentar também a quantidade de memória Tag, mas eu não entendi o que isso tem a ver
com o que estávamos discutindo...
Abraços.
ps: tenho um monte de sucatas aquí, e faço um monte de
testes com elas, daí minha certeza que o excesso de memória cacheável em modo
"back" torna mais rápido o computador quando em modo " throug ".
Não existe nenhuma explicação para a máquina ficar mais rápida usando cache Through,
mesmo operando com excesso de Ram, já que a única diferença entre estes dois tipos de
modo de leitura é o fato de um cachear apenas as operações de leitura e o outro cachear
tanto as operações de leitura quanto as de escritas. Como o espectro cacheável continua
o mesmo, a única coisa que vc conseguiria mudando o modo de operação do cache seria uma
pequena queda de performance. Faça uns benchmarks nessas maquinas que vc vai ver isso.
Mensagem 5
Esta mensagem foi postada pelo Henrique durante nossa discussão, a seguir está a
minha resposta a ela:
Henrique Branco wrote:
Já que estão falando em cacheamento de RAM, pq nos
processadores Slot One é possível usar até 4Gb de memória? Até mesmo num Celeron, que
nem cache tem...
Em se tratando de Pentium II & Cia o cacheamento da memória é feito pelo controlador
de cache embutido no próprio cartucho do processador, e não pelo chipset. O P-II e o
Celeron A (com cache) são capazes de cachear até 512 MB de. A quantidade máxima
suportada é 4 GB pelo PII e Celeron e 8 GB pelo Xeon Porem, como a quantidade máxima de
memória fica limitada também pelo chipset, temos:
1 GB com o chipset FX (1 GB de memória FPM ou EDO, já que o FX não suporta memórias
Sdram),
512 de Sdram ou 1 GB de EDO com o chipset LX,
512 MB com o EX,
1 GB com o BX,
2 GB com o GX,
e finalmente 8 GB com o i450 NX, lembrando que o i450 NX é um chipset exclusivo para o
Xeon.
Voltando ao assunto principal, so para concluir a minha discussão com o Lupini:
Na verdade quem cacheia a memória não é o processador, e sim o chipset, o processador
apenas diz "deposite na Ram" ou "leia na Ram" o controlador de cache
embutido no chipset (ou no cartucho do processador no caso do Pentium II & Cia) é que
intercepta esses comandos, escrevendo os dados no cache, ou lendo os dados do cache, que
obviamente é mais rápido do que a memória Ram. Claro que o controlador de cache possui
um limite de quanta memória Ram é capaz de enxergar, assim como o próprio processador
é limitado a 4GB de Ram. O quanto de memória que o controlador de cache é capaz de
enxergar é informada nas especificações de cada chipset, sendo que o controlador
embutido no cartucho do P-II cacheia 512 MB. No caso do i430VX por exemplo, o limite do
circuito controlador do cache é de 64 MB, isso significa que ele só enxerga 64 MB de
Ram, isso independente da quantidade de Tag, é uma limitação DELE. Se o processador
pede um dado gravado no 71º megabyte da Ram por exemplo, ele simplesmente vai ignorar a
ordem, pois para ele o 71º megabyte não existe, passando a tarefa para o controlador da
memória, que no caso do i430 VX "enxerga" até 128 MB de Ram, que por sua vez
ira retirar o dados diretamente da lenta Ram. Neste caso o cache será usado apenas quando
for solicitada a leitura/escrita de dados até o 64º megabyte da memória, acima disso
quem vai fazer o trabalho é o próprio controlador de memória, que ira escrever/ler os
dados diretamente na Ram.
Página Principal
© 2000 Bruce Moraes.
|