Le sous-système de mémoire d'un processeur moderne est limité à l'accès à la mémoire à la granularité et à l'alignement de sa taille de mot ; ceci pour un certain nombre de raisons.
Vitesse
Les processeurs modernes disposent de plusieurs niveaux de mémoire cache à travers lesquels les données doivent être extraites ; la prise en charge de la lecture d'un seul octet rendrait le débit du sous-système de mémoire étroitement lié au débit de l'unité d'exécution (c'est-à-dire lié au processeur) ; tout ceci rappelle la façon dont le Le mode PIO a été surpassé par le DMA pour les mêmes raisons dans les disques durs.
L'unité centrale siempre lit à la taille de son mot (4 octets sur un processeur 32 bits). Par conséquent, lorsque vous effectuez un accès à une adresse non alignée - sur un processeur qui le prend en charge - le processeur va lire plusieurs mots. Le processeur lira chaque mot de mémoire que l'adresse demandée chevauche. Cela entraîne une amplification allant jusqu'à 2X le nombre de transactions mémoire nécessaires pour accéder aux données demandées.
De ce fait, il peut très facilement être plus lent de lire deux octets que quatre. Par exemple, disons que vous avez en mémoire une structure qui ressemble à ceci :
struct mystruct {
char c; // one byte
int i; // four bytes
short s; // two bytes
}
Sur un processeur 32 bits, il serait probablement aligné comme indiqué ici :
Le processeur peut lire chacun de ces membres en une seule transaction.
Supposons que vous disposiez d'une version emballée de la structure, provenant peut-être du réseau où elle a été emballée pour des raisons d'efficacité de transmission ; elle pourrait ressembler à quelque chose comme ceci :
La lecture du premier octet sera la même.
Lorsque vous demandez au processeur de vous donner 16 bits à partir de 0x0005, il devra lire un mot à partir de 0x0004 et décaler d'un octet vers la gauche pour le placer dans un registre de 16 bits ; un peu de travail supplémentaire, mais la plupart des processeurs peuvent gérer cela en un cycle.
Si vous demandez 32 bits à partir de 0x0001, vous obtiendrez une amplification de 2X. Le processeur lira de 0x0000 dans le registre de résultat et décalera vers la gauche d'un octet, puis lira à nouveau de 0x0004 dans un registre temporaire, décalera vers la droite de 3 octets, puis OR
avec le registre des résultats.
Gamme
Pour un espace d'adressage donné, si l'architecture peut supposer que les 2 LSB sont toujours à 0 (par exemple, les machines 32 bits), elle peut accéder à 4 fois plus de mémoire (les 2 bits conservés peuvent représenter 4 états distincts), ou à la même quantité de mémoire avec 2 bits pour quelque chose comme les drapeaux. En retirant les 2 LSB d'une adresse, on obtient un alignement sur 4 octets ; on parle aussi de foulée de 4 octets. Chaque fois qu'une adresse est incrémentée, c'est en fait le bit 2 qui est incrémenté, et non le bit 0, c'est-à-dire que les 2 derniers bits continueront toujours à être 00
.
Cela peut même affecter la conception physique du système. Si le bus d'adresses nécessite 2 bits de moins, il peut y avoir 2 broches de moins sur l'unité centrale et 2 traces de moins sur le circuit imprimé.
Atomicité
Le CPU peut opérer sur un mot aligné de la mémoire de manière atomique, ce qui signifie qu'aucune autre instruction ne peut interrompre cette opération. Ceci est essentiel pour le bon fonctionnement de nombreux structures de données sans verrouillage et autres Concurrence paradigmes.
Conclusion
Le système de mémoire d'un processeur est un peu plus complexe et impliqué que ce qui est décrit ici ; une discussion sur le système de mémoire de l'ordinateur est en cours. comment un processeur x86 adresse réellement la mémoire peut vous aider (de nombreux processeurs fonctionnent de manière similaire).
Il y a beaucoup d'autres avantages à adhérer à l'alignement de la mémoire que vous pouvez lire à l'adresse suivante cet article d'IBM .
L'utilisation principale d'un ordinateur est de transformer les données. Les architectures et les technologies de mémoire modernes ont été optimisées au fil des décennies pour faciliter l'entrée, la sortie et le transfert de données entre des unités d'exécution plus nombreuses et plus rapides, et ce de manière extrêmement fiable.
Bonus : Caches
Un autre alignement pour les performances auquel j'ai fait allusion précédemment est l'alignement sur les lignes de cache qui sont (par exemple, sur certains processeurs) de 64B.
Pour plus d'informations sur les gains de performances obtenus en exploitant les caches, consultez le site suivant Galerie des effets du cache du processeur ; de ce Question sur la taille des lignes de cache
La compréhension des lignes de cache peut être importante pour certains types d'optimisations de programmes. Par exemple, l'alignement des données peut déterminer si une opération touche une ou deux lignes de cache. Comme nous l'avons vu dans l'exemple ci-dessus, cela peut facilement signifier que dans le cas d'un mauvais alignement, l'opération sera deux fois plus lente.
20 votes
Après avoir fait quelques supplémentaire En cherchant sur Google, j'ai trouvé este excellent lien, qui explique très bien le problème.
1 votes
Consultez ce petit article pour les personnes qui commencent à apprendre cela : blog.virtualmethodstudio.com/2017/03/memory-alignment-run-fools
5 votes
Lien brisé avec @ark
5 votes
@JohnJiang Je pense avoir trouvé le nouveau lien ici : developer.ibm.com/technologies/systèmes/articles/pa-dalign