Vinícius Vidal
Full-Stack Developer
Básico de Hardware: Memória
A memória é onde o computador guarda seus programas e dados. Sem ela, os processadores não conseguiriam ler nem escrever informações, e os computadores como conhecemos simplesmente não existiriam.
O que são bits
A menor unidade de informação é o bit, que pode assumir dois valores: 0 ou 1.
Você pode imaginar isso como uma luz que pode estar apagada (0) ou acesa (1).
Os computadores usam esse sistema de dois valores porque é mais fácil e seguro para os aparelhos eletrônicos. Se eles precisassem usar muitos valores diferentes, seria mais difícil garantir que tudo funcionasse corretamente, sem erros.
Quando juntamos vários bits, conseguimos representar coisas mais complexas. Por exemplo:
- Com 4 bits, é possível formar 16 combinações diferentes.
- Com 8 bits (chamado de 1 byte), é possível 256 combinações.
Dessa forma, os computadores são capazes de armazenar textos, imagens, músicas e diversas outras informações utilizando apenas combinações de 0s e 1s.
Esse sistema é conhecido como binário, justamente porque utiliza apenas dois valores. Ele constitui a base fundamental de funcionamento de todos os computadores.
Endereço de memória
Memórias são formadas por várias células, que são pequenos espaços capazes de armazenar pedaços de informação. Cada célula possui um identificador número único, chamado de endereço, que permite ao processador localizar e acessar diretamente o conteúdo armazenado nessa posição.
Os endereços de memória são representados por números binários, com uma quantidade fixa de bits. Se um endereço possui n bits, ele pode referenciar até 2^n posições diferentes na memória. Por exemplo, um sistema com endereços de 16 bits consegue acessar até 65.536 células.
O número de bits usado para o endereço é independente da quantidade de bits que cada célula armazena. Assim, uma memória com 2^12 células de 8 bits cada, ou com 64 bits por célula, sempre precisará de 12 bits para o endereçamento. O que muda é a quantidade total de informação que pode ser armazenada, mas não a forma como cada célula é identificada.
A célula é a menor unidade endereçável da memória. No passado, diferentes arquiteturas usaram células com tamanhos variados, de 1 bit até 60 bits. No entanto, hoje existe um padrão: a célula possui 8 bits e é chamada de byte ou octeto.
Os bytes podem ser agrupados em unidades maiores chamadas palavras (words). O tamanho de uma palavra é definido pela arquitetura do processador. Por exemplo, em sistemas de 32 bits, uma palavra corresponde a 4 bytes, enquanto em sistemas de 64 bits, a palavra tem 8 bytes.
A largura da palavra determina a quantidade de dados que o processador é capaz de manipular em uma única operação, influenciando diretamente o tamanho dos registradores, a largura do barramento de dados e o design do conjunto de instruções (Instruction Set Architecture).
Notação hexadecimal para endereços de memória
Embora os endereços de memória sejam representados internamente em formato binário, na prática é comum utilizar a notação hexadecimal para representá-los de forma mais compacta e legível.
Cada dígito hexadecimal representa exatamente 4 bits (um nibble). Por isso, é muito mais fácil ler, escrever e interpretar endereços longos em hexadecimal do que em binário puro.
Por exemplo, um endereço de 16 bits pode ser representado como um número binário de 16 dígitos (bits), o que pode ser complexo de ler, como:
0001 1010 1110 0101
Esse mesmo endereço em hexadecimal fica:
1AE5
Percebe-se que a representação hexadecimal é muito mais curta e clara, facilitando a visualização do endereço.
Além disso, em muitas linguagens de programação e documentação técnica, utiliza-se o prefixo 0x
para indicar que o número está em notação hexadecimal. Por exemplo, o mesmo endereço seria escrito como:
0x1AE5
Esse prefixo não altera o valor, apenas serve para sinalizar que aquele número está representado na base 16, evitando confusões com outras bases numéricas.
Como funciona a notação hexadecimal
A notação hexadecimal é um sistema de numeração de base 16, que utiliza 16 símbolos para representar valores: os dígitos de 0 a 9, seguidos das letras de A a F. Cada símbolo representa um valor numérico entre 0 e 15.
Por exemplo, o dígito A representa o valor decimal 10, B representa 11, e assim por diante até F, que representa 15.
Cada dígito hexadecimal corresponde exatamente a 4 bits no sistema binário, pois 2⁴ = 16. Isso significa que um único dígito hexadecimal pode representar qualquer valor binário de 4 bits.
Dessa forma, a notação hexadecimal é uma forma compacta e direta de representar números binários longos. Por exemplo, o valor binário 1111 1010 pode ser dividido em dois grupos de 4 bits: 1111 e 1010.
Para entender por que 1111 equivale a 15 em decimal, considere as potências de 2 associadas a cada bit (da direita para a esquerda):
- O primeiro bit vale 2⁰ = 1
- O segundo bit vale 2¹ = 2
- O terceiro bit vale 2² = 4
- O quarto bit vale 2³ = 8
Como todos os bits são 1, somamos: 8 + 4 + 2 + 1 = 15.
Agora, para o grupo 1010, a conta é:
- O primeiro bit é 0, então 0 × 1 = 0
- O segundo bit é 1, então 1 × 2 = 2
- O terceiro bit é 0, então 0 × 4 = 0
- O quarto bit é 1, então 1 × 8 = 8
Somando os valores: 8 + 0 + 2 + 0 = 10.
O valor 10 em decimal é representado pela letra A no sistema hexadecimal.
Assim, o número binário 1111 1010 pode ser representado como FA em hexadecimal.
Segue uma imagem contendo alguns valores para demonstração:
Ordem dos Bytes
Quando um dado ocupa mais de um byte na memória, como acontece com números inteiros de 32 ou 64 bits, existe uma questão importante: em qual ordem os bytes devem ser armazenados?
Essa ordem é chamada de byte order ou endianness e define como os bytes são organizados na memória para representar valores multibyte.
Existem duas convenções principais:
-
Big-endian: o byte mais significativo (MSB — Most Significant Byte) é armazenado primeiro, ou seja, no endereço de memória mais baixo.
Exemplo: o número hexadecimal 0x12345678 seria armazenado assim:
12 34 56 78
-
Little-endian: o byte menos significativo (LSB — Least Significant Byte) é armazenado primeiro, ou seja, no endereço de memória mais baixo.
Exemplo: o mesmo número 0x12345678 seria armazenado assim:
78 56 34 12
A escolha entre big-endian e little-endian depende da arquitetura do processador. Por exemplo:
- Processadores x86 (Intel, AMD) usam little-endian.
- Arquiteturas ARM podem operar em big-endian, little-endian ou até mesmo suportar ambos modos.
- Redes de computadores normalmente seguem a convenção big-endian, também chamada de network byte order.
Essa diferença é importante ao interpretar dados armazenados ou transmitidos entre sistemas com arquiteturas diferentes. Se a ordem dos bytes não for considerada, o valor lido pode ser completamente incorreto.
Alinhamento de dados
Alinhamento de dados é a forma como os dados são organizados na memória para que o processador possa acessá-los de forma eficiente.
Os dados devem estar armazenados em endereços múltiplos do seu tamanho. Por exemplo, um dado de 4 bytes (32 bits) deve estar em um endereço múltiplo de 4.
Quando um dado de 4 bytes está armazenado no endereço 0x1000
, isso está alinhado. Se estiver no endereço 0x1003
, está desalinhado.
O processador pode precisar fazer mais operações para acessar dados desalinhados, o que reduz a eficiência.
Para garantir o alinhamento, o compilador pode inserir espaços extras chamados padding entre os dados em estruturas, fazendo com que elas ocupem mais memória do que a soma simples dos campos.
Imagine a seguinte estrutura em C:
struct Example {
char a; // 1 byte
int b; // 4 bytes
};
Sem padding, a
ocupa 1 byte e b
começa no próximo endereço, mas isso poderia ser um endereço desalinhado para int
(que precisa estar em múltiplos de 4).
Então, o compilador insere 3 bytes de padding após a
, para que b
comece em um endereço múltiplo de 4, garantindo alinhamento.
Assim, a estrutura ocupa 8 bytes (1 + 3 padding + 4) ao invés de 5 bytes, para otimizar o acesso pelo processador.
Memória volátil e não volátil
As memórias podem ser classificadas de acordo com sua capacidade de manter ou não os dados armazenados na ausência de energia elétrica.
Memória volátil: perde seu conteúdo quando o computador é desligado. Um exemplo clássico é a RAM (Random Access Memory). Esse tipo de memória é usado para armazenar temporariamente dados e programas enquanto eles estão sendo utilizados, pois oferece alta velocidade de acesso.
Memória não volátil: mantém as informações mesmo sem energia. Exemplos incluem discos rígidos (HDs), SSDs e memórias flash. Essas memórias são utilizadas para armazenar dados de forma permanente ou por longos períodos, como o sistema operacional, documentos e aplicativos.
Cada tipo de memória possui características específicas em termos de velocidade, capacidade e custo, sendo usadas conforme a necessidade do sistema.
Por hoje é isso!
Até a próxima. 👋