20Aug

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

Un jour, il est amusant de regarder le niveau de surface de l'expérience informatique, et d'autres jours, il est amusant de plonger dans le fonctionnement interne. Aujourd'hui, nous examinons la structure de la mémoire de l'ordinateur et la quantité de données que vous pouvez insérer dans un bâton de RAM.

Question d'aujourd'hui &La session de réponse nous est offerte par SuperUser, une subdivision de Stack Exchange, un regroupement communautaire de sites Web Q & A.

La question Lecteur

SuperUser Johan Smohan se demande comment le type de processeur et la taille de la mémoire fonctionnent ensemble pour obtenir un nombre total d'adresses. Il écrit:

Combien d'adresses de 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 soit 32 bits 4 bits( ?) Pour obtenir le nombre d'adresses de mémoire?

Je lis sur Wikipédia que 1 adresse mémoire est de 32 bits ou 4 octets( 1 octet = 8 bits), comparé à un processeur 64 bits où 1 adresse mémoire ou 1 entier est 64 bits largeur ou 8 octets. Mais je ne sais pas si je l'ai bien compris non plus.

Ce sont les types 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

SuperUser contributeur Gronostaj offre 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:

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

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

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

1 B = 8 b

1 Go de RAM est en réalité 1 GiB( gibibyte, pas gigaoctet).La différence est:

1 Go = 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 du processeur..Par exemple. Intel 8086 CPU était de 16 bits et il adressait la mémoire par octets, de même que 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 des octets de mémoire.

L'adresse mémoire est juste un nombre d'octets que le CPU doit passer du début de la mémoire pour arriver à celui qu'il cherche.

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

Maintenant, vous devez savoir ce que signifie réellement 32 bits. 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( dans la RAM, le cache ou les registres internes).La CPU 32 bits utilise 32 bits( 4 octets) pour contenir des nombres. Les adresses mémoire sont également des nombres, donc sur une CPU 32 bits, l'adresse mémoire est constituée de 32 bits.

Maintenant, réfléchissez à ceci: si vous avez un bit, vous pouvez 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 huitvaleurs: 0, 1, 2. .. 6, 7. Il s'agit en fait d'un système binaire et fonctionne comme ceci:

Binaire Décimal 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 10 1010 111011 12 1100 13 1101 14 1110 15 1111

Cela fonctionne exactement comme l'addition habituelle, mais le chiffre maximum est 1, pas 9. Le 0 décimal est 0000, alors vous ajoutez 1 et obtenez 0001, ajoutez encore une fois et vous avez 0010.Happend ici est comme avoir décimal 09 et en ajoutant un: vous changez 9 à 0 et incrémenter le prochain chiffre.

Dans l'exemple ci-dessus, vous pouvez voir qu'il y a toujours une valeur maximale que vous pouvez conserver dans 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 0le nombre. C'est ce qu'on appelle le 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 ici, donc 1 est rogné)
  • 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 aussi une valeur maximale. C'est la raison pour laquelle la taille du mot machine est également une limite pour le nombre d'adresses mémoire disponibles. Parfois, votre processeur ne peut pas traiter des nombres suffisamment grands pour traiter plus de mémoire.

Donc sur 32 bits vous pouvez garder 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, la quantité de RAM sera le facteur limitant.

La limite de RAM pour les processeurs 32 bits est théoriquement de 4 Go( 2 ^ 32) et pour les processeurs 64 bits de 16 EB( exaoctets, 1 EB = 2 ^ 30 Go).En d'autres termes, le processeur 64 bits pourrait adresser l'Internet entier. .. 200 fois;)( estimé par WolframAlpha).

Cependant, dans les systèmes d'exploitation de la vie réelle, les processeurs 32 bits peuvent traiter environ 3 GiB 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 barrière de 3 Go sur Wikipédia. 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 , segmentation et 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. Ce que cela signifie, c'est que les applications ne fonctionnent pas sur les adresses de mémoire réelles, 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 fichier appelé Pagefile( Windows) ou Swap( * NIX).Le disque dur a des capacités plus faibles que la RAM, mais ce n'est pas un problème sérieux pour les données rarement accédées et cela permet au système d'exploitation de fournir aux applications plus de RAM que ce que vous avez réellement installé.

Paging

Ce dont nous parlions jusqu'à maintenant est appelé schéma d'adressage plat.

Paging est un schéma d'adressage alternatif qui permet d'adresser plus de mémoire que vous pourriez normalement avec un mot machine en 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 nombre, vous devez connaître deux choses:

  • Le nombre de page sur lequel ce mot est imprimé.
  • Le mot sur cette page est celui que vous cherchez.

Maintenant, c'est exactement comme ça que les processeurs x86 modernes gèrent la mémoire. Il est divisé en 4 pages KiB( 1024 mots machine chacun) et ces pages ont des numéros.(en fait les pages peuvent aussi être 4 MiB gros ou 2 MiB 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 chiffres, 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 sont maintenant 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 à partir de 4096 segments différents.

Un exemple:

Supposons que nous ayons 8 octets de mémoire, tous contenant des zéros à l'exception du 4ème octet qui est égal à 255.

Illustration du modèle à mémoire plate:

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

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

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

Illustration de la mémoire segmentée avec 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 4ème octet peut être adressé de quatre manières:( adressage de 0)

  • Segment 0, décalage 3
  • Segment 1,offset 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 s'agit de 16 octets).

Ce qui est mauvais à propos de 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 ce pseudo-petit et chargermodule suivant, et ainsi de suite. Fondamentalement, ce que vous obtenez de cette façon est des pages de taille variable.

Avoir quelque chose à ajouter à l'explication? Sonnez dans les commentaires. Vous voulez lire plus de réponses d'autres utilisateurs de Stack Exchange? Découvrez le fil de discussion complet ici.