20Aug
Somedays es divertido mirar el nivel superficial de la experiencia informática, y otros días es divertido profundizar en el funcionamiento interno. Hoy estamos observando la estructura de la memoria de la computadora y la cantidad de material que puede empacar en una memoria RAM.
Pregunta de hoy &La sesión de respuesta nos llega por cortesía de SuperUser, una subdivisión de Stack Exchange, una agrupación de sitios web Q & A dirigida por la comunidad.
El lector de SuperUser
de preguntas, Johan Smohan, está lidiando con la forma en que el tipo de procesador y el tamaño de la memoria funcionan en conjunto para producir un número total de direcciones.Él escribe:
¿Cuántas direcciones de memoria podemos obtener con un procesador de 32 bits y 1 GB de RAM y cuántos con un procesador de 64 bits?
Creo que es algo como esto:
de 1 GB de RAM dividido por 32 bits de 4 bits( ?) Para obtener el número de direcciones de memoria.
Leo en Wikipedia que 1 dirección de memoria tiene 32 bits de ancho o 4 octetos( 1 octeto = 8 bits), en comparación con un procesador de 64 bits donde 1 dirección de memoria o 1 entero tiene 64 bits de ancho u 8 octetos. Pero no sé si lo entendí correctamente tampoco.
Estos son los tipos de preguntas que pueden mantener despierto a un curioso geek por la noche.¿Cuántas direcciones están disponibles bajo cada uno de los sistemas hipotéticos de Johan?
La respuesta
SuperUser contribuidor Gronostaj ofrece una idea de cómo se divide y utiliza la memoria RAM:
Respuesta corta: El número de direcciones disponibles es igual al menor de ellos:
- Tamaño de memoria en bytes
- El mayor entero sin signo que se puede guardaren la palabra de máquina de la CPU
Respuesta larga y explicación de lo anterior: La memoria de
está formada por bytes( B).Cada byte consta de 8 bits( b).
1 B = 8 b1 GB de RAM es actualmente 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 BCada byte de memoria tiene su propia dirección, sin importar 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 los 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 tiene que 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í sucesivamente. ..)
- Para acceder alúltimo byte, la CPU omite 1073741823 bytes, por lo que su dirección es 1073741823.
Ahora debe saber qué significa en realidad 32 bits. Como mencioné antes, es del tamaño de una palabra de máquina.
Palabra de 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 la 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 tiene cuatro valores: 0, 1, 2, 3. En tres bits, puede guardar ochovalores: 0, 1, 2. .. 6, 7. Esto es en realidad 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 111011 12 1100 13 1101 14 1110 15 1111Funciona exactamente como la adición habitual, pero el dígito máximo es 1, no 9. El decimal 0 es 0000, luego se agrega 1 y se obtiene 0001, se agrega uno una vez más y se tiene 0010. Quésuceder aquí es como tener el decimal 09 y agregar uno: cambias 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 los usuarios como para los desarrolladores.
11111111 = 255 + 1 ----------- 100000000 = 0( 9 bits aquí, por lo que se recorta 1)- 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. Es por eso que el tamaño de la palabra de la 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 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. 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 la CPU de 32 bits es teóricamente de 4 GB( 2 ^ 32) y para la CPU de 64 bits es de 16 EB( exabytes, 1 EB = 2 ^ 30 GB).En otras palabras, la CPU de 64 bits podría abordar toda Internet. .. 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.Eso 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 elevar este límite con Extensión de dirección física.
Hablando de direccionamiento de memoria, hay algunas cosas que debería 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 operan 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 los llamados archivos de páginas( Windows) o Swap( * NIX).La HDD es pocas veces más lenta que la RAM, pero no es un problema grave para los datos a los que se accede con poca frecuencia y permite que el sistema operativo proporcione a las aplicaciones más RAM de la que realmente tiene instalada.
Paginación
Lo que estábamos hablando hasta ahora se llama esquema de direccionamiento plano.
Paging es un esquema de direccionamiento alternativo que permite direccionar más memoria que normalmente con una palabra de máquina en modelo plano.
Imagine un libro lleno de palabras de 4 letras. Digamos que hay 1024 números en cada página. Para abordar un número, debe 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á buscando.
Ahora, así es exactamente como las CPU modernas x86 manejan la memoria. Está dividido en 4 páginas KiB( 1024 palabras máquina cada una) y esas páginas tienen números.(en realidad las páginas también pueden ser 4 MiB grande 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 se referencia exactamente por un par de números, que no será el caso para la segmentación.
Segmentación
Bueno, este es bastante similar a la paginación. Se usó en Intel 8086, solo para nombrar un ejemplo. Los grupos de direcciones ahora se llaman segmentos de memoria, no páginas. La diferencia es que los segmentos se pueden superponer, 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 manteniendo 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 la memoria paginada con páginas de 4 bytes:
PAGE0 _____ |0 ||0 ||0 |PÁGINA1 |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 abordar de cuatro maneras:( direccionamiento desde 0)
- Segmento 0, desplazamiento 3
- Segmento 1,offset 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 en más de 1 byte( para 8086 era 16 bytes).
Lo malo de la segmentación es que es complicado( pero creo que ya lo sabes;) Lo que es 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 contener el módulo), luego elegir el primer segmento que no se superpone con ese pseudo más pequeño y cargarpróximo módulo, y así sucesivamente. Básicamente, lo que obtienes de esta manera son páginas de tamaño variable.
¿Tiene algo que agregar a la explicación? Suena apagado en los comentarios.¿Desea leer más respuestas de otros usuarios de Stack Exchange expertos en tecnología? Mira el hilo de discusión completo aquí.