20Aug

Quantos endereços de memória a memória RAM está em meu computador?

Somedays é divertido olhar o nível superficial da experiência de computação, e outros dias é divertido cavar diretamente no funcionamento interno. Hoje estamos examinando a estrutura da memória do computador e a quantidade de coisas que você pode empacotar em uma barra de RAM.

Today's Question &A sessão de atendimento chega a cortesia do SuperUser - uma subdivisão do Stack Exchange, um agrupamento comunitário de sites Q & A.

A questão

O leitor de superutilizador Johan Smohan está lidando com a forma como o tipo de processador e o tamanho da memória funcionam juntos para produzir um número total de endereços. Ele escreve:

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

Eu acho que é algo assim:

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

Eu li na Wikipédia que 1 endereço de memória é 32 bits de largura ou 4 octetos( 1 octeto = 8 bits), em comparação com um processador de 64 bits onde 1 endereço de memória ou 1 inteiro é de 64 bits de largura ou 8 octetos. Mas não sei se eu entendi isso corretamente.

Estes são os tipos de perguntas que podem manter um geek curioso durante a noite. Quantos endereços estão disponíveis em cada um dos sistemas hipotéticos de Johan?

Resposta A resposta

SuperUser Gronostaj oferece algumas informações sobre como a RAM é dividida e utilizada:

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

  • Tamanho da memória em bytes
  • Número inteiro não assinado que pode ser salvona palavra da máquina da CPU

Resposta longa e explicação do acima:

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 quão grande seja a palavra da máquina da CPU.Por exemplo. O processador Intel 8086 foi de 16 bits e estava endereçando a memória por bytes, então faça as CPUs modernas de 32 bits e 64 bits. Essa é a causa do primeiro limite - você não pode ter mais endereços do que bytes de memória.

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

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

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

A palavra da 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 da memória é composto por 32 bits.

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

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

Funciona exatamente como a adição usual, mas o dígito máximo é 1, não 9. Decimal 0 é 0000, então você adiciona 1 e ganha 0001, adicione uma mais uma vez e você tem 0010. O quehapped here is like with having decimal 09 e adicionando um: você muda de 9 para 0 e incrementa o próximo dígito.

A partir do exemplo acima, você pode ver que há sempre um valor máximo que você pode manter em um 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 tornarão 0, quebrando assimo número.É chamado de transbordamento de números inteiros e causa muitos problemas desagradáveis, tanto para usuários como para desenvolvedores.

11111111 = 255 + 1 ----------- 100000000 = 0( 9 bits aqui, então 1 é aparado)
  • 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 possui 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 simplesmente não pode processar números suficientemente grandes para resolver mais memória.

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

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

No entanto, nos sistemas operacionais reais, as CPUs de 32 bits podem abordar cerca de 3 GiB de RAM.Isso é devido à arquitetura interna do sistema operacional - alguns endereços são reservados para outros fins. Você pode ler mais sobre esta chamada barreira de 3 GB na Wikipédia. Você pode levantar esse limite com extensão de endereço físico.

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

Memória virtual

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

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

Paging

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

Paging é um esquema de endereçamento alternativo que permite abordar mais memória que você normalmente poderia com uma palavra de máquina em modelo plano.

Imagine um livro preenchido com palavras de 4 letras. Digamos que existem 1024 números em cada página. Para endereçar um número, você deve conhecer duas coisas:

  • O número da página na qual essa palavra é impressa.
  • Qual palavra naquela página é a que você está procurando.

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

Segmentação

Bem, esta é bastante semelhante à paginação. Ele foi usado na Intel 8086, apenas para citar um exemplo. Os 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, em 8086, a maioria das células de memória estava disponível a partir de 4096 segmentos diferentes.

Um exemplo:

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

Ilustração para 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 deslocados 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 4º byte pode ser endereçado de quatro maneiras:( endereçamento a partir de 0)

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

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

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

O que é ruim sobre a 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, depois fingir que o segmento é menor do que realmente é( apenas pequeno o suficiente para segurar o módulo), então escolha o primeiro segmento que não se sobrepõe com aquele pseudo-menor e carreguepróximo módulo, e assim por diante. Basicamente, o que você obtém dessa maneira são páginas de tamanho variável.

Tem alguma coisa a adicionar à explicação? Som na parte dos comentários. Deseja ler mais respostas de outros usuários Tech-savvy Stack Exchange? Confira o tópico de discussão completo aqui.