Por bytes Acesso à memória RAM

3

Eu tenho apenas uma pergunta simples. Hoje, os chips DDR de memória têm 64 bits de largura, e o barramento de dados da CPU também tem 64 bits de largura. Mas a memória ainda é organizada em bytes únicos. Então, o que eu quero perguntar é, quando a CPU seleciona algum endereço de memória, deve ser um byte, certo? A menor porção de memória que você pode acessar é de 1 byte. Mas, se você obtiver 1 byte por 1 endereço, por que o barramento de memória tem 8 bytes de largura?

    
por user32569 07.05.2010 / 18:44

5 respostas

2

Nós nos referimos às nossas arquiteturas de computador como byte-addressable - significando que a memória é endereçada como bytes. Isso nos ajuda a extrair 8 bits de dados por vez. Mas isso nem sempre é a norma e outras larguras são usadas.

Na verdade, mesmo quando você usa um computador com endereço de bytes baseado na Intel, a memória que você usa geralmente é acessada com uma largura diferente (64 bits, como no seu exemplo).

Isso ajuda a endereçar uma quantidade maior de dados com menos espaço de endereço.

Minha resposta realmente completa aqui, no entanto, eu falo mais a fundo sobre como os acessos à memória são feitos, o que pode ajudar a pensar nas abstrações implementadas (e talvez também motivá-lo a ler mais sobre as memórias).

Se você viu um dispositivo DDR-RAM, você se lembraria de ter visto vários chips em um PCB verde. Estes são distribuídos juntos para um acesso paralelo. Isso faz com que sua memória RAM acesse mais rápido.

Na frente do módulo de RAM é um controlador de memória. Isso é projetado para acessar dados em uma largura de bit mais ampla (32, 64, 128 bits - dependendo do design).

Quando você acessa um byte desse espaço de memória, o controlador de memória obtém uma "palavra de memória" completa; aqui, uma palavra é, na verdade, a largura desse acesso do controlador de memória.

O que significa que, se sua largura de 128 bits, você sempre buscar 16 bytes de endereços que são múltiplos de 16.

Então, agora o que acontece quando você quer um byte no endereço 18 (= 16 + 2)?
Bem, você obtém 16 bytes do endereço 16 e joga fora 15 deles!

Mais interessante, o que acontece quando você quer escrever um byte no endereço 19?
Você busca 16 bytes do endereço 16, altera o byte 3'rd (19º endereço) e depois escreve todos esses 16 bytes (divertido, huh?).

Tudo isso é um grande esforço. O controlador de memória é projetado para gerenciar isso e, na verdade, funciona em várias solicitações em paralelo.

Não estamos falando de 'canal duplo', mas :-)

Aqui está uma referência da Wikipedia sobre Organização de SDRAM DDR

PC3200 is DDR SDRAM designed to operate at 200 MHz using DDR-400 chips
with a bandwidth of 3,200 MB/s. As the memory is double pumped,
this means that the effective clock rate of PC3200 memory is 400 MHz.

1 GB PC3200 non-ECC modules are usually made with sixteen 512 Mbit chips,
8 down each side (512 Mbits × 16 chips) / (8 bits (per byte)) = 1,024 MB.
The individual chips making up a 1 GB memory module are usually
organized with 64 Mbits and a data width of 8 bits for each chip,
commonly expressed as 64M×8.

Memory manufactured in this way is low density RAM and will usually be
compatible with any motherboard specifying PC3200 DDR-400 memory.

Na página Controlador de memória

Bus width is the number of parallel lines available to communicate with the memory cell.
Memory controllers' bus widths range from 8-bit in earlier systems, to 512-bit in more complicated systems and video cards (typically implemented as four 64-bit simultaneous memory controllers operating in parallel, though some are designed to operate in "gang mode" where two 64-bit memory controllers can be used to access a 128-bit memory device).

    
por 07.05.2010 / 19:24
2

É mais rápido transferir grandes quantidades de dados 8 bytes de cada vez, em vez de 1. Além disso, não há como endereçar de qualquer forma bytes simples fora do cache da CPU, já que os últimos bits de endereço não têm mais conexões físicas (porque eles não são necessários).

    
por 07.05.2010 / 18:51
1

Eu falo sem grande conhecimento, mas aproximadamente ...

Os processadores recuperam uma palavra por vez (ou seja, um processador de 64 bits recupera 8 bytes de cada vez). No entanto, ao recuperar um único byte, eles descartam efetivamente os outros 7 bytes. O esquema de endereçamento de memória ainda é geralmente considerado como bytes, mas se você estiver obtendo dados o mais rápido possível, usará endereços alinhados à palavra, ou seja, endereços que são divisíveis pelo tamanho da palavra em bytes. Em um sistema de 64 bits, você usará os endereços 0, 8, 16, 24, etc.

Se você puxar uma palavra de um endereço não alinhado por palavra, digamos 5, o processador terá que fazer duas buscas, uma para bytes 5, 6, 7 e um segundo 8, 9, 10, 11, 12, então vai demorar o dobro do tempo.

O endereçamento de bytes individualmente é útil por vários motivos, mas é fácil imaginar um design de processador que resolva o endereçamento de palavras. Se você quisesse um byte, obteria uma palavra, apagaria os bytes que não deseja e embaralhava o byte na parte inferior da palavra. De certa forma é isso que está acontecendo, pegar um byte é pegar uma palavra e escolher um byte, é mais fácil pensar nisso como um byte no endereço 10, em vez da palavra 1, byte 3.

Fora da CPU, a RAM nunca chega a ver os bits de endereço inferiores, a RAM é organizada como palavras, é o modelo de CPU / programadores que fornece a ilusão de endereçamento de bytes.

    
por 07.05.2010 / 19:16
0

No seu exemplo, escrevendo um byte, de um ponto de vista de palavra de memória, a palavra foi alterada. Você e eu sabemos que apenas alguns bits são diferentes, mas, independentemente disso, a memória precisa ser atualizada agora. Então essa palavra é gravada de volta na memória - todos os 64 bits. Isso seria verdade, independentemente do tamanho mínimo endereçável da memória. Quando a memória tinha 8 bits de largura, todos os 8 bits teriam sido escritos, embora talvez apenas 1 bit tenha sido alterado.

    
por 07.05.2010 / 19:28
0

Do que eu me lembro de meus dias de trabalho de hardware de baixo e de Assembler, a memória é realmente acessada em páginas. Você nunca acessa realmente um único byte, ou mesmo a largura de barramento da RAM, mas sim em blocos (não posso lhe dar um número exato - particularmente porque varia - mas os números 4KB soam muito familiares [talvez eu seja pensando em segmentos, embora seja 64KB]).

O ponto é que é terrivelmente ineficiente endereçar um único byte, especialmente porque o próximo endereço de memória a ser acessado provavelmente está bem próximo a ele. Dessa forma, quando você acessa um byte, o sistema armazena em cache um bloco de RAM (para que você acha que os vários caches da CPU servem?) Todas as alterações feitas são feitas na RAM em cache, para que, se você as gravar, escreva o bloco de maneira agradável e rápida. O byte é acessado por si mesmo, mas de um bloco em cache; isto é, a CPU não busca um único byte, mas retorna apenas um.

Com os sistemas de hoje sendo muito maiores, imagino que eles precisariam armazenar em cache ainda mais para otimizar as coisas (portanto, caches de CPU maiores).

    
por 07.05.2010 / 19:36

Tags