8.1 Memoria RAM
RAM (Memoria ad accesso casuale, RAM) del computer è un array di celle di memoria, ognuna con un indirizzo unico. Queste celle possono contenere dati di vario tipo, come numeri, simboli e puntatori. Quando un programma è in esecuzione, colloca i suoi dati e istruzioni in questa memoria per un accesso rapido.
Esempio di celle di 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 |
Ogni cella ha il suo numero d'ordine, che viene anche chiamato indirizzo della cella in memoria o semplicemente indirizzo. Se il tuo computer ha 8 GB di memoria, allora ha 8 miliardi di tali celle in cui puoi memorizzare qualcosa di utile.
Bit e byte
Ogni cella può contenere un byte di informazione. Ogni byte è composto da 8 bit, e ogni bit può contenere solo 0 o 1. Esempio (per numeri interi positivi):
Numero | Rappresentazione in bit | Arrotondato al byte |
---|---|---|
0 | 0 | 00000000 |
1 | 1 | 00000001 |
100 | 1100100 | 01100100 |
1000 | 1111101000 | 00000011-11101000 |
1000 000 000 | 111011100110101100101000000000 | 00111011-10011010-11001010-00000000 |
Più byte occupa una variabile, più valori può contenere. Esempio:
- 1 byte — 256 valori unici
- 2 byte — 65 mila valori unici
- 3 byte — 16 milioni
- 4 byte — 4 miliardi
8.2 Come i dati sono rappresentati in memoria
Tipi di dati e loro rappresentazione
Dati numerici all'interno del processore e in memoria
- Numeri interi: memorizzati in forma binaria. La dimensione può variare (1 byte, 2 byte, 4 byte).
- Numeri reali: memorizzati in formato floating-point (ad esempio, formato IEEE 754 per numeri a 4-byte e 8-byte).
x = 42 # Numero intero
y = 3.14 # Numero reale
Importante! In Python i tipi incorporati int
e float
sono vere e proprie classi che possono realizzare calcoli complessi con numeri di lunghezza infinita. Tuttavia, se utilizzi librerie per il calcolo scientifico o AI, ti imbatterai nel formato di dati di cui ho parlato sopra.
Dati simbolici nella memoria del computer
Simboli e stringhe sono memorizzati in memoria come sequenze di byte. Ad esempio, nella codifica ASCII
ogni simbolo occupa 1 byte, mentre nella codifica UTF-8
può occupare da 1 a 4 byte.
In Python 3.x, di default per le stringhe viene utilizzata la codifica UTF-8
, ma puoi leggere file dove il testo è memorizzato in altri formati, o inviare dati tramite rete non in codifica UTF-8
.
Esempio:
char = 'A' # Simbolo
string = "Hello, world!" # Stringa
I singoli simboli in Python non hanno un tipo proprio — si utilizza per loro anche il tipo str
. Tuttavia, in memoria queste stringhe sono memorizzate simbolo per simbolo. Un simbolo solitamente occupa 1—4 byte.
Puntatori
I puntatori memorizzano indirizzi di altre celle di memoria
. Permettono ai programmi di lavorare con strutture dati dinamiche e gestire la memoria in modo più efficiente.
Esempio:
list = [1, 2, 3, 4] # Lista
list_pointer = id(list) # Puntatore all'inizio della lista
8.3 Esempi di rappresentazione dei dati nella memoria RAM
1. Rappresentazione dei numeri interi
I numeri interi sono memorizzati in memoria come numeri binari (bit). A seconda del tipo di dati, possono occupare diverse quantità di byte. Ad esempio, int
occupa solitamente 4 byte (32 bit).
Così sarà rappresentato il numero 42 in memoria:
00000000 | 00000000 | 00000000 | 00101010 |
2. Rappresentazione dei numeri reali (floating-point)
I numeri reali (ad esempio, tipo float) sono memorizzati in memoria in formato floating-point, di solito secondo lo standard IEEE 754
. float
occupa solitamente 4 byte (32 bit), mentre double
— 8 byte (64 bit).
Importante! Questi sono tipi di dati standard, legati alla memoria e al processore. Il tipo float
in Python corrisponde al tipo comunemente usato double
e occupa 8 byte.
Così sarà rappresentato il numero 3.14 in memoria:
01000000 | 01001000 | 11110110 | 01100110 |
3. Rappresentazione dei simboli e delle stringhe
I simboli (ad esempio, tipo char) sono memorizzati in memoria come sequenza di byte. Le stringhe rappresentano un array di simboli. Nei linguaggi C/C++ le stringhe terminano con un byte nullo (\0), ma in Python non è così.
Così sarà rappresentata la stringa Hello
in memoria:
'H' | 'e' | 'l' | 'l' | 'o' |
Che a sua volta sarà rappresentato in forma di 0 e 1:
01001000 | 01100101 | 01101100 | 01101100 | 01101111 |
8.4 Indirizzamento della memoria dinamica
La memoria dinamica viene assegnata e liberata durante l'esecuzione del programma, secondo necessità. Tutti gli oggetti che crei in Python sono creati in questa memoria.
È divisa in 2 tipi:
Heap: Area di memoria da cui vengono allocati oggetti dinamici. La gestione di questa memoria viene effettuata tramite funzioni di allocazione (ad esempio, malloc in C) e deallocazione (ad esempio, free in C).
Stack: Area di memoria utilizzata per memorizzare variabili locali e dati di chiamata delle funzioni. La memoria viene automaticamente allocata e liberata all'ingresso e all'uscita della funzione.
Di nuovo, non posso fornire un esempio in linguaggio Python, poiché è troppo ad alto livello per tali operazioni. Posso di nuovo dare un esempio in linguaggio C:
// Allocazione dinamica della memoria per un array di 10 numeri interi
int *dynamic_var = (int *)malloc(sizeof(int) * 10);
// Liberazione della memoria
free(dynamic_var);
Indirizzamento della memoria — è il processo di determinazione di un indirizzo unico per ogni cella di memoria. Ogni indirizzo definisce una posizione specifica nella memoria, che può contenere dati o istruzioni.
Tipi di indirizzamento
Indirizzamento fisico: accesso diretto agli indirizzi fisici delle celle di memoria. È controllato dall'hardware (ad esempio, il controller di memoria).
Indirizzamento virtuale: utilizza un meccanismo di gestione della memoria, come la memoria paginata o segmentata, per fornire ai processi uno spazio di indirizzi isolato e protetto.
GO TO FULL VERSION