Quantos endereços de memória podemos obter com um processador de 32 bits e 1 GB de RAM?

12

Quantos endereços de memória podemos obter com um processador de 32 bits e 1 GB de RAM e quantos com um processador de 64 bits?

Eu acho que é algo assim:

1 GB de ram dividido por 32 bits ou dividido por 4? obter o número de endereços de memória?

Mas eu não tenho certeza. É por isso que estou perguntando.

Verifiquei na wikipedia que 1 endereço de memória tem 32 bits de largura ou 4 octetos (1 octeto = 8 bits), comparado a 64 bits de um processador em que 1 endereço de memória ou 1 número inteiro tem 64 bits de largura ou 8 octetos. Mas não sei se eu entendi corretamente também.

johan smohan
fonte
Praticamente todos os sistemas modernos são endereçados por byte, o que significa que 32 bits podem endereçar cerca de 4 gigabytes (se houver muita RAM instalada). Historicamente, existem esquemas endereçados por palavras, com uma "palavra" sendo 12, 15, 16, 17, 24, 32, 36 ou 48 bits, e provavelmente outros, além de máquinas decimais que endereçam um endereço de 4 ou 6 bits. unidade. Mas lembre-se também de que a maioria dos sistemas modernos emprega memória virtual, o que significa que o processador pode endereçar ainda mais memória do que o que está instalado.
Daniel R Hicks
@DanielRHicks A memória virtual não afeta a quantidade de RAM que pode ser endereçada.
Jamie Hanrahan
@ JamieHanrahan - Para que a memória virtual funcione, deve haver algum mecanismo de endereçamento que abranja o intervalo de endereços virtuais (de um único processo). Isso pode ser feito com a simulação de software, mas isso é bastante ineficiente; portanto, na maioria dos sistemas, o intervalo de endereçamento do processador é grande o suficiente para incorporar o espaço máximo de endereço de um processo.
Daniel R Hicks
@DanielRHicks Claro, mas isso não afeta a quantidade de RAM que pode ser tratada. RAM é memória física, não virtual. Endereços virtuais não são endereços de RAM e memória virtual não é RAM.
Jamie Hanrahan
@JamieHanrahan - Você não está fazendo nenhum sentido. Se você não conseguir endereçar as páginas da RAM no espaço de endereço virtual, a RAM será inútil. (Eu sei muito bem como funciona a memória virtual, tendo trabalhado em projetos de memória virtual desde 1972.)
Daniel R Hicks

Respostas:

38

Resposta curta: o número de endereços disponíveis é igual ao menor dos seguintes:

  • Tamanho da memória em bytes
  • Maior número inteiro não assinado que pode ser salvo na palavra de máquina da CPU

Resposta longa e explicação do acima exposto:

A memória consiste em bytes (B). Cada byte consiste em 8 bits (b).

1 B = 8 b

1 GB de RAM é na verdade 1 GiB (gibibyte, não gigabyte). A diferença é:

1 GB  = 10^9 B = 1 000 000 000 B
1 GiB = 2^30 B = 1 073 741 824 B

Cada byte de memória tem seu próprio endereço, não importa o tamanho da palavra da máquina da CPU. Por exemplo. A CPU Intel 8086 tinha 16 bits e endereçava a memória por bytes, assim como as modernas CPUs de 32 e 64 bits. Essa é a causa do primeiro limite - você não pode ter mais endereços que bytes de memória.

O endereço da memória é apenas um número de bytes que a CPU precisa pular desde o início da memória para chegar ao que está procurando.

  • Para acessar o primeiro byte, ele deve pular 0 bytes; portanto, o endereço do primeiro byte é 0.
  • Para acessar o segundo byte, ele deve pular 1 byte, portanto seu endereço é 1.
  • (e assim por diante...)
  • Para acessar o último byte, a CPU ignora 1073741823 bytes, portanto seu endereço é 1073741823.

Agora você precisa saber o que realmente significa 32 bits. Como mencionei antes, é do tamanho de uma palavra de máquina.

Palavra de máquina é a quantidade de memória que a CPU usa para armazenar números (em RAM, cache ou registros internos). A CPU de 32 bits usa 32 bits (4 bytes) para armazenar números. Os endereços de memória também são números; portanto, em uma CPU de 32 bits, o endereço de memória consiste em 32 bits.

Agora pense sobre isso: se você tiver um bit, poderá salvar dois valores: 0 ou 1. Adicione mais um bit e você terá quatro valores: 0, 1, 2, 3. Em três bits, você pode salvar oito valores : 0, 1, 2 ... 6, 7. Este é realmente um sistema binário e funciona assim:

Decimal Binary
0       0000
1       0001
2       0010
3       0011
4       0100
5       0101
6       0110
7       0111
8       1000
9       1001
10      1010
11      1011
12      1100
13      1101
14      1110
15      1111

Funciona exatamente como a adição usual, mas o dígito máximo é 1, e não 9. O decimal 0 é 0000, então você adiciona 1 e obtém 0001, adiciona um mais uma vez e possui 0010. O que aconteceu aqui é como ter decimal 09e adicionar um: você altera 9 para 0 e incrementa o próximo dígito.

No exemplo acima, você pode ver que sempre há um valor máximo que você pode manter em número com número constante de bits - porque quando todos os bits são 1 e você tenta aumentar o valor em 1, todos os bits se tornam 0, quebrando assim o número. É chamado de excesso de número inteiro e causa muitos problemas desagradáveis, tanto para usuários quanto para desenvolvedores.

   11111111    = 255
+         1
-----------
  100000000    = 0   (9 bits here, so 1 is trimmed)
  • Para 1 bit, o maior valor é 1,
  • 2 bits - 3,
  • 3 bits - 7,
  • 4 bits - 15

O maior número possível é sempre 2 ^ N-1, onde N é o número de bits. Como eu disse antes, um endereço de memória é um número e também tem um valor máximo. É por isso que o tamanho da palavra da máquina também é um limite para o número de endereços de memória disponíveis - às vezes, sua CPU não consegue processar números grandes o suficiente para endereçar mais memória.

Assim, em 32 bits, você pode manter os números de 0 a 2 ^ 32-1, e isso é 4 294 967 295. É mais do que o melhor endereço em 1 GB de RAM, portanto, no seu caso específico, a quantidade de RAM será o fator limitante.

O limite de RAM para a CPU de 32 bits é teoricamente 4 GB (2 ^ 32) e para a CPU de 64 bits é 16 EB (exabytes, 1 EB = 2 ^ 30 GB). Em outras palavras, a CPU de 64 bits pode endereçar a Internet inteira ... 200 vezes;) (estimada pela WolframAlpha ).

No entanto, nos sistemas operacionais da vida real, as CPUs de 32 bits podem endereçar cerca de 3 GiB de RAM. Isso ocorre devido à arquitetura interna do sistema operacional - alguns endereços são reservados para outros fins. Você pode ler mais sobre essa barreira de 3 GB na Wikipedia . Você pode aumentar esse limite com a extensão de endereço físico .


Falando sobre endereçamento de memória, há poucas coisas que devo mencionar: memória virtual , segmentação e paginação .

Memória virtual

Como @Daniel R Hicks apontou em outra resposta, os sistemas operacionais usam memória virtual. O que isso significa é que os aplicativos realmente não operam em endereços de memória reais, mas nos fornecidos pelo sistema operacional.

Essa técnica permite que o sistema operacional mova alguns dados da RAM para o chamado Pagefile (Windows) ou Swap (* NIX). O HDD é poucas magnitudes mais lentas que a RAM, mas não é um problema sério para dados raramente acessados ​​e permite que o SO forneça aos aplicativos mais RAM do que você realmente instalou.

Paging

O que estávamos falando até agora é chamado de esquema de endereçamento simples.

A paginação é um esquema de endereçamento alternativo que permite endereçar mais memória do que você normalmente poderia com uma palavra de máquina no modelo plano.

Imagine um livro cheio de palavras de 4 letras. Digamos que existam 1024 números em cada página. Para endereçar um número, você precisa saber duas coisas:

  • O número de páginas em que essa palavra é impressa.
  • Qual palavra nessa página é a que você está procurando.

Agora é exatamente assim que as CPUs x86 modernas lidam com a memória. Está dividido em 4 páginas KiB (1024 palavras-máquina cada) e essas páginas têm números. (na verdade, as páginas também podem ter 4 MiB grandes ou 2 MiB com PAE ). Quando você deseja endereçar a célula de memória, precisa do número e endereço da página nessa página. Observe que cada célula de memória é referenciada por exatamente um par de números, que não será o caso da segmentação.

Segmentação

Bem, este é bem parecido com paginação. Foi usado no Intel 8086, apenas para citar um exemplo. Grupos de endereços agora são chamados de segmentos de memória, não de páginas. A diferença é que os segmentos podem se sobrepor e eles se sobrepõem muito. Por exemplo, no 8086, a maioria das células de memória estava disponível em 4096 segmentos diferentes.


Um exemplo:

Digamos que temos 8 bytes de memória, todos contendo zeros, exceto o 4º byte, que é igual a 255.

Ilustração para o modelo de memória plana:

 _____
|  0  |
|  0  |
|  0  |
| 255 |
|  0  |
|  0  |
|  0  |
|  0  |
 -----

Ilustração para memória paginada com páginas de 4 bytes:

 PAGE0
 _____
|  0  |
|  0  |
|  0  |  PAGE1
| 255 |  _____
 -----  |  0  |
        |  0  |
        |  0  |
        |  0  |
         -----

Ilustração para memória segmentada com segmentos de 4 bytes alterada em 1:

 SEG 0
 _____   SEG 1
|  0  |  _____   SEG 2
|  0  | |  0  |  _____   SEG 3
|  0  | |  0  | |  0  |  _____   SEG 4
| 255 | | 255 | | 255 | | 255 |  _____   SEG 5
 -----  |  0  | |  0  | |  0  | |  0  |  _____   SEG 6
         -----  |  0  | |  0  | |  0  | |  0  |  _____   SEG 7
                 -----  |  0  | |  0  | |  0  | |  0  |  _____
                         -----  |  0  | |  0  | |  0  | |  0  |
                                 -----   -----   -----   -----

Como você pode ver, o quarto byte pode ser endereçado de quatro maneiras: (endereçando de 0)

  • Segmento 0, deslocamento 3
  • Segmento 1, deslocamento 2
  • Segmento 2, deslocamento 1
  • Segmento 3, deslocamento 0

É sempre a mesma célula de memória.

Nas implementações da vida real, os segmentos são deslocados em mais de 1 byte (para 8086 eram 16 bytes).

O que é ruim na segmentação é que é complicado (mas acho que você já sabe disso;) O que é bom é que você pode usar algumas técnicas inteligentes para criar programas modulares.

Por exemplo, você pode carregar algum módulo em um segmento, fingir que o segmento é menor do que realmente é (apenas pequeno o suficiente para reter o módulo), escolher o primeiro segmento que não se sobrepõe ao pseudo-menor e carregar o próximo módulo , e assim por diante. Basicamente, o que você obtém dessa maneira são páginas de tamanho variável.

gronostaj
fonte
1
Um sistema operacional pode fornecer o espaço de endereço virtual 4GiB completo (possivelmente menos uma página - 4KiB para x86) ao processo do usuário, mas torna as chamadas do sistema mais caras, pois o espaço de endereço deve ser alterado. Com o PAE e mecanismos semelhantes, a quantidade de memória física endereçável pelo sistema pode ser aumentada, embora os endereços ainda estejam limitados a 32 bits.
Paul A. Clayton
Não é o que eu estava procurando, mas é uma boa informação de qualquer maneira! Obrigado pela boa explicação do max. dígito (1 = max. como no binário 9 é max.) para a comparação da tabela binária e decimal. Realmente uma boa maneira de pensar sobre isso. Eu aprendi algo novo. :) Obrigado!
Johan smohan #
Este Gibi e Giga é tão confuso ... Porque em alguns sites eu li que a memória é medida em Gibi e em outros que está em Giga ... Você tem alguma fonte boa / confiável?
Johan smohan #
A Wikipedia possui um artigo sobre prefixos binários, incluindo alguns antecedentes históricos. A maioria dos números relacionados a hardware usa prefixos decimais, as exceções mais notáveis ​​são provavelmente RAM e talvez escala de cores - por exemplo. Os LCDs com 16 milhões de cores possuem três canais de cores de 8 bits (2 ^ 24). Respondendo diretamente à sua pergunta: Nesse caso, o número de endereços disponíveis é igual ao número de bytes de memória, porque a RAM é endereçada por byte. A CPU de 32 bits pode suportar até 2 ^ 32 B, uma de 64 bits - 2 ^ 64.
Gronostaj
Obrigado! Eu preciso disso para os exames da escola. :) Eu acho que entendo a maioria das coisas agora. A única coisa que ainda me incomoda é por que 2 ^ 32 B, se é um processador de 32 bits e não um 32 bytes?
Johan smohan #
3

Além do acima, observe que o endereçamento virtual é usado, juntamente com vários espaços de endereço . Portanto, mesmo que você tenha apenas 1 GB de RAM, um programa pode usar conceitualmente até 4 GB de memória virtual (embora a maioria dos sistemas operacionais o limite a menos que isso). E você pode conceitualmente ter um número (quase) infinito desses espaços de endereço de 4 GB.

O tamanho da RAM não restringe (muito) o tamanho máximo de um programa ou o número de programas que você pode executar, mas restringe o desempenho. Quando a memória real fica "super comprometida" e o sistema começa a "debater" à medida que "troca" "páginas" de memória entre a RAM e o disco, o desempenho diminui.

Daniel R Hicks
fonte
2

O 1 GByte de RAM ocuparia 1024 * 1024 * 1024 bytes, ou 1.073.741.824 bytes.

Um processador de 32 bits sempre possui 4 * 1024 * 1024 * 1024 bytes ou 4.294.967.296 bytes de espaço de endereço O 1Gbyte de RAM aparece nesse espaço. Nos processadores Intel, alguma RAM precisa aparecer no endereço 0 para os vetores de interrupção; portanto, a RAM física inicia no endereço 0 e sobe.

Outras coisas aparecem nesse espaço de endereço, como BIOS e ROMs opcionais (nos 384Kbytes superiores nos primeiros 1Mbyte), dispositivos de E / S (como o APIC) e a RAM de vídeo. Algumas coisas estranhas também acontecem no modo de gerenciamento de sistema "SMRAM" que ainda não entendi completamente.

Observe que este é um espaço de endereço físico, do ponto de vista do kernel. A MMU pode reorganizar tudo isso de qualquer maneira para um processo no espaço do usuário.

LawrenceC
fonte
Verifiquei na wikipedia que 1 endereço de memória tem 32 bits de largura ou 4 octetos (1 octeto = 8 bits), comparado a 64 bits de um processador em que 1 endereço de memória ou 1 número inteiro tem 64 bits de largura ou 8 octetos. Você está correto sobre o espaço de endereço de 4 * 1024 * 1024 * 1024 bytes, mas estava procurando o espaço de endereço de memória, que acho que é de 1 GB / 32 bits, mas ainda não sei se estou correto ou não. :) Obrigado pela sua resposta!
Johan smohan #
Np. As CPUs da Intel têm dois espaços de endereço: "Memória" e "E / S". Outras coisas que não a RAM aparecem no espaço "Memória". Outras coisas, como dispositivos de E / S ou ROM, podem estar em locais desocupados pela RAM. Geralmente, apenas os dispositivos de E / S aparecem no espaço de endereço de E / S.
21813 LawrenceC
@johansmohan Nem seus números nem a resposta de Lawrence estão corretos. Não há relação fixa entre a "largura de bit" de um processador e a largura dos endereços de RAM que ele pode usar. Os processadores x86 de apenas 32 bits podem endereçar 64 GB de RAM. Os processadores x64 iniciaram no espaço de endereço físico de 40 bits e agora estão em 52 bits. Quanto ao espaço de endereço virtual, isso também pode ser diferente. No x64, embora os endereços virtuais precisem de 64 bits para armazenar, apenas 48 bits são implementados, para um VAS de 256 TiB em vez dos 16 EiB que você esperaria de 64 bits.
Jamie Hanrahan
0

Um processador de 32 bits pode endereçar no máximo 2 ^ 32 bytes de memória individuais (cerca de 4 GB), mas ter 1 GB de memória tornaria 1 * 1024 * 1024 * 1024 bytes de memória endereçável (embora você provavelmente ainda tenha um espaço de endereço virtual de 2 ^ 32 ) Uma CPU de 64 bits pode endereçar 2 ^ 64 bytes individuais, mas acho que a maioria dos sistemas usa apenas 48 bits para endereços de memória que fazem o limite superior. bytes endereçáveis ​​2 ^ 48.

Ácido
fonte
Você quis dizer 1024 * 1024 * 1024 e não 1 * 1024 * 1024, certo?
Johan smohan #
Um processador de 32 bits pode endereçar no máximo 2 ^ 32 octetos ou bits? Apenas verificando, porque eu devo saber com certeza.
Johan smohan #
@johan smohan Correto, deveria ter sido 1 * 1024 * 1024 * 1024
AcId
@johan smohan Um processador de 32 bits pode dirigir-se a maior parte dos 2 ^ 32 bytes, com um byte de 8 bits (sendo um octeto t de bits)
ácido
0

A resposta aceita dá uma boa explicação. Mas não acho que seja a resposta. Não contém nada sobre o barramento de endereços . E seu tamanho é realmente o principal motivo de restrições de memória. Por exemplo, 8080 é um processador de 8 bits (o tamanho do barramento de dados é 8 bits), mas possui um barramento de endereços de 16 bits. Pode endereçar 2 ^ 16 = (2 ^ 6) * (2 ^ 10) = 64 * 1024 bytes = 64 KB.

Você pode encontrar mais aqui (32 bits) na seção "Histórico técnico".

Dmitriy Dokshin
fonte
Concordo. Observe que os modelos posteriores do PDP-11 de 16 bits tinham um barramento de endereços de 22 bits (e, portanto, podiam endereçar 4 MB de RAM), o HP 1000MX, também "16 bits", finalmente atingiu 16 MB de RAM (24). endereços de bits); o VAX era uma CPU de 32 bits, mas tinha um espaço de endereço físico de 30 bits, mas metade era reservada para o espaço de E / S, para um limite de RAM de 512 MB; o "16 bits" 8086, 1 MB; o "16 bits" 80286, 16 MB; etc. E quando o PAE foi introduzido com o Pentium Pro, o x86 de 32 bits pode endereçar até 64 GB de RAM (espaço de endereço físico de 24 bits, embora os três bits de ordem inferior nunca cheguem a sair da CPU).
Jamie Hanrahan
-2

Eu acredito que as informações mais básicas são perdidas nessa conversa, então aqui está a minha resposta:

Dizer "Este é um processador de 32 bits" significa que o tamanho da instrução, ou tamanho do comando, com o qual a CPU pode entender e trabalhar ao mesmo tempo é de 32 bits. Da mesma forma com os processadores de 64 bits: eles podem lidar com instruções de no máximo 64 bits.

Pense nisso como uma calculadora mecânica antiga: você só tem tantos dígitos, então simplesmente não pode inserir mais números.

Agora, um endereço que uma CPU pode usar também precisa se encaixar no mesmo espaço; portanto, para um processador de 32 bits, o endereço usado também pode ter apenas 32 bits, no máximo. Portanto, a partir daqui, podemos simplesmente calcular o número máximo de endereços (ou seja, a quantidade máxima de RAM utilizável pela CPU):

2 ^ 32 = 4294967296 (= 4 GB)

ou

2 ^ 64 = 18446744073709551616 (= muito mais;)

Ou, como um exemplo divertido, meu antigo Commodore 64 tinha uma CPU de 16 bits, portanto, era capaz de gerenciar uma memória de:

2 ^ 16 = 65536 bytes (= 64 KB)

Essa é a lógica básica, mas, como afirmado anteriormente, existem maneiras de contornar essa limitação, como espaços de endereço virtual, mapeamento de memória etc.

Tuncay Göncüoğlu
fonte
2
A diferença significativa entre os processadores de 32 e 64 bits é o intervalo de endereços (que afeta mais o espaço de endereço virtual do que "real"). Os processadores usam tantos truques que é difícil dizer qual é a largura real do caminho de dados, em muitos casos. E o comprimento da instrução não tem grande relação com a "largura" do processador.
Daniel R Hicks
A explicação está perfeitamente correta. Supondo que você não queira dizer a dimensão real do chip em centímetros ao dizer "largura do processador"; nesse caso, você estaria correto ao dizer que não é relacionado, você está confundindo técnicas de mapeamento de memória / espaços de endereço virtual com endereçamento de memória física. Além disso, o que você diz está mais relacionado às implementações do kernel, você pode verificar os kernels do Linux PAE.
Tuncay Göncüoğlu 8/08/14
2
O comprimento de uma instrução não tem relação alguma com a "largura" do processador nos sistemas modernos. Os valores mais relevantes são a largura dos registradores (embora isso possa ser enganoso), a largura do caminho de transferência entre o processador e a memória e o tamanho em bits de um endereço de memória. Mas esses três valores podem ser facilmente diferentes entre si.
Daniel R Hicks
1
@DanielRHicks Daniel Hicks está correto. A "largura de bit" da CPU não tem necessariamente nada a ver com o "tamanho da instrução ou tamanho do comando". Houve CPUs que foram construídas dessa maneira, mas os processadores de commodities atuais (x86 / x64) não estão entre eles.
Jamie Hanrahan