Escritos
B. Piropo
Anteriores:
< Trilha Zero >
Volte de onde veio
19/04/1993

< TRILHA ZERO - CACHE AS CACHE CAN >


Sigamos discutindo as características mais importantes dos microprocessadores usados na linha PC. Semana passada abordamos o tamanho dos registros e do campo de memória que ele pode acessar, o barramento de dados e a freqüência de operação. E hoje vamos ver o que são cache interno e coprocessador matemático.

A necessidade do cache interno somente se torna evidente quando nos lembramos que praticamente todas as informações que a CPU necessita para trabalhar, sejam dados, sejam instruções, estão armazenadas na memória. E precisam ser constantemente "lidas", ou seja, transportadas de lá para os registros para serem utilizadas. E é aí que está o problema. Que problema? Fácil: tomemos como exemplo uma CPU que não seja das mais rápidas. Digamos, 25MHz. Em quanto tempo ela executa um ciclo? Ora, basta dividir um segundo por 25 milhões. O resultado é 40 ns (40 nanossegundos, um submúltiplo do segundo que representa um trilionésimo de segundo). Como uma leitura de memória pode ser feita em um único ciclo, teoricamente a cada 40ns poderia ser feito um acesso à memória. Mas acontece que as memórias RAM de nossas máquinas usam os chips do tipo DRAM, ou RAM dinâmica, constituídos de componentes semelhantes a capacitores elementares que precisam ser constantemente recarregados de eletricidade. Esta recarga chama-se "refresh", e gasta um certo tempo. Então, as memórias DRAM necessitam de um intervalo mínimo entre acessos para permitir o refresh. Este intervalo é conhecido por "velocidade" da memória (e é um dado importante quando se vai comprar chips de memória). Os chips DRAM mais rápidos hoje disponíveis são justamente de 40ns. Mas são raros e caros: os mais comuns são de 80ns ou 70ns. Percebeu onde o carro pega? Bote uma CPU de 25MHz para acessar uma memória RAM de 80ns e perceba que a CPU "atropela" a memória: faz um acesso, guarda o dado no registrador e quando, 40ns depois, tenta fazer o seguinte encontra a memória bloqueada pelo refresh. Resultado: no mínimo, dados inconsistentes. No máximo, o sistema "pendura".

A forma clássica de contornar este problema é introduzir os chamados "wait states", ou estados de espera. Que são justamente o que o nome indica: uma ordem para a CPU não fazer nada além de esperar entre dois acessos à memória. No caso acima, um único wait state seria suficiente: a CPU gasta 40ns para um acesso e passa mais um ciclo de 40ns, o wait state, esperando. Pronto: passaram-se os 80ns que a memória exige entre acessos e já pode fazer o seguinte. Mas se a CPU fosse de 33MHz, que executa um ciclo em 30ns, seriam necessários dois wait states.

Evidentemente, gastar uma nota preta com uma CPU rápida para fazê-la passar a maior parte do tempo sem fazer nada não tem graça. A solução é o cache. Que nada mais é que um trecho de memória rapidíssima onde são copiados pedaços inteiros de memória DRAM, mais lenta. A coisa funciona assim: a CPU acessa um dado em uma certa posição de memória. Estatisticamente pode-se demonstrar que há uma elevada probabilidade que o acesso seguinte se dê em uma posição próxima da anterior. Então, enquanto a CPU está processando o dado ou executando a instrução, todo um bloco da lenta memória DRAM, nas proximidades do último acesso, é copiado para a rápida memória cache. Se a posição a ser acessada a seguir estiver no cache, o acesso é feito ali mesmo, sem wait state. Se não, então entra o wait state para acessar a DRAM (para os puristas: esta explicação foi bastante simplificada, mas essencialmente, é isso aí). Pois bem: o cache pode ser externo ou interno. O externo é constituído de chips SRAM, ou memórias estáticas, mais rápidas (e mais caras) porque dispensam o refresh. Estes chips em geral se situam na placa mãe, próximos à CPU. Mas o "quente" mesmo é o interno, que fica dentro da CPU, trabalhando na mesma frequência de operação. Poucas CPUs ostentam um cache. Dentre elas os 486 da Intel, com cache de 8K, os 486 da Cyrix, com 1K de cache e o novo Pentium, com dois caches internos de 8K cada.

Outro penduricalho que pode ser encontrado dentro de algumas CPUs é um coprocessador matemático. Pois os microprocessadores são rapidíssimos para fazer contas, desde que elas envolvam apenas as quatro operações elementares com números inteiros. Passou daí, qualquer raiz quadrada é um sacrifício: são necessárias dezenas de operações elementares combinadas para obter o resultado. Um coprocessador matemático é um microprocessador auxiliar especializado nessas operações matemáticas complexas. Pode ser um chip independente, e nesse caso tem que ser "casado" com a CPU. Por exemplo: o que corresponde ao velho 8088 é o 8087. Já o 80286 usa o coprocessador 80287. Mas a partir do i486, a Intel "embutiu" o coprocessador na própria CPU (o i487, que muita gente pensa que é o coprocessador matemático do i486, na verdade é um 486 completo como veremos mais adiante). Antigamente, quando quase só se usavam telas texto, a presença de um coprocessador somente beneficiava alguns poucos programas que gastavam muitos ciclos da CPU com operações matemáticas complexas, como planilhas ou aplicativos gráficos tipo CAD. Agora, com a crescente popularidade das interfaces gráficas, que exigem cálculos complicados para "desenhar" a saída na tela, a importância de um coprocessador é cada vez maior.

Agora, estamos quase prontos para começar a examinar, uma a uma, todas os microprocessadores para a linha PC. Só falta, antes disso, discutirmos a importância do conjunto de instruções, dos modos de operação e da memória virtual. O que faremos na semana que vem. Até lá.

B. Piropo