Capítulo 4 –
Hierarquia de memória:
Localidade e Desempenho
De todas peças que existem em um computador, nenhuma delas
consegue satisfazer a demanda computacional pela pauta
“memória”. Nenhuma peça consegue ser criada pela humanidade a
ponto de satisfazer a demanda computacional pelo acesso aos
diversos tipos de memórias.
Existem diversos tipos de memórias e uma hierarquia bem grande
delas.
Princípios da localidade
O Princípio da Localidade ajuda a entender como os programas acessam a memória. Ele
se baseia na observação de que programas tendem a acessar as mesmas áreas de
memória repetidamente por curtos períodos (localidade temporal) ou a acessar áreas
próximas umas das outras (localidade espacial).
Ele se divide em dois tipos principais: localidade temporal e localidade espacial.
1. Localidade Temporal
Localidade temporal significa que se você acessa algo na memória agora, há uma boa
chance de que você vai acessar a mesma coisa novamente em breve.
Localidade Temporal de Instruções: Refere-se ao fato de que, uma vez
que uma instrução é executada, há uma alta probabilidade de que a mesma
instrução seja executada novamente em um futuro próximo.
Localidade Temporal de Dados: Refere-se ao fato de que, uma vez que
um dado é acessado, há uma alta probabilidade de que o mesmo dado seja
acessado novamente em um futuro próximo.
2. Localidade Espacial
A localidade espacial se refere à tendência de um programa acessar dados ou instruções
que estão fisicamente próximos uns dos outros na memória.
Localidade Espacial de Instruções: Refere-se ao fato de que, uma vez que uma
instrução é executada, há uma alta probabilidade de que as instruções próximas na
memória também sejam executadas em breve.
Localidade Espacial de Dados: Refere-se ao fato de que, uma vez que um dado é
acessado, há uma alta probabilidade de que os dados próximos na memória também sejam
acessados em breve.
Instrução Estática .VS. Instrução Dinâmica
Instrução Estática: Refere-se a uma instrução no código fonte do programa.
Cada linha de código que o programador escreve representa uma instrução
estática. A contagem de instruções estáticas pode ser usada para medir o
tamanho do programa.
Instrução Dinâmica: Refere-se à execução de uma instrução em tempo de
execução. Cada vez que uma instrução estática é executada, ela conta como uma
instrução dinâmica. Portanto, se um programa contém um loop que executa 100
vezes, e há 10 instruções dentro do loop, haverá 10 instruções estáticas e 1.000
instruções dinâmicas.
Resumo
Pense no Princípio da Localidade como duas regras de ouro para programas de
computador:
1. Localidade Temporal: Se você usou algo recentemente, você
provavelmente usará de novo logo.
2. Localidade Espacial: Se você usou algo, você provavelmente usará
algo perto dele logo.
E lembre-se das instruções estáticas e dinâmicas assim:
Instrução Estática: É o que você escreveu no seu código.
Instrução Dinâmica: É quantas vezes o computador realmente
executa o que você escreveu.
Características dos sitemas de memória
Podemos começar a classificar as memórias em internas e externas.
Localização
Memórias Internas
1. Registradores da CPU
2. Caches dentro do chio
3. Caches fora do chip
4. Memória RAM (Random Access Memory)
5. Memória ROM (Read-Only Memory)
6. Memória Flash Interna
Memórias Externas
1. Disco Rígido (HDD)
2. Unidade de Estado Sólido (SSD)
3. Armazenamento em Nuvem (Cloud Storage)
4. Etc
Capacidade
A capacidade de memória de um computador é a quantidade total de dados que ele
pode armazenar. Essa capacidade pode ser expressa em termos de número de
palavras ou número de bytes.
Unidade de Transferência
A unidade de transferência refere-se à quantidade de dados que pode ser movidas de
uma só vez entre a memória e o processador, ou entre a memória e dispositivos de
armazenamento em uma única operação.
Palavra
No contexto da arquitetura de computadores, o termo "palavra" não se refere ao sentido
literal de palavras usadas em linguagem natural (como palavras em uma frase). Em vez
disso, "palavra" é um termo técnico específico que se refere a uma unidade de dados
que um processador pode manipular em uma única operação.
O que é uma "Palavra" na Computação?
1. Definição Técnica:
o Uma "palavra" na computação é uma sequência fixa de bits
(bits são os menores unidades de dados em um computador,
representando 0 ou 1).
o O tamanho de uma palavra é determinado pela arquitetura do
processador e pode variar entre sistemas. Comuns tamanhos
de palavras são 8 bits (1 byte), 16 bits (2 bytes), 32 bits (4
bytes), e 64 bits (8 bytes).
Bloco
Bloco: A unidade de dados transferida entre a memória principal e a
memória cache, ou entre a memória e dispositivos de
armazenamento. Um bloco pode consistir de várias palavras.
o Exemplo: Em muitos sistemas de cache, um bloco pode ser de
64 bytes, contendo várias palavras.
Basicamente uma unidade de transferência é igual ao número de linhas elétricas que
chegam e saem do módulo de memória.
Unidades Endereçáveis
Unidades endereçáveis referem-se ao menor incremento de memória que pode ser
individualmente endereçado pelo sistema de memória. Isso depende da arquitetura do
sistema e pode variar. As duas formas mais comuns de unidades endereçáveis são:
Byte Endereçável: A unidade básica de memória que pode ser endereçada
individualmente é um byte. A maioria dos sistemas modernos são byte
endereçáveis.
o Exemplo: Em um sistema byte endereçável, cada endereço de
memória refere-se a um único byte.
Palavra Endereçável: Em alguns sistemas mais antigos ou específicos, a
unidade endereçável pode ser uma palavra (por exemplo, 16 bits, 32 bits, etc.).
o Exemplo: Em um sistema palavra endereçável de 32 bits,
cada endereço de memória refere-se a uma palavra de 32 bits
(4 bytes).
Método de Acesso
Os métodos de acesso referem-se à forma como os dados são recuperados da memória.
Sequencial
Acesso Sequencial: Os dados são acessados em uma ordem
específica e fixa. Para acessar um dado específico, pode ser
necessário passar por todos os dados anteriores.
o Exemplo: Fitas magnéticas, onde os dados são lidos
sequencialmente.
Direto
Acesso Direto: Os dados são acessados diretamente, sem a
necessidade de passar por outros dados. Cada bloco de dados tem
um endereço único.
o Exemplo: Discos rígidos (HDDs) e SSDs, onde você pode
acessar diretamente qualquer bloco de dados com base em
seu endereço.
Aleatório
Acesso Aleatório: Qualquer dado pode ser acessado diretamente
em qualquer ordem. Não há necessidade de passar por outros dados
para acessar o dado desejado.
o Exemplo: Memória RAM, onde qualquer célula de memória
pode ser acessada diretamente.
Associativo
Acesso Associativo: Os dados são acessados com base no seu
conteúdo em vez de um endereço específico. Usado principalmente
em memórias cache e tabelas de hash.
o Exemplo: Memória cache, onde o dado pode ser acessado
rapidamente com base em um valor de chave.
Análise de Desempenho
Tempo de Acesso
Tempo de Acesso: É o tempo necessário para acessar uma
localização específica na memória e recuperar o dado armazenado.
Esse tempo inclui tanto a localização do dado quanto a transferência
do dado para o processador.
o Exemplo: Se a memória RAM tem um tempo de acesso de 10
nanosegundos (ns), significa que leva 10 ns para acessar
qualquer dado nela.
Tempo de Ciclo
Tempo de Ciclo: É o tempo necessário para completar uma
operação de leitura ou escrita na memória, incluindo o tempo de
recuperação (latência) e o tempo necessário para preparar a
memória para a próxima operação.
o Exemplo: Se a memória tem um tempo de ciclo de 20 ns,
significa que após uma operação de leitura/escrita, a memória
estará pronta para a próxima operação após 20 ns.
Taxa de Transferência
Taxa de Transferência: É a velocidade com que os dados podem
ser transferidos de e para a memória, normalmente medida em bytes
por segundo (B/s) ou bits por segundo (bps).
o Exemplo: Se uma memória tem uma taxa de transferência de
3.2 GB/s, isso significa que pode transferir 3.2 gigabytes de
dados por segundo.
Tipo Físico
Semicondutor
Semicondutor: Memórias feitas de materiais semicondutores, como
silício, usadas em RAM, ROM, e flash.
o Exemplo: Memória RAM e SSDs são tipos de memórias
semicondutoras.
Magnético
Magnético: Memórias que usam magnetismo para armazenar dados,
como discos rígidos (HDD) e fitas magnéticas.
o Exemplo: HDDs e fitas de backup são tipos de memórias
magnéticas.
Óptico
Óptico: Memórias que usam luz para ler e escrever dados, como CDs,
DVDs e Blu-ray.
o Exemplo: Um DVD-ROM é um tipo de memória óptica.
Magneto-óptico
Magneto-óptico: Combina tecnologias magnéticas e ópticas para
armazenar dados. Usa laser para leitura/escrita e magnetismo para
alterar o estado dos dados.
o Exemplo: Discos magneto-ópticos, utilizados em algumas
aplicações de arquivamento.
Características
Volátil / Não Volátil
Volátil: Memórias que perdem seus dados quando a energia é
desligada.
o Exemplo: Memória RAM é volátil.
Não Volátil: Memórias que retêm seus dados mesmo quando a
energia é desligada.
o Exemplo: Memória ROM e SSDs são não voláteis.
Apagável / Não Apagável
Apagável: Memórias que podem ter seus dados apagados e
regravados.
o Exemplo: Memória flash e RAM são apagáveis.
Não Apagável: Memórias que não podem ser apagadas ou reescritas
uma vez que os dados foram gravados.
o Exemplo: ROM (Read-Only Memory) é não apagável.
Hierarquia de memória
A hierarquia de memória do IBM z13
Façamos uma analogia:
Primeiro Nível (Cache L1): Quando um funcionário precisa de um documento, ele
primeiro verifica seu arquivo pessoal na mesa. Este é o acesso mais rápido.
Segundo Nível (Cache L2): Se o documento não está no arquivo pessoal, ele
verifica a gaveta na sua mesa.
Terceiro Nível (Cache L3): Se o documento não está na gaveta, ele vai ao arquivo
compartilhado entre os funcionários do departamento.
Quarto Nível (Cache L4): Se o documento não está no arquivo do departamento,
ele vai ao arquivo central do escritório.
Quinto Nível (Memória Principal): Se o documento não está no arquivo central,
ele vai ao armazém do escritório.
Sexto Nível (Memória Secundária): Finalmente, se o documento não está no
armazém, ele precisa ir ao depósito externo.
IBM z13 é um mainframe.
Mainframes são sistemas de computação grandes e potentes e mais confiáveis,
projetados para processar grandes volumes de dados e transações simultâneas. Eles são
essenciais para organizações que precisam de desempenho consistente, segurança
robusta e alta disponibilidade, como bancos, governos e grandes corporações.
O mainframe é um tipo de servidor, não necessariamente uma nuvem ou servidor de
jogos, mas sim usado por empresas para outros processos computacionais.
Princípios de projeto para uma hierarquia de
memória
Princípio da localidade: ... (já foi abordado)
Princípio da Inclusão: Os dados presentes em um nível de cache também devem estar
presentes em todos os níveis de cache superiores. Por exemplo, se um dado está na
cache L1, ele deve estar na cache L2 e na memória principal também.
Princípio da coerência:
- Coerência vertical
Consistência de dados entre diferentes níveis de cache (por exemplo, L1, L2, L3) e a
memória principal, sempre que os dados são atualizados.
- Coerência horizontal
Consistência entre caches do mesmo nível em diferentes processadores ou
núcleos, garantindo que todas as cópias de um dado sejam iguais sempre que um
dado é atualizado.
Modelagem de desempenho de uma
hierarquia de memória multinível
A modelagem de desempenho de uma hierarquia de memória multinível envolve
analisar como os diferentes níveis de memória (cache L1, L2, L3, memória principal,
etc.) impactam a eficiência e a velocidade do acesso à memória. A ideia é entender e
otimizar a interação entre esses níveis para melhorar o desempenho do sistema.
1. Latência: Tempo necessário para acessar dados em cada nível de memória.
2. Taxa de Acertos (Hit Rate): Percentual de vezes que os dados necessários são
encontrados em um determinado nível de memória.
3. Taxa de Falhas (Miss Rate): Percentual de vezes que os dados necessários não
são encontrados e precisam ser buscados em níveis inferiores.
4. Penalidade de Falha (Miss Penalty): Tempo adicional necessário para
recuperar os dados de um nível inferior quando ocorre uma falha.
Acesso à memória de dois níveis
No acesso à memória de dois níveis, há uma memória cache (geralmente L1) e a
memória principal (RAM). O desempenho é avaliado considerando a probabilidade de
encontrar dados na cache versus a necessidade de acessar a memória principal.
Nível 1 (L1 Cache):
Latência: Muito baixa.
Taxa de Acertos: Geralmente alta (80-95%).
Penalidade de Falha: Tempo para acessar a memória principal.
Memória Principal (RAM):
Latência: Maior que a cache.
Taxa de Acertos: Não se aplica, pois este é o nível final.
Penalidade de Falha: Não se aplica.
Acesso à memória de multinível
O acesso à memória de multinível adiciona mais níveis de cache (L2, L3) antes de
acessar a memória principal. Isso ajuda a reduzir ainda mais a latência média de acesso,
pois os dados são mais frequentemente encontrados em níveis mais próximos do
processador.
Nível 1 (L1 Cache):
Latência: Muito baixa.
Taxa de Acertos: Muito alta.
Nível 2 (L2 Cache):
Latência: Baixa, mas maior que L1.
Taxa de Acertos: Alta (60-80%).
Nível 3 (L3 Cache):
Latência: Maior que L2.
Taxa de Acertos: Média (30-50%).
Memória Principal (RAM):
Latência: Maior.
Taxa de Acertos: Não se aplica.