¿Cuántas direcciones de memoria puede contener la RAM de mi computadora?

¿Cuántas direcciones de memoria puede contener la RAM de mi computadora?

A veces es divertido observar el nivel superficial de la experiencia informática, y otros días es divertido sumergirse directamente en el funcionamiento interno. Hoy echamos un vistazo a la estructura de la memoria de la computadora y la cantidad de cosas que puede empacar en una memoria RAM.

SuperUser, una subdivisión de Stack Exchange, una agrupación comunitaria de sitios web de preguntas y respuestas, nos ofrece la sesión de preguntas y respuestas de hoy.

La unidad Johan Smohan SuperUser se enfrenta a cómo el tipo de procesador y el tamaño de la memoria trabajan juntos para generar una cantidad total de direcciones. Escribe:

Este es el tipo de preguntas que pueden mantener despierto a un geek curioso por la noche. ¿Cuántas direcciones hay disponibles en cada uno de los sistemas hipotéticos de Johan?

El colaborador de superusuario Gronostaj ofrece información sobre cómo se divide y utiliza la RAM:

Respuesta corta: El número de direcciones disponibles es igual a la más pequeña de estas:

  • Tamaño de la memoria en bytes
  • Entero sin signo más grande que se puede almacenar en la palabra de 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, independientemente del tamaño de la palabra de máquina de la CPU. Por ejemplo. El procesador Intel 8086 era de 16 bits y se dirigía a la memoria por bytes, al igual que los procesadores modernos de 32 y 64 bits. Esta 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 principio de la memoria para llegar al 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.
  • (y así enseguida…)
  • Para acceder al último byte, la CPU omite 1073741823 bytes, por lo que su dirección es 1073741823.

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

La palabra de la máquina es la cantidad de memoria utilizada por el procesador para almacenar los números (en RAM, caché o registros internos). El procesador de 32 bits utiliza 32 bits (4 bytes) para contener los números. Las direcciones de memoria también son números, por lo que en un procesador de 32 bits, la dirección de memoria consta de 32 bits.

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

Binary  Decimal
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

Esto funciona como la suma habitual, pero el dígito máximo es 1, no 9. El decimal 0 es 0000, luego agregas 1 y obtienes 0001, agrega uno de nuevo y tienes 0010. Lo que pasó aquí es como tener un número decimal. 09 y sumando 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 y está tratando de aumentar el valor de 1, todos los bits serán se convierte en 0, rompiendo así el número. Esto se llama desbordamiento de enteros y causa muchos problemas desagradables, tanto para los usuarios como para los desarrolladores.

   11111111    = 255
+         1
-----------
  100000000    = 0   (9 bits here, so 1 is trimmed)
  • Para 1 bit, el valor más grande 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. Esta es la razón por la que el tamaño de la palabra de la máquina también es un límite en la cantidad de direcciones de memoria disponibles; a veces, su CPU simplemente no puede procesar números lo suficientemente grandes como para ocupar más memoria.

Entonces, en 32 bits puede mantener números de 0 a 2 ^ 32-1, y eso es 4.294.967.295. Esto es más que la dirección más grande 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 el procesador de 32 bits es teóricamente de 4 GB (2 ^ 32) y para el procesador de 64 bits es de 16 EB (exabytes, 1 EB = 2 ^ 30 GB). En otras palabras, un procesador de 64 bits podría abordar toda Internet … 200 veces;) (estimado porWolfram Alpha).

Sin embargo, en los sistemas operativos reales, los procesadores de 32 bits pueden manejar alrededor de 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 este llamado Barrera de 3 GB en Wikipedia. Puedes levantar este límite con Extensión de dirección física.

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

Memoria virtual

Como señaló @Daniel R Hicks en otra respuesta, los sistemas operativos usan memoria virtual. Esto significa que las aplicaciones no se ejecutan en direcciones de memoria reales, 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). El disco duro es un poco más lento que la RAM, pero eso no es un problema grave para los datos a los que se accede con poca frecuencia, y permite que el sistema operativo proporcione aplicaciones con más RAM de la que realmente tiene instalada.

Paginación

De 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 se haría con una palabra de máquina en un patrón plano.

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

  • El número de páginas en las que está impresa esta palabra.
  • ¿Qué palabra de esta página es la que está buscando?

Así es exactamente como gestionan la memoria los procesadores x86 modernos. Está dividido en páginas de 4 KB (1024 palabras de máquina cada una) y estas páginas tienen números. (de hecho, las páginas también pueden tener 4 MiB o 2 MiB con EAP). Cuando desee direccionar una 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 exactamente por un par de números, este no será el caso de la segmentación.

Segmentación

Bueno, este es bastante similar a la paginación. Se usó en Intel 8086, por nombrar solo 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, de 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 los cuales contienen ceros excepto el cuarto 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 en 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 cuarto byte se puede direccionar de cuatro formas: (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 reales, los segmentos están compensados ​​por más de un byte (para el 8086, esto era 16 bytes).

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

Por ejemplo, puede cargar un módulo en un segmento, luego pretender que el segmento es más pequeño de lo que realmente es (lo suficientemente pequeño para sostener el módulo), luego elegir el primer segmento que no se superpone a ese pseudo-más pequeño y luego cargar el módulo , etcétera. Básicamente, lo que obtienes de esta manera son páginas de diferentes tamaños.

¿Tiene algo que agregar a la explicación? Habla en los comentarios. ¿Quiere leer más respuestas de otros usuarios expertos en tecnología de Stack Exchange? Consulte el hilo de discusión completo aquí..

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Experto Geek - Tu Guía en Tendencias Tecnológicas