
Em meu último artigo, pontuei a importância do conhecimento de como o computador lida com as informações e como as traduz para a linguagem binária.
Dito isso, irei nesse artigo, fazer um breve aprofundamento na relevância do cache no desenvolvimento de software e como ele pode afetar de forma positiva ou negativa dependendo do código que você escreve no dia a dia.
Como já abordei anteriormente e reitero novamente: o aumento das camadas de abstração e a automação fornecida por compiladores modernos não eliminam a necessidade de compreender os aspectos complexos do desenvolvimento. Pelo contrário, essa camada técnica permanece crítica, mesmo em linguagens de alto nível.
Não se trata somente de exigir conhecimento avançado em Assembly ou baixíssimo nível (embora isso agregue valor). O ponto centro é que linguagens como C++, Rust, Go e java ainda demandam atenção ativa ao gerenciamento de memória, alocação de recursos e otimizações. Dominar esses mecanismos permite:
- Prevenção vazamentos e gargalos de performance
- Controle preciso sobre o ciclo de vida dos objetos
- Diagnóstico ágil de problemas que abstrações ocultam
Quem desenvolve essa expertise transcende a dependência de frameworks ou ferramentas automatizadas. Torna-se capaz de resolver desafios técnicos profundos, justamente os que impactam escalabilidade, segurança e eficiência.
Arquitetura de Von Neumann
Desde a invenção da arquitetura de computadores criada por John Von Neumann, todos os processadores até hoje possuem a mesma arquitetura criada por ele em 1945. Claramente que a organização de computadores mudou muito do século passado para cá, mas sua arquitetura se manteve a mesma. Afinal, você pode estar se perguntando a diferença entre os dois e é comum as pessoas confundirem os dois às vezes.
Arquitetura se define pelo conceito lógico e estrutural dos componentes de um sistema computacional, ou seja, como os componentes do hardware interagem entre si para executar programas. Já a organização se refere a implementação física e operacional da arquitetura, ou seja, como os componentes físicos do sistema são projetados e conectados para atender às necessidades da arquitetura.
Agora que já entendemos o conceito de arquitetura e organização, precisamos conhecer a estrutura dos componentes que compõe um computador ou aparelho eletrônico que utilizamos em nosso dia a dia.

Começamos pela Memória Principal, que nos computadores atuais, pode ser representada pela RAM (memória volátil) e pelo disco rígido (memória não volátil).
A memória RAM armazena dados temporários de programas e aplicações abertas no computador, mas quando o computador é desligado, os dados dessa memória são perdidos. Já o disco rígido (HD ou SSD por exemplo) armazena os dados de forma permanente, para que a memória RAM possa consultar essas informações ao abrir um software ou realizar uma instrução.
Dispositivos E/S (Entrada e Saída) são estabelecidos como os componentes que movem os dados entre o computador e ambiente externo. Dentre os principais estão:
- Portas USB
- Conectores de Áudio (para fones de ouvido, microfones e auto-falantes)
- Portas Ethernet (para conexões de rede)
- Portas de exibição (HDMI, DisplayPort)
Por fim e não menos importante temos a CPU (Central Processing Unit). Há 5 principais funções que o processador (CPU) é responsável:
- Armazena dados temporários em cache para aumentar o desempenho e eficiência
- Ordena, decodifica e processas as instruções passadas pela UC (irei detalhar mais a frente no artigo) para que mais tarde codifique e envie as informações para a memória e para os componentes E/S.
- Realiza operações aritméticas de ponto fixo e ponto flutuante.
- Gerencia o tráfego de instruções entre os componentes de cada núcleo da CPU para evitar gargalos ou perda de desempenho.
Por dentro da CPU
Existem 2 tipos de processadores, os single core (que possuem somente 1 núcleo) e os multi-core (que possuem 2 ou mais núcleos), porém, irei abordar nesse artigo somente os processadores multi core, levando em consideração que grande parte das CPU’s hoje de praticamente qualquer aparelho eletrônico doméstico possui mais de 2 núcleos de processamento. Lembrando que a variação na construção de um processador varia de acordo com o fabricante, mas as imagens apresentadas te darão uma ideia da estrutura geral dos processadores.

Dentre os principais componentes de uma processados Single-Core, estão:
- Registrador
- UC (Unidade de Controle)
- ALU (Arithmetic and Logic Unit)
- Barramentos de sistema
Registradores são um tipo especial de memória que armazenam temporariamente e transferem os dados de instruções dentro da CPU. Ao contrário, do cache, esse tipo de memória tem uma capacidade de armazenamento um pouco mais limitada, porém, mais rápida que o cache de memória.
UC, também chamado de Unidade de Controle, é responsável por interpretar as instruções armazenadas na memória e enviar sinais de controle necessários para que outros componentes (como a ALU, Memória e Unidades E/S) realizem operações correspondentes.
ALU, que no português significa Unidade Lógica e Aritmética, possui a função que no próprio nome diz, realizar operações matemáticas dentro da CPU, como adição, subtração, multiplicação e divisão. Além de operações aritméticas, a ALU também realiza operações lógicas (AND, OR, NOT, XOR, NOR, NAND) e operações de comparação (“Menor que”, “Maior que”, “Igual a”).
Por último temos os barramentos, que proporcionam a interconexão entre os componentes da CPU.

Já para os processadores Multi-Core, sua arquitetura inclui:
- Caches L3
- 2 ou mais cores (núcleos)
- Outros componentes secundários como ALU, registradores e etc, mas que dependem do tipo de fabricante
Caches L3 são componentes que armazenam dados frequentemente usados entre os núcleos (cores) do processador, aumentando a eficiência do processador. Ele possui esse nome pois há uma hierarquia de caches (L1, L2 e L3) dentro da CPU e a letra “L” representa a palavra “Level”. Essa organização hierárquica existe para facilitar e otimizar o custo de processamento e armazenamento de instruções e dados dentro do processador. Além disso, Caches L3 são mais lentos que Caches L1 e L2 e possuem uma capacidade de armazenamento entre 1MB~8MB.
Core (núcleo) é uma unidade de processamento individual em um chip de processador. Um core individual pode ser equivalente a um processador single core, ou seja, é possível concluir que um processador multi core nada mais é do que vários processadores singles core juntos em um único chip de CPU.
Qual o papel de cada Core?

Dentre os principais componentes que formam cada core inclui:
- FPU (Floating Pointing Unit): Realiza operações de ponto flutuante
- ALU (Arithmetic Logic Unit): Realiza operações aritméticas inteiras e lógicas
- ISU (Instruction Sequence Unit): Determina a sequência das instruções que serão processadas
- IFU (Instruction Fetch Unit): Busca as instruções determinadas pela ISU na memória cache ou, se precisar, na RAM.
- IDU (Instruction Decode Unit): Decodifica as instruções que a IFU colocou nos Buffers.
- RU (Recovery Unit): Mantém uma cópia do estado dos registradores em caso de falha do hardware.
- COP (Dedicated Co-Processor): Responsável pela compressão de dados e funções de criptografia.
- L1 Cache: Cache mais rápido, porém menor em termos de armazenamento (entre 16kb e 128kb) que o L2 Cache. É responsável por armazenar frequentemente usados. Além disso, é o cache considerado prioritário pelos outros componentes em caso de consultas de dados.
- L2 Cache: Cache mais lento, porém maior em termos de armazenamento (entre 128kb e 2mb) que o L1 Cache. Além disso, é considerado um cache secundário que é usado caso L1 não tenha dados suficientes para consulta, aumentando assim, a performance do processador.
Você provavelmente encontrará diferentes organizações na estrutura de uma CPU, pois cada fabricante dispõe de uma estratégia diferente na construção do mesmo e além de chips para computadores domésticos, há também outros tipos de sistema, como os de computação em rede, sistemas embarcados, sistemas de processamento paralelo, sistema de armazenamento de dados e entre outros.
De qualquer forma, a arquitetura de computadores (criada por John Von Neumann em 1945) permanece a mesma, ou seja, possui um design lógico e como os componentes interagem e comunicam entre si desde a metade do século passado.
Buffers, Cache e Ram são a mesma coisa?
Durante esse artigo, mencionei alguns tipos de memória que estão presentes na arquitetura de um computador, incluindo Buffers, Cache e Ram. Afinal, se todos armazenam dados, qual é a diferença e a função de cada um no processamento e armazenamento de dados na CPU?
Buffers estão presentes em diversos componentes dentro de uma placa mãe, incluindo na IFU (Instruction Fetch Unit) mencionada acima. Nesse contexto, buffers lidam com o fluxo de dados e instruções dentro de cada core para evitar gargalos e problemas de desempenho do processador. Para exemplificar melhor, imagine que você está em uma grande cidade com muitas rua e avenidas. Há muitos carros (dados) tentando se mover entre diferentes partes da cidade (componentes do computador).
Agora, imagine que os coordenadores de trânsito estão posicionados entre interseções importantes (esses seriam os buffers). Eles têm a tarefa de controlar o fluxo de carros, garantindo que a circulação seja organizada e eficiente. Sem esses coordenadores, os carros (dados) poderiam se acumular nas ruas, causando congestionamentos, que no caso dos componentes do computador, haveria uma sobrecarga com um fluxo excessivo de dados ao mesmo tempo. Além disso, é importante ressaltar que os dados não ficam armazenados dentro do buffer, e sim mudam frequentemente a cada ciclo (clock) do processador.
Já com relação aos Caches, eles armazenam dados e os mantém por mais ciclos do processador para que os componentes acessem os dados de forma mais eficiente. Dentre os mais usados, está o Cache L1, L2 e L3 como já mencionado anteriormente.
Por fim, memória RAM é responsável por armazenar dados temporários não usados frequentemente pela CPU. Lembrando que memórias RAM são mais lentas que caches e buffers.
Localidade de Cache e seu impacto no desempenho em sistemas Multi-thread
O princípio subjacente à memória cache é a localidade de referência, uma vez que, se os dados forem acessados uma vez, provavelmente serão acessados novamente em um futuro próximo. Ao armazenar esses dados no cache, o sistema reduz significativamente o tempo necessário para acessá-los, resultando em uma melhoria notável no desempenho geral.
Quando a CPU precisa recuperar dados, ela inicialmente verifica a memória cache. Se os dados solicitados estiverem presentes no cache, isso é chamado de “cache hit”. Consequentemente, a CPU pode recuperar rapidamente os dados do cache, ignorando a memória principal mais lenta.
Por outro lado, se os dados necessários não forem encontrados na CPU, isso resulta em uma “perda de cache”. Em tais casos, a CPU deve acessar a memória principal para obter dados.
O processo de tomada de decisão sobre quais dados manter no cache e quais são necessários descartar é definido por uma política de cache. Políticas comuns incluem a de Uso Menos Recente (LRU), que descarta os dados que permaneceram sem uso por mais tempo, e a de Uso Mais Recente (MRU), que prioriza a remoção dos dados acessados mais recentemente.
Maior armazenamento não é equivalente a maior desempenho
Memória Cache desempenha um papel crucial sistemas de computação modernos, fornecendo acesso rápido à dados mais acessados por componentes próximos. Entretanto, ao contrário do que a intuição sugere, aumentar o tamanho do cache não se traduz em melhor performance. A relação entre armazenamento e velocidade de cache envolve compensações complexas entre restrições físicas, padrões de acesso e considerações econômicas.
Atraso na propagação do sinal
Uma das principais limitações físicas de caches maior armazenamento é o aumento que os sinais de transmissão de dados precisam viajar. Conforme o tamanho aumenta, as dimensões físicas do cache de memória expandem de acordo, resultando em caminhos de sinal mais longos. Essa realidade física impacta diretamente a performance pois os sinais elétricos só podem percorrer até uma velocidade limitada.
Limitação na velocidade do Clock
Caches maiores também introduzem desafios de sincronização com a velocidade de clock da CPU. O Cache L1, que é o mais próximo de um núcleo do processador, precisa operar em sincronia com a CPU para fornecer acesso imediato aos dados mais usados. Se o Cache L1 se tornar muito maior em termos de armazenamento, o aumento de latência de acesso forçaria a redução na taxa máxima de clock no processador, comprometendo o desempenho.
Preocupações com o consumo de energia
Caches de maior armazenamento consomem mais energia, que é uma restrição crítica em muitos contextos da computação. Esse maior consumo de energia se torna particularmente problemático em sistemas móveis e embarcados, onde a eficiência energética é uma grande prioridade. As demandas maiores de energia em caches maiores podem levar a um aumento na geração de calor, exigindo soluções de resfriamento mais robustas e aumentando ainda mais o custo de complexidade do sistema. Em muitos casos, o benefício no desempenho de um cache ligeiramente maior não justifica o custo de energia gerado pelo mesmo.
https://medium.com/media/f089705382ad0fae85ea0cbb0400de17/hrefhttps://medium.com/media/dd827a28873318bccb9c931581115132/hrefhttps://medium.com/media/b58780bd8ce2a65ef4f99445b6b59e88/hrefhttps://medium.com/media/af62d5d91f4a99011eee1b6cc574dacd/href