8.1 Mémoire vive
La mémoire vive (RAM, ОЗУ) de l'ordinateur est un tableau de cellules mémoire, chacune ayant une adresse unique. Ces cellules peuvent stocker des données de types différents, comme des nombres, des caractères et des pointeurs. Lorsqu'un programme s'exécute, il place ses données et instructions dans cette mémoire pour un accès rapide.
Exemple de cellules mémoire :
| 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 |
Chaque cellule a son numéro d'ordre, également appelé adresse de la cellule en mémoire ou simplement adresse. Si votre ordinateur dispose de 8 Go de mémoire, il possède 8 milliards de ces cellules où l'on peut stocker quelque chose d'utile.
Bits et octets
Chaque cellule peut stocker un octet d'information. Chaque octet est composé de 8 bits, et chaque bit peut contenir seulement 0 ou 1. Exemple (pour les entiers positifs) :
| Nombre | Représentation binaire | Arrondi à l'octet |
|---|---|---|
| 0 | 0 | 00000000 |
| 1 | 1 | 00000001 |
| 100 | 1100100 | 01100100 |
| 1000 | 1111101000 | 00000011-11101000 |
| 1000 000 000 | 111011100110101100101000000000 | 00111011-10011010-11001010-00000000 |
Plus une variable occupe d'octets, plus elle peut stocker de valeurs. Exemple :
- 1 octet — 256 valeurs uniques
- 2 octets — 65 mille valeurs uniques
- 3 octets — 16 millions
- 4 octets — 4 milliards
8.2 Comment les données sont représentées en mémoire
Types de données et leur représentation
Données numériques à l'intérieur du processeur et en mémoire
- Nombres entiers : stockés sous forme binaire. La taille peut varier (1 octet, 2 octets, 4 octets).
- Nombres réels : stockés au format à virgule flottante (par exemple, format IEEE 754 pour les nombres de 4 octets et 8 octets).
x = 42 # Nombre entier
y = 3.14 # Nombre réel
Important ! En Python, les types intégrés int et float sont des classes complètes capables d'effectuer des calculs complexes avec des nombres de longueur infinie. Cependant, si vous utilisez des bibliothèques pour le calcul scientifique ou l'IA, vous rencontrerez le format de données dont j'ai parlé ci-dessus.
Données de caractères en mémoire de l'ordinateur
Les symboles et les chaînes sont stockés en mémoire sous forme de séquences d'octets. Par exemple, dans l'encodage ASCII, chaque symbole occupe 1 octet, dans l'encodage UTF-8 peut occuper de 1 à 4 octets.
En Python 3.x, par défaut, l'encodage UTF-8 est utilisé pour les chaînes, mais vous pouvez lire des fichiers où le texte est stocké dans d'autres formats, ou transmettre des données sur le réseau dans un encodage autre que UTF-8.
Exemple :
char = 'A' # Symbole
string = "Hello, world!" # Chaîne
Les symboles individuels en Python n'ont pas de type propre - le type str est également utilisé pour eux. Cependant, en mémoire, ces chaînes sont stockées par caractères. Un symbole occupe généralement 1—4 octets.
Pointeurs
Les pointeurs stockent les adresses d'autres cellules mémoire. Ils permettent aux programmes de travailler avec des structures de données dynamiques et de gérer la mémoire plus efficacement.
Exemple :
list = [1, 2, 3, 4] # Liste
list_pointer = id(list) # Pointeur vers le début de la liste
8.3 Exemples de représentation des données en mémoire vive
1. Représentation des nombres entiers
Les nombres entiers sont stockés en mémoire sous forme de nombres binaires (bits). Selon le type de données, ils peuvent occuper différentes quantités d'octets. Par exemple, int occupe généralement 4 octets (32 bits).
Voici comment le nombre 42 sera représenté en mémoire :
| 00000000 | 00000000 | 00000000 | 00101010 |
2. Représentation des nombres réels (à virgule flottante)
Les nombres réels (par exemple, le type float) sont stockés en mémoire au format à virgule flottante, généralement selon la norme IEEE 754. float occupe généralement 4 octets (32 bits), et double — 8 octets (64 bits).
Important ! Ce sont des types de données standard, liés à la mémoire et au processeur. Le type float en Python correspond au type double couramment utilisé et occupe 8 octets.
Voici comment le nombre 3.14 sera représenté en mémoire :
| 01000000 | 01001000 | 11110110 | 01100110 |
3. Représentation des symboles et des chaînes
Les symboles (par exemple, le type char) sont stockés en mémoire sous forme de séquence d'octets. Les chaînes sont des tableaux de symboles. Dans les langages C/C++, les chaînes se terminent par un nul byte (\0), mais en Python ce n'est pas le cas.
Voici comment la chaîne Hello sera représentée en mémoire :
| 'H' | 'e' | 'l' | 'l' | 'o' |
Ce qui, à son tour, sera représenté en tant que 0 et 1 :
| 01001000 | 01100101 | 01101100 | 01101100 | 01101111 |
8.4 Adressage de la mémoire dynamique
La mémoire dynamique est allouée et libérée pendant l'exécution du programme, selon les besoins. Tous les objets que vous créez en Python sont créés dans cette mémoire.
Elle se divise en 2 types :
Heap : Zone de mémoire à partir de laquelle sont alloués les objets dynamiques. La gestion de cette mémoire est effectuée par des fonctions d'allocation (par exemple, malloc en C) et de libération (par exemple, free en C).
Stack : Zone de mémoire utilisée pour stocker les variables locales et les données d'appel de fonctions. La mémoire est automatiquement allouée et libérée lors de l'entrée et de la sortie d'une fonction.
Encore une fois, je ne peux pas donner un exemple en Python, car il est trop haut niveau pour de telles opérations. Je peux donner un exemple en langage C :
// Allocation dynamique de mémoire pour un tableau de 10 entiers
int *dynamic_var = (int *)malloc(sizeof(int) * 10);
// Libération de la mémoire
free(dynamic_var);
L'adressage de la mémoire est le processus de détermination d'une adresse unique pour chaque cellule mémoire. Chaque adresse indique un emplacement spécifique en mémoire qui peut contenir des données ou des instructions.
Types d'adressage
Adressage physique : accès direct aux adresses physiques des cellules mémoire. Géré par le matériel (par exemple, le contrôleur mémoire).
Adressage virtuel : utilise un mécanisme de gestion de la mémoire, tel que la mémoire paginée ou la mémoire segmentée, pour fournir aux processus un espace d'adresses isolé et protégé.
GO TO FULL VERSION