¿Cuántas direcciones de memoria podemos obtener con un procesador de 32 bits y 1 gb de ram?

12

¿Cuántas direcciones de memoria podemos obtener con un procesador de 32 bits y 1 gb de ram y cuántas con un procesador de 64 bits?

Creo que es algo como esto:

¿1 GB de ram dividido por 32 bits o dividido por 4? para obtener el número de direcciones de memoria?

Pero no estoy seguro. Por eso estoy preguntando.

Indiqué en Wikipedia que 1 direcciones de memoria tienen 32 bits de ancho o 4 octetos (1 octeto = 8 bits), en comparación con un procesador de 64 bits donde 1 direcciones de memoria o 1 número entero tienen 64 bits de ancho u 8 octetos. Pero tampoco sé si lo entendí correctamente.

johan smohan
fuente
Prácticamente todos los sistemas modernos están direccionados en bytes, lo que significa que 32 bits pueden direccionar alrededor de 4 gigabytes (si hay tanta RAM instalada). Históricamente, ha habido esquemas de direccionamiento de palabras, con una "palabra" de 12, 15, 16, 17, 24, 32, 36 o 48 bits, y probablemente algunos otros, además de máquinas decimales que se dirigieron a 4 o 6 bits. unidad. Pero también tenga en cuenta que la mayoría de los sistemas modernos emplean memoria virtual, lo que significa que el procesador puede direccionar aún más memoria de la que está instalada.
Daniel R Hicks
@DanielRHicks La memoria virtual no afecta la cantidad de RAM que se puede abordar.
Jamie Hanrahan
@JamieHanrahan: para que la memoria virtual funcione, debe haber algún mecanismo de direccionamiento que abarque el rango de direcciones virtuales (de un solo proceso). Esto se puede hacer con la simulación de software, pero eso es bastante ineficiente, por lo que en la mayoría de los sistemas el rango de direccionamiento del procesador es lo suficientemente grande como para incorporar el espacio máximo de direcciones de un proceso.
Daniel R Hicks
@DanielRHicks Claro, pero eso no afecta la cantidad de RAM que se puede abordar. La RAM es memoria física, no virtual. Las direcciones virtuales no son direcciones RAM y la memoria virtual no es RAM.
Jamie Hanrahan
@JamieHanrahan - No tienes ningún sentido. Si no puede direccionar páginas de RAM en el espacio de direcciones virtuales, entonces la RAM es inútil. (Sé muy bien cómo funciona la memoria virtual, después de haber trabajado en diseños de memoria virtual desde 1972.)
Daniel R Hicks

Respuestas:

38

Respuesta corta: El número de direcciones disponibles es igual al menor de esos:

  • Tamaño de memoria en bytes
  • El mayor entero sin signo que se puede guardar en la palabra máquina de la CPU

Respuesta larga y explicación de lo anterior:

La memoria consta de bytes (B). Cada byte consta de 8 bits (b).

1 B = 8 b

1 GB de RAM es en realidad 1 GiB (gibibyte, no gigabyte). La diferencia es:

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

Cada byte de memoria tiene su propia dirección, no importa cuán grande sea la palabra de la máquina de la CPU. P.ej. La CPU Intel 8086 era de 16 bits y se dirigía a la memoria por bytes, al igual que las CPU modernas de 32 y 64 bits. Esa es la causa del primer límite: no puede tener más direcciones que bytes de memoria.

La dirección de memoria es solo una cantidad de bytes que la CPU debe omitir desde el comienzo de la memoria para llegar a la que está buscando.

  • Para acceder al primer byte, debe omitir 0 bytes, por lo que la dirección del primer byte es 0.
  • Para acceder al segundo byte, debe omitir 1 byte, por lo que su dirección es 1.
  • (Etcétera...)
  • Para acceder al último byte, la CPU omite 1073741823 bytes, por lo que su dirección es 1073741823.

Ahora debe saber qué significa realmente 32 bits. Como mencioné antes, es del tamaño de una palabra de máquina.

La palabra máquina es la cantidad de memoria que la CPU usa para contener números (en RAM, caché o registros internos). La CPU de 32 bits usa 32 bits (4 bytes) para contener números. Las direcciones de memoria también son números, por lo que en una CPU de 32 bits la dirección de memoria consta de 32 bits.

Ahora piense en esto: si tiene un bit, puede guardar dos valores en él: 0 o 1. Agregue un bit más y tendrá cuatro valores: 0, 1, 2, 3. En tres bits, puede guardar ocho valores : 0, 1, 2 ... 6, 7. Este es en realidad un sistema binario y funciona así:

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 exactamente como la suma habitual, pero el dígito máximo es 1, no 9. Decimal 0 es 0000, luego sumas 1 y obtienes 0001, agregas uno una vez más y tienes 0010. Lo que sucede aquí es tener un decimal 09y agregar uno: cambia de 9 a 0 e incrementa el siguiente dígito.

En el ejemplo anterior, puede ver que siempre hay un valor máximo que puede mantener en un número con un número constante de bits, porque cuando todos los bits son 1 e intenta aumentar el valor en 1, todos los bits se convertirán en 0, rompiendo así el número. Se llama desbordamiento de enteros y causa muchos problemas desagradables, tanto para usuarios como para desarrolladores.

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

El mayor número posible es siempre 2 ^ N-1, donde N es el número de bits. Como dije antes, una dirección de memoria es un número y también tiene un valor máximo. Es por eso que el tamaño de la palabra máquina también es un límite para la cantidad de direcciones de memoria disponibles, a veces su CPU simplemente no puede procesar números lo suficientemente grandes como para direccionar más memoria.

Entonces, en 32 bits, puede mantener números del 0 al 2 ^ 32-1, y eso es 4 294 967 295. Es más que la mejor dirección en 1 GB de RAM, por lo que en su caso específico la cantidad de RAM será el factor limitante.

El límite de RAM para CPU de 32 bits es teóricamente 4 GB (2 ^ 32) y para CPU de 64 bits es 16 EB (exabytes, 1 EB = 2 ^ 30 GB). En otras palabras, la CPU de 64 bits podría abordar Internet completa ... 200 veces;) (estimado por WolframAlpha ).

Sin embargo, en los sistemas operativos de la vida real, las CPU de 32 bits pueden abordar aproximadamente 3 GiB de RAM. Esto se debe a la arquitectura interna del sistema operativo: algunas direcciones están reservadas para otros fines. Puede leer más sobre esta llamada barrera de 3 GB en Wikipedia . Puede levantar este límite con la Extensión de dirección física .


Hablando de direccionamiento de memoria, hay algunas cosas que debo mencionar: memoria virtual , segmentación y paginación .

Memoria virtual

Como @Daniel R Hicks señaló en otra respuesta, los sistemas operativos usan memoria virtual. Lo que significa es que las aplicaciones en realidad no funcionan en direcciones de memoria real, sino en las proporcionadas por el sistema operativo.

Esta técnica permite que el sistema operativo mueva algunos datos de la RAM a un llamado Pagefile (Windows) o Swap (* NIX). HDD es algunas magnitudes más lento que la RAM, pero no es un problema grave para los datos a los que rara vez se accede y permite que el sistema operativo proporcione a las aplicaciones más RAM de la que realmente ha instalado.

Paginación

Lo que estábamos hablando hasta ahora se llama esquema de direccionamiento plano.

La paginación es un esquema de direccionamiento alternativo que permite direccionar más memoria de la que normalmente podría con una palabra de máquina en modelo plano.

Imagina un libro lleno de palabras de 4 letras. Digamos que hay 1024 números en cada página. Para direccionar un número, debes saber dos cosas:

  • El número de página en la que se imprime esa palabra.
  • Qué palabra en esa página es la que estás buscando.

Ahora así es exactamente como las CPU modernas x86 manejan la memoria. Está dividido en 4 páginas KiB (1024 palabras de máquina cada una) y esas páginas tienen números. (en realidad, las páginas también pueden ser 4 MiB grandes o 2 MiB con PAE ). Cuando desee direccionar la celda de memoria, necesita el número de página y la dirección en esa página. Tenga en cuenta que cada celda de memoria está referenciada por exactamente un par de números, ese no será el caso para la segmentación.

Segmentación

Bueno, este es bastante similar a la paginación. Fue utilizado en Intel 8086, solo por nombrar un ejemplo. Los grupos de direcciones ahora se denominan segmentos de memoria, no páginas. La diferencia es que los segmentos pueden superponerse, y se superponen mucho. Por ejemplo, en 8086, la mayoría de las celdas de memoria estaban disponibles en 4096 segmentos diferentes.


Un ejemplo:

Digamos que tenemos 8 bytes de memoria, todos con ceros, excepto el 4to byte que es igual a 255.

Ilustración para el modelo de memoria plana:

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

Ilustración para memoria paginada con páginas de 4 bytes:

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

Ilustración para memoria segmentada con segmentos de 4 bytes desplazados por 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 puede ver, el 4to byte se puede direccionar de cuatro maneras: (direccionamiento desde 0)

  • Segmento 0, desplazamiento 3
  • Segmento 1, desplazamiento 2
  • Segmento 2, desplazamiento 1
  • Segmento 3, desplazamiento 0

Siempre es la misma celda de memoria.

En las implementaciones de la vida real, los segmentos se desplazan más de 1 byte (para 8086 eran 16 bytes).

Lo malo de la segmentación es que es complicado (pero creo que ya lo sabes;) Lo bueno es que puedes usar algunas técnicas inteligentes para crear programas modulares.

Por ejemplo, puede cargar algún módulo en un segmento, luego pretender que el segmento es más pequeño de lo que realmente es (lo suficientemente pequeño como para sostener el módulo), luego elegir el primer segmento que no se superpone con ese pseudo-más pequeño y cargar el siguiente módulo , y así. Básicamente, lo que obtienes de esta manera son páginas de tamaño variable.

gronostaj
fuente
1
Un sistema operativo puede proporcionar el espacio completo de direcciones virtuales de 4GiB (posiblemente menos una página - 4KiB para x86) al proceso del usuario, pero hace que las llamadas al sistema sean más caras ya que el espacio de direcciones debe cambiarse. Con PAE y mecanismos similares, la cantidad de memoria física que el sistema puede direccionar puede aumentarse aunque las direcciones todavía están limitadas a 32 bits.
Paul A. Clayton
¡No es lo que estaba buscando, pero de todos modos es buena información! Gracias por la buena explicación del máximo. cosa de dígitos (1 = máx. como en binario 9 es máx.) para la comparación de tablas binarias y decimales. Realmente una buena forma de pensar sobre esto. Aprendí algo nuevo. :) ¡Gracias!
johan smohan
Este Gibi y Giga es tan confuso ... Porque en algunos sitios leí que la memoria se mide en Gibi y en otros que está en Giga ... ¿Tiene alguna fuente buena / confiable?
johan smohan
Wikipedia tiene un artículo sobre prefijos binarios, que incluye algunos antecedentes históricos. La mayoría de los números relacionados con el hardware usan prefijos decimales, las excepciones más notables son probablemente la RAM y la escala de colores, por ejemplo. Las pantallas LCD con 16 millones de colores tienen tres canales de color de 8 bits (2 ^ 24). Responda su pregunta directamente: en este caso, el número de direcciones disponibles es igual al número de bytes de memoria, porque la RAM se trata por bytes. La CPU de 32 bits podría manejar hasta 2 ^ 32 B, 64 bits uno - 2 ^ 64.
gronostaj
¡Gracias! Necesito esto para los exámenes escolares. :) Creo que ahora entiendo la mayoría de las cosas. Lo único que todavía me molesta es por qué 2 ^ 32 B, si es un procesador de 32 bits y no un 32byte.
johan smohan
3

Además de lo anterior, tenga en cuenta que se utiliza el direccionamiento virtual , junto con múltiples espacios de direcciones . Entonces, aunque solo tenga 1 GB de RAM, un programa podría utilizar conceptualmente hasta 4 GB de memoria virtual (aunque la mayoría del sistema operativo lo limitará a menos que esto). Y conceptualmente puede tener un número (casi) infinito de dichos espacios de direcciones de 4 GB.

El tamaño de la RAM no restringe (tanto) el tamaño máximo de un programa o la cantidad de programas que puede ejecutar, sino que limita el rendimiento. Cuando la memoria real se "sobre-compromete" y el sistema comienza a "agitarse" a medida que "intercambia" "páginas" de memoria de un lado a otro entre la RAM y el disco, el rendimiento cae en picado.

Daniel R Hicks
fuente
2

El 1GByte de RAM ocuparía 1024 * 1024 * 1024 bytes, o 1,073,741,824 bytes.

Un procesador de 32 bits siempre tiene 4 * 1024 * 1024 * 1024 bytes, o 4,294,967,296 bytes de espacio de direcciones. El 1Gbyte de RAM aparece dentro de este espacio. En los procesadores Intel, es necesario que aparezca algo de RAM en la dirección 0 para los vectores de interrupción, por lo que la RAM física comienza en la dirección 0 y aumenta.

Otras cosas aparecen en ese espacio de direcciones, como BIOS y ROM de opción (en los 384 Kbytes superiores dentro de los primeros 1 Mbyte), dispositivos de E / S (como el APIC) y la RAM de video. Algunas cosas extrañas también suceden con el modo de administración del sistema "SMRAM" que aún no entiendo completamente.

Tenga en cuenta que este es el espacio de direcciones físicas, desde el punto de vista del núcleo. La MMU puede reorganizar todo esto de cualquier manera a un proceso de espacio de usuario.

LawrenceC
fuente
Indiqué en Wikipedia que 1 direcciones de memoria tienen 32 bits de ancho o 4 octetos (1 octeto = 8 bits), en comparación con un procesador de 64 bits donde 1 direcciones de memoria o 1 número entero tienen 64 bits de ancho u 8 octetos. Tiene razón sobre el espacio de dirección de 4 * 1024 * 1024 * 1024 bytes, pero estaba buscando el espacio de dirección de memoria, que creo que es 1 GB / 32 bits, pero todavía no sé si estoy en lo correcto o no. :) ¡Gracias por su respuesta!
johan smohan
Notario público. Las CPU de Intel tienen dos espacios de direcciones: "Memoria" y "E / S". Aparecen otras cosas además de RAM en el espacio "Memoria". Otras cosas, como dispositivos de E / S o ROM, pueden estar en lugares desocupados por RAM. En general, solo los dispositivos de E / S aparecen en el espacio de direcciones de E / S.
LawrenceC
@johansmohan Ni sus números ni la respuesta de Lawrence son correctos. No existe una relación fija entre el "ancho de bits" de un procesador y el ancho de las direcciones RAM que puede usar. Los procesadores x86 de solo 32 bits pueden direccionar 64 GB de RAM. Los procesadores x64 comenzaron en un espacio de direcciones físicas de 40 bits y ahora están en 52 bits. En cuanto al espacio de direcciones virtuales, eso también puede ser diferente. En x64, aunque las direcciones virtuales tardan 64 bits en almacenarse, solo se implementan 48 bits, para un VAS de 256 TiB en lugar de los 16 EiB que esperaría de 64 bits.
Jamie Hanrahan
0

Un procesador de 32 bits puede direccionar como máximo 2 ^ 32 bytes individuales de memoria (aproximadamente 4 GB), pero tener 1 GB de memoria haría 1 * 1024 * 1024 * 1024 bytes de memoria direccionables (aunque probablemente todavía tendría un espacio de dirección virtual 2 ^ 32 ) Una CPU de 64 bits podría direccionar 2 ^ 64 bytes individuales, pero creo que la mayoría de los sistemas usan solo 48 bits para las direcciones de memoria que hacen el límite superior. bytes direccionables 2 ^ 48.

Ácido
fuente
Querías decir 1024 * 1024 * 1024 y no 1 * 1024 * 1024 ¿verdad?
johan smohan
¿Un procesador de 32 bits puede direccionar como máximo 2 ^ 32 octetos o bits? Solo comprobando, porque debo saberlo con seguridad.
johan smohan
@johan smohan Correcto, debería haber sido 1 * 1024 * 1024 * 1024
AcId
@johan smohan Un procesador de 32 bits puede direccionar como máximo 2 ^ 32 bytes, con un byte de 8 bits (un octeto t de bits)
AcId
0

La respuesta aceptada da una buena explicación. Pero no creo que sea la respuesta. No contiene nada sobre el bus de direcciones . Y su tamaño es en realidad la razón principal de las restricciones de memoria. Por ejemplo, 8080 es un procesador de 8 bits (el tamaño de su bus de datos es de 8 bits), pero tiene un bus de direcciones de 16 bits. Puede abordar 2 ^ 16 = (2 ^ 6) * (2 ^ 10) = 64 * 1024 bytes = 64 KB.

Puede encontrar más aquí (32 bits) en la sección "Historial técnico".

Dmitriy Dokshin
fuente
Estoy de acuerdo. Tenga en cuenta que los modelos posteriores del PDP-11 de 16 bits tenían un bus de direcciones de 22 bits (y por lo tanto podían abordar 4 MB de RAM), el HP 1000MX, también "16 bits", finalmente alcanzó 16 MB de RAM (24 direcciones de bits); el VAX era una CPU de 32 bits pero tenía un espacio de direcciones físicas de 30 bits, pero la mitad estaba reservada para el espacio de E / S, para un límite de RAM de 512 MB; el "16 bits" 8086, 1 MB; el "16 bits" 80286, 16 MB; etc. Y cuando se introdujo PAE con el Pentium Pro, el x86 de 32 bits podía direccionar hasta 64 GB de RAM (espacio de direcciones físicas de 24 bits, aunque los tres bits de orden inferior nunca salen de la CPU).
Jamie Hanrahan
-2

Creo que la información más básica se pierde en esta conversación, así que aquí está mi respuesta:

Decir "Esto es un procesador de 32 bits" significa que el tamaño de la instrucción, o el tamaño del comando, que la CPU puede entender y trabajar al mismo tiempo es de 32 bits. Del mismo modo con procesadores de 64 bits: pueden manejar instrucciones de 64 bits como máximo.

Piense en esto como una vieja calculadora mecánica: solo tiene tantos dígitos, por lo que simplemente no puede ingresar ningún número más.

Ahora, una dirección que una CPU puede usar también tiene que encajar en ese mismo espacio, por lo que para un procesador de 32 bits, la dirección que usa también puede ser solo de 32 bits. Entonces, desde aquí podemos simplemente calcular el número máximo de direcciones (es decir, la cantidad máxima de RAM que puede usar la CPU):

2 ^ 32 = 4294967296 (= 4 GB)

o

2 ^ 64 = 18446744073709551616 (= mucho más;)

O, como ejemplo divertido, mi viejo Commodore 64 tenía una CPU de 16 bits, por lo que era capaz de administrar una memoria de:

2 ^ 16 = 65536 bytes (= 64 KB)

Esta es la lógica básica, pero, como se dijo anteriormente, hay formas de evitar esta limitación, como espacios de direcciones virtuales, mapeo de memoria, etc.

Tuncay Göncüoğlu
fuente
2
La diferencia significativa entre los procesadores de 32 y 64 bits es el rango de direcciones (que afecta el espacio de direcciones virtuales más que "real"). Los procesadores usan tantos trucos que, en muchos casos, es difícil decir cuál es el ancho real de la ruta de datos. Y la longitud de la instrucción no está relacionada en gran medida con el "ancho" del procesador.
Daniel R Hicks
La explicación es perfectamente correcta. Suponiendo que no se refiere a la dimensión real del chip en centímetros al decir "ancho del procesador", en cuyo caso sería correcto decir que no está relacionado, está confundiendo las técnicas de mapeo de memoria / espacios de direcciones virtuales con el direccionamiento de memoria física. Además, lo que usted dice está más relacionado con las implementaciones de kernel, es posible que desee verificar los kernels de PAE Linux.
Tuncay Göncüoğlu
2
La longitud de una instrucción no tiene ninguna relación con el "ancho" del procesador en los sistemas modernos. Los valores más relevantes son el ancho de los registros (aunque eso puede ser engañoso), el ancho de la ruta de transferencia entre el procesador y la memoria, y el tamaño en bits de una dirección de memoria. Pero estos 3 valores pueden ser muy diferentes entre sí.
Daniel R Hicks
1
@DanielRHicks Daniel Hicks está en lo correcto. El "ancho de bits" de la CPU no necesariamente tiene nada que ver con el "tamaño de la instrucción o el tamaño del comando". Hubo CPU que se construyeron de esa manera, pero los procesadores de productos básicos de hoy (x86 / x64) no se encuentran entre ellos.
Jamie Hanrahan