8.1 Memoria RAM
La memoria RAM (Random Access Memory) del ordenador es un conjunto de celdas de memoria, cada una con una dirección única. Estas celdas pueden almacenar distintos tipos de datos, como números, caracteres y punteros. Cuando un programa se ejecuta, almacena sus datos e instrucciones en esta memoria para un acceso rápido.
Ejemplo de celdas de memoria:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 |
50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 |
60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 |
70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 |
Cada celda tiene su número de orden, también llamado dirección de la celda en la memoria o simplemente dirección. Si tu ordenador tiene 8 GB de memoria, tiene 8 mil millones de estas celdas donde puedes almacenar algo útil.
Bits y Bytes
Cada celda puede almacenar un byte de información. Cada byte consta de 8 bits, y cada bit puede contener solo 0 o 1. Ejemplo (para números enteros positivos):
Número | Representación en bits | Redondeado al byte |
---|---|---|
0 | 0 | 00000000 |
1 | 1 | 00000001 |
100 | 1100100 | 01100100 |
1000 | 1111101000 | 00000011-11101000 |
1000 000 000 | 111011100110101100101000000000 | 00111011-10011010-11001010-00000000 |
Cuantos más bytes ocupa una variable, más valores puede almacenar. Ejemplo:
- 1 byte — 256 valores únicos
- 2 bytes — 65 mil valores únicos
- 3 bytes — 16 millones
- 4 bytes — 4 mil millones
8.2 Cómo se representan los datos en la memoria
Tipos de datos y su representación
Datos numéricos dentro del procesador y en la memoria
- Números enteros: se almacenan en forma binaria. El tamaño puede variar (1 byte, 2 bytes, 4 bytes).
- Números de punto flotante: se almacenan en formato de punto flotante (por ejemplo, el formato IEEE 754 para números de 4 bytes y 8 bytes).
x = 42 # Número entero
y = 3.14 # Número de punto flotante
¡Importante! En Python, los tipos integrados int
y float
son clases completas que pueden realizar cálculos complejos con números de longitud infinita. Sin embargo, si usas bibliotecas para cálculos científicos o IA, te encontrarás con el formato de datos del que he hablado antes.
Datos de caracteres en la memoria del ordenador
Los caracteres y las cadenas se almacenan en la memoria como secuencias de bytes. Por ejemplo, en la codificación ASCII
, cada carácter ocupa 1 byte, mientras que en la codificación UTF-8
puede ocupar de 1 a 4 bytes.
En Python 3.x, de forma predeterminada, se utiliza la codificación UTF-8
para las cadenas, pero puedes leer archivos donde el texto se almacena en otros formatos o enviar datos por red en una codificación diferente a UTF-8
.
Ejemplo:
char = 'A' # Carácter
string = "Hello, world!" # Cadena
Los caracteres individuales en Python no tienen su propio tipo: también se utiliza el tipo str
. Sin embargo, en la memoria, estas cadenas se almacenan por carácter. Un carácter generalmente ocupa de 1 a 4 bytes.
Punteros
Los punteros almacenan direcciones de otras celdas de memoria
. Permiten que los programas trabajen con estructuras de datos dinámicas y gestionen la memoria de manera más efectiva.
Ejemplo:
list = [1, 2, 3, 4] # Lista
list_pointer = id(list) # Puntero al inicio de la lista
8.3 Ejemplos de representación de datos en la memoria RAM
1. Representación de números enteros
Los números enteros se almacenan en la memoria como números binarios (bits). Dependiendo del tipo de datos, pueden ocupar diferentes cantidades de bytes. Por ejemplo, int
generalmente ocupa 4 bytes (32 bits).
Así es como se representará el número 42 en la memoria:
00000000 | 00000000 | 00000000 | 00101010 |
2. Representación de números de punto flotante
Los números de punto flotante (por ejemplo, tipo float) se almacenan en la memoria en formato de punto flotante, usualmente bajo el estándar IEEE 754
. float
generalmente ocupa 4 bytes (32 bits) y double
— 8 bytes (64 bits).
¡Importante! Estos son tipos de datos estándar vinculados a la memoria y al procesador. El tipo float
en Python corresponde al tipo común double
y ocupa 8 bytes.
Así es como se representará el número 3.14 en la memoria:
01000000 | 01001000 | 11110110 | 01100110 |
3. Representación de caracteres y cadenas
Los caracteres (por ejemplo, tipo char) se almacenan en la memoria como secuencias de bytes. Las cadenas son arrays de caracteres. En los lenguajes C/C++, las cadenas terminan con un byte nulo (\0), pero en Python esto no ocurre.
Así es como se representará la cadena Hello
en la memoria:
'H' | 'e' | 'l' | 'l' | 'o' |
Lo cual, a su vez, se representa en ceros y unos:
01001000 | 01100101 | 01101100 | 01101100 | 01101111 |
8.4 Direccionamiento de memoria dinámica
La memoria dinámica se asigna y libera durante la ejecución del programa, según sea necesario. Todos los objetos que creas en Python se crean en esta memoria.
Se divide en 2 tipos:
Heap: Área de memoria desde la cual se asignan objetos dinámicos. Esta memoria se gestiona a través de funciones de asignación (por ejemplo, malloc en C) y liberación (por ejemplo, free en C).
Stack: Área de memoria utilizada para almacenar variables locales y datos de llamadas a funciones. La memoria se asigna y libera automáticamente al entrar y salir de una función.
Nuevamente, no puedo mostrar un ejemplo en el lenguaje Python, ya que es demasiado de alto nivel para tales acciones. Puedo dar un ejemplo en el lenguaje C:
// Asignación dinámica de memoria para un array de 10 enteros
int *dynamic_var = (int *)malloc(sizeof(int) * 10);
// Liberación de la memoria
free(dynamic_var);
Direccionamiento de memoria — es el proceso de determinar una dirección única para cada celda de memoria. Cada dirección indica una ubicación específica en la memoria que puede contener datos o instrucciones.
Tipos de direccionamiento
Direccionamiento físico: acceso directo a direcciones físicas de celdas de memoria. Gestionado por hardware (por ejemplo, el controlador de memoria).
Direccionamiento virtual: utiliza un mecanismo de gestión de memoria, como la memoria paginada o segmentada, para proporcionar a los procesos un espacio de direcciones aislado y protegido.
GO TO FULL VERSION