Réponse courte: Le nombre d'adresses disponibles est égal au plus petit de ceux-ci:
- Taille de la mémoire en octets
- Le plus grand entier non signé qui peut être enregistré dans le mot machine du CPU
Réponse longue et explication de ce qui précède:
La mémoire se compose d'octets (B). Chaque octet est composé de 8 bits (b).
1 B = 8 b
1 Go de RAM équivaut en fait à 1 Gio (gibibyte, pas gigaoctet). La différence est:
1 GB = 10^9 B = 1 000 000 000 B
1 GiB = 2^30 B = 1 073 741 824 B
Chaque octet de mémoire a sa propre adresse, quelle que soit la taille du mot machine CPU. Par exemple. Le processeur Intel 8086 était de 16 bits et adressait la mémoire par octets, tout comme les processeurs modernes 32 bits et 64 bits. C'est la cause de la première limite - vous ne pouvez pas avoir plus d'adresses que d'octets de mémoire.
L'adresse mémoire n'est qu'un nombre d'octets que le processeur doit ignorer depuis le début de la mémoire pour arriver à celle qu'il recherche.
- Pour accéder au premier octet, il doit sauter 0 octet, donc l'adresse du premier octet est 0.
- Pour accéder au deuxième octet, il doit sauter 1 octet, donc son adresse est 1.
- (et ainsi de suite...)
- Pour accéder au dernier octet, le processeur ignore 1073741823 octets, son adresse est donc 1073741823.
Maintenant, vous devez savoir ce que signifie réellement 32 bits. Comme je l'ai mentionné précédemment, c'est la taille d'un mot machine.
Le mot machine est la quantité de mémoire utilisée par le CPU pour contenir des nombres (dans la RAM, le cache ou les registres internes). Le processeur 32 bits utilise 32 bits (4 octets) pour contenir les nombres. Les adresses mémoire sont également des nombres, donc sur un processeur 32 bits, l'adresse mémoire se compose de 32 bits.
Pensez maintenant à ceci: si vous avez un bit, vous pouvez y enregistrer deux valeurs: 0 ou 1. Ajoutez un bit de plus et vous avez quatre valeurs: 0, 1, 2, 3. Sur trois bits, vous pouvez enregistrer huit valeurs : 0, 1, 2 ... 6, 7. Il s'agit en fait d'un système binaire et il fonctionne comme ça:
Decimal Binary
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
Cela fonctionne exactement comme l'addition habituelle, mais le chiffre maximum est 1, pas 9. Le nombre décimal 0 est 0000
, puis vous ajoutez 1 et obtenez 0001
, ajoutez à nouveau un et vous avez 0010
. Ce qui se passe ici, c'est comme avoir une décimale 09
et en ajouter une: vous changez 9 en 0 et incrémentez le chiffre suivant.
Dans l'exemple ci-dessus, vous pouvez voir qu'il y a toujours une valeur maximale que vous pouvez conserver dans un nombre avec un nombre constant de bits - parce que lorsque tous les bits sont à 1 et que vous essayez d'augmenter la valeur de 1, tous les bits deviennent 0, cassant ainsi le nombre. Cela s'appelle un débordement d'entier et provoque de nombreux problèmes désagréables, à la fois pour les utilisateurs et les développeurs.
11111111 = 255
+ 1
-----------
100000000 = 0 (9 bits here, so 1 is trimmed)
- Pour 1 bit, la plus grande valeur est 1,
- 2 bits - 3,
- 3 bits - 7,
- 4 bits - 15
Le plus grand nombre possible est toujours 2 ^ N-1, où N est le nombre de bits. Comme je l'ai déjà dit, une adresse mémoire est un nombre et elle a également une valeur maximale. C'est pourquoi la taille du mot machine est également une limite pour le nombre d'adresses mémoire disponibles - parfois, votre processeur ne peut tout simplement pas traiter des nombres suffisamment grands pour traiter plus de mémoire.
Donc, sur 32 bits, vous pouvez conserver des nombres de 0 à 2 ^ 32-1, et c'est 4 294 967 295. C'est plus que la plus grande adresse dans 1 Go de RAM, donc dans votre cas spécifique, la quantité de RAM sera le facteur limitant.
La limite de RAM pour le processeur 32 bits est théoriquement de 4 Go (2 ^ 32) et pour le processeur 64 bits, elle est de 16 EB (exaoctets, 1 EB = 2 ^ 30 Go). En d'autres termes, un processeur 64 bits pourrait adresser tout Internet ... 200 fois;) (estimé par WolframAlpha ).
Cependant, dans les systèmes d'exploitation réels, les processeurs 32 bits peuvent traiter environ 3 Gio de RAM. C'est à cause de l'architecture interne du système d'exploitation - certaines adresses sont réservées à d'autres fins. Vous pouvez en savoir plus sur cette soi-disant barrière de 3 Go sur Wikipedia . Vous pouvez lever cette limite avec l' extension d'adresse physique .
En ce qui concerne l'adressage de la mémoire, il y a peu de choses que je dois mentionner: la mémoire virtuelle , la segmentation et la pagination .
Mémoire virtuelle
Comme l'a souligné @Daniel R Hicks dans une autre réponse, les systèmes d'exploitation utilisent la mémoire virtuelle. Cela signifie que les applications ne fonctionnent en fait pas sur de vraies adresses mémoire, mais celles fournies par le système d'exploitation.
Cette technique permet au système d'exploitation de déplacer certaines données de la RAM vers un soi-disant Pagefile (Windows) ou Swap (* NIX). Le disque dur est de quelques magnitudes plus lent que la RAM, mais ce n'est pas un problème grave pour les données rarement consultées et il permet au système d'exploitation de fournir aux applications plus de RAM que vous n'en avez réellement installé.
Pagination
Ce dont nous parlions jusqu'à présent est appelé schéma d'adressage plat.
La pagination est un schéma d'adressage alternatif qui permet d'adresser plus de mémoire que vous pourriez normalement avec un mot machine dans un modèle plat.
Imaginez un livre rempli de mots de 4 lettres. Disons qu'il y a 1024 numéros sur chaque page. Pour aborder un nombre, vous devez savoir deux choses:
- Nombre de pages sur lesquelles ce mot est imprimé.
- Quel mot sur cette page est celui que vous recherchez.
C'est exactement ainsi que les processeurs x86 modernes gèrent la mémoire. Il est divisé en 4 pages KiB (1024 mots machine chacune) et ces pages ont des nombres. (en fait, les pages peuvent également être de 4 Mio gros ou 2 Mio avec PAE ). Lorsque vous souhaitez adresser une cellule mémoire, vous avez besoin du numéro de page et de l'adresse sur cette page. Notez que chaque cellule mémoire est référencée par exactement une paire de nombres, ce ne sera pas le cas pour la segmentation.
Segmentation
Eh bien, celui-ci est assez similaire à la pagination. Il a été utilisé dans Intel 8086, pour n'en citer qu'un exemple. Les groupes d'adresses sont désormais appelés segments de mémoire, et non pages. La différence est que les segments peuvent se chevaucher, et ils se chevauchent beaucoup. Par exemple, sur 8086, la plupart des cellules de mémoire étaient disponibles dans 4096 segments différents.
Un exemple:
Disons que nous avons 8 octets de mémoire, tous contenant des zéros à l'exception du 4e octet qui est égal à 255.
Illustration pour le modèle de mémoire plate:
_____
| 0 |
| 0 |
| 0 |
| 255 |
| 0 |
| 0 |
| 0 |
| 0 |
-----
Illustration pour la mémoire paginée avec des pages de 4 octets:
PAGE0
_____
| 0 |
| 0 |
| 0 | PAGE1
| 255 | _____
----- | 0 |
| 0 |
| 0 |
| 0 |
-----
Illustration pour la mémoire segmentée avec des segments de 4 octets décalés de 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 |
----- ----- ----- -----
Comme vous pouvez le voir, le 4e octet peut être adressé de quatre manières: (adressage à partir de 0)
- Segment 0, décalage 3
- Segment 1, décalage 2
- Segment 2, décalage 1
- Segment 3, décalage 0
C'est toujours la même cellule mémoire.
Dans les implémentations réelles, les segments sont décalés de plus d'un octet (pour 8086, il était de 16 octets).
Ce qui est mauvais dans la segmentation, c'est que c'est compliqué (mais je pense que vous le savez déjà;) Ce qui est bien, c'est que vous pouvez utiliser des techniques intelligentes pour créer des programmes modulaires.
Par exemple, vous pouvez charger un module dans un segment, puis prétendre que le segment est plus petit qu'il ne l'est réellement (juste assez petit pour contenir le module), puis choisir le premier segment qui ne chevauche pas celui pseudo-plus petit et charger le module suivant , etc. Fondamentalement, vous obtenez des pages de taille variable.