Page d'accueil » comment » Combien d'adresses mémoire la RAM de mon ordinateur peut-elle contenir?

    Combien d'adresses mémoire la RAM de mon ordinateur peut-elle contenir?

    Certains jours, il est amusant de regarder le niveau de surface de l'expérience informatique, alors que d'autres jours, il est amusant de se plonger dans les rouages ​​internes. Aujourd'hui, nous examinons la structure de la mémoire de l'ordinateur et la quantité de données que vous pouvez ranger dans une clé de mémoire vive..

    La séance de questions et réponses d'aujourd'hui nous est offerte par SuperUser, une sous-division de Stack Exchange, un groupe de sites Web de questions-réponses dirigé par la communauté..

    La question

    Le lecteur de SuperUser, Johan Smohan, cherche à comprendre comment le type de processeur et la taille de la mémoire fonctionnent ensemble pour générer un nombre total d'adresses. Il écrit:

    Combien d'adresses mémoire pouvons-nous obtenir avec un processeur 32 bits et 1 Go de RAM et combien avec un processeur 64 bits?

    Je pense que c'est quelque chose comme ça:

    1 Go de RAM divisé par 32 bits ou 4 bits (?) Pour obtenir le nombre d'adresses de mémoire?

    J'ai lu sur Wikipedia qu'une adresse mémoire avait une largeur de 32 bits ou 4 octets (1 octet = 8 bits), par rapport à un processeur de 64 bits où 1 adresse mémoire ou un entier correspond à une largeur de 64 bits ou 8 octets. Mais je ne sais pas si j'ai bien compris non plus.

    Ce sont le genre de questions qui peuvent garder un geek curieux la nuit. Combien d'adresses sont disponibles sous chacun des systèmes hypothétiques de Johan?

    La réponse

    Gronostaj, contributeur à SuperUser, donne un aperçu de la façon dont la RAM est divisée et utilisée:

    Réponse courte: Le nombre d'adresses disponibles est égal à la plus petite de celles-ci:

    • Taille de la mémoire en octets
    • Plus grand nombre entier non signé pouvant être sauvegardé dans le mot machine du processeur

    Réponse longue et explication de ce qui précède:

    La mémoire est composée d'octets (B). Chaque octet est constitué de 8 bits (b).

    1 B = 8 b 

    1 Go de RAM correspond en réalité à 1 Go (en gibioctets et non en gigaoctets). 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; il en va de même des processeurs modernes de 32 bits et de 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 est juste un nombre d'octets que la CPU doit ignorer depuis le début de la mémoire pour atteindre celle qu'elle recherche.

    • Pour accéder au premier octet, il doit sauter 0 octet, l'adresse du premier octet est donc 0.
    • Pour accéder au second octet, il doit sauter 1 octet, son adresse est donc 1.
    • (et ainsi de suite… )
    • Pour accéder au dernier octet, la CPU saute 1073741823 octets. Son adresse est donc 1073741823..

    Maintenant, vous devez savoir ce que 32 bits signifie réellement. Comme je l'ai déjà mentionné, c'est la taille d'un mot machine.

    Le mot machine est la quantité de mémoire utilisée par la CPU pour contenir des nombres (en RAM, en cache ou dans les registres internes). La CPU 32 bits utilise 32 bits (4 octets) pour contenir des nombres. Les adresses de mémoire sont aussi des nombres, donc sur une CPU 32 bits l'adresse de mémoire est composée de 32 bits.

    Maintenant, pensez à ceci: si vous avez un bit, vous pouvez enregistrer deux valeurs: 0 ou 1. Ajoutez un bit supplémentaire et vous avez quatre valeurs: 0, 1, 2, 3. Sur trois bits, vous pouvez enregistrer huit valeurs. : 0, 1, 2… 6, 7. C'est en fait un système binaire et ça marche comme ça:

    Décimal binaire 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 les ajouts habituels, mais le chiffre maximum est 1, pas 9. La virgule 0 est 0000, alors vous ajoutez 1 et obtenez 0001, ajoutez un encore une fois et vous avez 0010. Qu'est-ce qui se passe ici, c'est comme avoir un nombre décimal 09 et en ajoutant un: vous passez de 9 à 0 et incrémentez le chiffre suivant.

    Dans l'exemple ci-dessus, vous pouvez voir qu'il existe toujours une valeur maximale que vous pouvez conserver dans un nombre de bits constant. En effet, lorsque tous les bits sont à 1 et que vous essayez d'augmenter la valeur de 1, tous les bits deviennent 0, rompant ainsi la nombre. C'est ce qu'on appelle un dépassement 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 ici, donc 1 est coupé) 
    • 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 dit précédemment, une adresse mémoire est un nombre et a également une valeur maximale. C'est pourquoi la taille du mot machine est également une limite pour le nombre d'adresses de mémoire disponibles - parfois, votre CPU ne peut tout simplement pas traiter des nombres assez grands pour adresser plus de mémoire..

    Ainsi, sur 32 bits, vous pouvez conserver des nombres de 0 à 2 ^ 32-1, ce qui représente 4 294 967 295. C’est plus que la meilleure 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 un processeur 32 bits est théoriquement de 4 Go (2 ^ 32) et de 16 EB pour un processeur 64 bits (exaoctets, 1 EB = 2 ^ 30 Go). En d’autres termes, un processeur 64 bits pourrait s’adresser à l’ensemble de l’Internet… 200 fois;) (estimé par WolframAlpha).

    Cependant, dans les systèmes d'exploitation réels, les CPU 32 bits peuvent traiter environ 3 Go de RAM. Cela est dû à l'architecture interne du système d'exploitation: certaines adresses sont réservées à d'autres fins. Vous pouvez en savoir plus sur cette barrière dite de 3 Go sur Wikipedia. Vous pouvez lever cette limite avec l'extension d'adresse physique.

    En parlant d'adressage mémoire, il y a peu de choses que je devrais mentionner: mémoire virtuellesegmentation et pagination.

    Mémoire virtuelle

    Comme @Daniel R Hicks l'a souligné dans une autre réponse, les systèmes d'exploitation utilisent la mémoire virtuelle. Cela signifie que les applications ne fonctionnent pas en réalité sur des adresses de mémoire réelles, mais sur 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 fichier appelé Pagefile (Windows) ou Swap (* NIX). Le disque dur a une magnitude inférieure à celle de la RAM, mais il ne s'agit pas d'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 celle que vous avez réellement installée..

    Pagination

    Ce dont nous parlions jusqu’à présent s’appelle 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 adresser un numéro, vous devez savoir deux choses:

    • Le numéro de page sur laquelle ce mot est imprimé.
    • Quel mot sur cette page est celui que vous recherchez.

    Voilà comment les processeurs x86 modernes gèrent la mémoire. Il est divisé en 4 pages KiB (1024 mots machine) et ces pages ont des numéros. (En réalité, les pages peuvent aussi être 4 MiB grandes ou 2 MiB avec PAE). Lorsque vous souhaitez vous adresser à une cellule mémoire, vous avez besoin du numéro de page et de l'adresse figurant dans cette page. Notez que chaque cellule de mémoire est référencée par exactement une paire de nombres, ce qui 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 ne citer qu'un exemple. Les groupes d'adresses s'appellent maintenant des segments de mémoire, pas des 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 à partir de 4096 segments différents..

    Un exemple:

    Disons que nous avons 8 octets de mémoire, contenant tous des zéros sauf le 4ème octet qui est égal à 255.

    Illustration pour modèle de mémoire à plat:

     _____ | 0 | | 0 | | 0 | | 255 | | 0 | | 0 | | 0 | | 0 | ----- 

    Illustration pour mémoire paginée avec des pages de 4 octets:

     PAGE0 _____ | 0 | | 0 | | 0 | PAGE1 | 255 | _____ ----- | 0 | | 0 | | 0 | | 0 | ----- 

    Illustration pour 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 constater, le 4ème octet peut être adressé de quatre manières: (en partant de 0)

    • Segment 0, offset 3
    • Segment 1, offset 2
    • Segment 2, offset 1
    • Segment 3, offset 0

    C'est toujours la même cellule mémoire.

    Dans les mises en œuvre réelles, les segments sont décalés de plus d'un octet (pour 8086, il s'agissait de 16 octets).

    Le problème avec la segmentation 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 astucieuses 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 que ce qu’il est réellement (juste assez petit pour contenir le module), puis choisir le premier segment qui ne chevauche pas le pseudo-plus petit et charger le suivant module, et ainsi de suite. En gros, vous obtenez ainsi des pages de taille variable.


    Avez-vous quelque chose à ajouter à l'explication? Sound off dans les commentaires. Voulez-vous lire plus de réponses d'autres utilisateurs de Stack Exchange doués en technologie? Découvrez le fil de discussion complet ici.