Qu'entend-on par "la mémoire est alignée sur 8 octets"?
En passant par un projet, j'ai vu que les données de la mémoire sont "8 octets alignés". Quelqu'un peut-il expliquer ce que cela signifie?
4 réponses
Un objet qui est "8 octets aligné" est stockée à une adresse mémoire qui est un multiple de 8.
De nombreux processeurs ne chargeront que certains types de données à partir d'emplacements alignés; sur d'autres processeurs, cet accès est juste plus rapide. Il y a aussi plusieurs autres raisons possibles d'utiliser l'alignement de la mémoire-sans voir le code, il est difficile de dire pourquoi.
L'accès aligné est plus rapide car le bus externe vers la mémoire n'a pas un seul octet de large - il a généralement 4 ou 8 octets de large (ou même plus large). Ce signifie que le processeur ne récupère pas un seul octet à la fois-il récupère 4 ou 8 octets à partir de l'adresse demandée. Par conséquent, les 2 ou 3 bits les moins significatifs de l'adresse mémoire ne sont pas réellement envoyés par la CPU - la mémoire externe ne peut être lue ou écrite qu'à des adresses qui sont un multiple de la largeur du bus. Si vous avez demandé un octet à l'adresse "9" , le processeur demanderait réellement à la mémoire le bloc d'octets commençant à l'adresse 8, et chargerait le second dans votre inscrivez-vous (en rejetant les autres).
Cela implique qu'un accès mal aligné peut nécessiter deux lectures de la mémoire: Si vous demandez 8 octets commençant à l'adresse 9, le processeur doit récupérer les 8 octets commençant à l'adresse 8 ainsi que les 8 octets commençant à l'adresse 16, puis masquer les octets que vous vouliez. D'autre part, si vous demandez le 8 octets commençant à l'adresse 8, puis une seule extraction est nécessaire. Certains processeurs n'effectueront même pas une telle charge mal alignée - ils vont simplement déclencher une exception (ou même charger silencieusement les mauvaises données!).
L'alignement de la mémoire est important pour les performances de différentes manières. Il a une raison liée au matériel. Depuis les années 80, il y a une différence de temps d'accès entre le processeur et la mémoire. La vitesse du processeur augmente plus vite que la vitesse de la mémoire. Cette différence devient de plus en plus grande au fil du temps (pour donner un exemple: sur L'Apple II, le CPU était à 1.023 MHz, la mémoire était à deux fois cette fréquence, 1 cycle pour le CPU, 1 cycle pour la vidéo. Un PC moderne fonctionne à environ 3GHz sur le CPU, avec une mémoire à peine 400MHz). Une solution au problème du ralentissement de la mémoire est d'y accéder sur des bus toujours plus larges, au lieu d'accéder à 1 octet à la fois, le processeur Lira un mot 64 bits de la mémoire. Cela signifie que même si vous lisez 1 octet de la mémoire, le bus délivrera un 64 bits entier (mot de 8 octets). La mémoire aura ces unités de 8 octets à l'adresse 0, 8, 16, 24, 32, 40 etc. Un multiple de 8. Si vous accédez, par exemple, à un mot de 8 octets à l'adresse 4, le matériel devra lire le mot à l'adresse 0, masquer les 4 octets élevés de ce mot, puis lire le mot à l'adresse 8, masquer la partie basse de ce mot, le combiner avec la première moitié et le donner au registre. Comme vous pouvez le voir une opération assez compliquée (donc lente). C'est la première raison pour laquelle on aime l'accès à la mémoire alignée. Je vais donner une autre raison dans 2 heures.
"x octets alignés" signifie que l'adresse de base de vos données doit être un multiple de X. Il peut être utilisé pour utiliser un matériel spécial comme un DMA dans un matériel spécial, pour un accès plus rapide par le cpu, etc...
C'est le cas du processeur de cellules où les données doivent être alignées de 16 octets pour être copiées vers/depuis le coprocesseur.
Si les données de la mémoire sont alignées sur 8 octets, cela signifie: sizeof(the_data) % 8 == 0
.
généralement en langage C, si une structure est proposée Pour être alignée de 8 octets, sa taille doit être la multiplication de 8, et si ce n'est pas le cas, le remplissage est requis manuellement ou par le compilateur. certains compilateurs fournir des directives pour faire une structure alignée avec n octets, pour le CR, c'est - #prgama pack(8)
, et pour gcc, c'est - __attribute__((aligned(8)))
.