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.
Respostas:
Resposta curta: o número de endereços disponíveis é igual ao menor dos seguintes:
Resposta longa e explicação do acima exposto:
A memória consiste em bytes (B). Cada byte consiste em 8 bits (b).
1 GB de RAM é na verdade 1 GiB (gibibyte, não gigabyte). A diferença é:
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.
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:
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ém0001
, adiciona um mais uma vez e possui0010
. O que aconteceu aqui é como ter decimal09
e 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.
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:
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:
Ilustração para memória paginada com páginas de 4 bytes:
Ilustração para memória segmentada com segmentos de 4 bytes alterada em 1:
Como você pode ver, o quarto byte pode ser endereçado de quatro maneiras: (endereçando de 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.
fonte
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.
fonte
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.
fonte
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.
fonte
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".
fonte
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.
fonte