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 divisé par 4? obtenir le nombre d'adresses mémoire?
Mais je ne suis pas sur. Voilà pourquoi je demande.
J'ai rouge sur wikipedia que 1 adresses mémoire fait 32 bits de large ou 4 octets (1 octet = 8 bits), comparé à 64 bits un processeur où 1 adresses mémoire ou 1 entier fait 64 bits de large ou 8 octets. Mais je ne sais pas si je l'ai bien compris non plus.
Réponses:
Réponse courte: Le nombre d'adresses disponibles est égal au plus petit de ceux-ci:
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 Go de RAM équivaut en fait à 1 Gio (gibibyte, pas gigaoctet). La différence est:
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.
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:
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 obtenez0001
, ajoutez à nouveau un et vous avez0010
. Ce qui se passe ici, c'est comme avoir une décimale09
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.
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:
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:
Illustration pour la mémoire paginée avec des pages de 4 octets:
Illustration pour la mémoire segmentée avec des segments de 4 octets décalés de 1:
Comme vous pouvez le voir, le 4e octet peut être adressé de quatre manières: (adressage à partir de 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.
la source
En plus de ce qui précède, notez que l' adressage virtuel est utilisé, ainsi que plusieurs espaces d'adressage . Ainsi, même si vous ne disposez que de 1 Go de RAM, un programme pourrait théoriquement utiliser jusqu'à 4 Go de mémoire virtuelle (bien que la plupart des systèmes d'exploitation la limiteront à moins que cela). Et vous pouvez conceptuellement avoir un nombre (presque) infini de ces espaces d'adressage de 4 Go.
La taille de la RAM ne limite pas (autant) la taille maximale d'un programme ou le nombre de programmes que vous pouvez exécuter, mais limite plutôt les performances. Lorsque la mémoire réelle devient "sur-engagée" et que le système commence à "déborder" alors qu'il "échange" des "pages" de mémoire entre la RAM et le disque, les performances chutent.
la source
Le 1 Go de RAM occuperait 1024 * 1024 * 1024 octets, soit 1 073 741 824 octets.
Un processeur 32 bits a toujours 4 * 1024 * 1024 * 1024 octets, soit 4 294 967 296 octets d' espace d'adressage. Le 1 Go de RAM apparaît dans cet espace. Sur les processeurs Intel, une partie de la RAM doit apparaître à l'adresse 0 pour les vecteurs d'interruption, de sorte que la RAM physique commence à l'adresse 0 et augmente.
D'autres éléments apparaissent dans cet espace d'adressage, tels que le BIOS et les ROM optionnelles (dans les 384 Ko supérieurs dans le premier 1 Mo), les périphériques d'E / S (comme l'APIC) et la RAM vidéo. Certaines choses étranges continuent également avec le mode de gestion du système "SMRAM" que je ne comprends pas encore complètement.
Notez qu'il s'agit d'un espace d'adressage physique, du point de vue du noyau. La MMU peut réorganiser tout cela de n'importe quelle manière en un processus d'espace utilisateur.
la source
Un processeur 32 bits peut adresser au plus 2 ^ 32 octets de mémoire individuels (environ 4 Go), mais avoir 1 Go de mémoire équivaudrait à 1 * 1024 * 1024 * 1024 octets de mémoire adressables (bien que vous disposiez probablement encore d'un espace d'adressage virtuel de 2 ^ 32 ). Un processeur 64 bits pourrait adresser 2 ^ 64 octets individuels, mais je pense que la plupart des systèmes n'utilisent que 48 bits pour les adresses mémoire faisant la limite supérieure. octets adressables 2 ^ 48.
la source
La réponse acceptée donne une bonne explication. Mais je ne pense pas que ce soit la réponse. Il ne contient rien sur le bus d'adresse . Et sa taille est en fait la principale raison des contraintes de mémoire. Par exemple, 8080 est un processeur 8 bits (la taille de son bus de données est de 8 bits), mais il a un bus d'adresse 16 bits. Il peut adresser 2 ^ 16 = (2 ^ 6) * (2 ^ 10) = 64 * 1024 octets = 64 Ko.
Vous pouvez en trouver plus ici (32 bits) dans la section "Historique technique".
la source
Je crois que les informations les plus élémentaires sont perdues dans cette conversation, voici donc ma réponse:
Dire "Ceci est un processeur 32 bits" signifie que la taille de l'instruction, ou la taille de la commande, que le processeur peut comprendre et utiliser en même temps est de 32 bits. De même avec les processeurs 64 bits: ils peuvent gérer des instructions d'au plus 64 bits.
Pensez à cela comme à une vieille calculatrice mécanique: vous ne disposez que de tant de chiffres, vous ne pouvez donc tout simplement plus saisir de chiffre.
Maintenant, une adresse qu'un processeur peut utiliser doit également tenir dans le même espace, donc pour un processeur 32 bits, l'adresse qu'il utilise ne peut également être que de 32 bits au maximum. Donc, à partir d'ici, nous pouvons simplement calculer le nombre maximal d'adresses (c'est-à-dire la quantité maximale de RAM utilisable par le CPU):
2 ^ 32 = 4294967296 (= 4 Go)
ou
2 ^ 64 = 18446744073709551616 (= bien plus;)
Ou, comme un exemple amusant, mon ancien Commodore 64 avait un processeur 16 bits, il était donc capable de gérer une mémoire de:
2 ^ 16 = 65536 octets (= 64 Ko)
C'est la logique de base, mais, comme indiqué précédemment, il existe des moyens de contourner cette limitation, comme les espaces d'adressage virtuels, le mappage de la mémoire, etc.
la source