« Fonctionnement d'un ordinateur/Le modèle mémoire : alignement et boutisme » : différence entre les versions
Contenu supprimé Contenu ajouté
Ligne 38 :
Pour résumer, les avantages et inconvénients de chaque boutisme sont mineurs. Le gain en performance est nul sur les architectures modernes, qui ont des unités de calcul capables de faire des additions multi-octets. L'usage d'opérations de lecture de taille variable est aujourd'hui tombé en désuétude, vu que cela ne sert pas à grand chose et complexifie le jeu d'instruction. Enfin, l'avantage de lecture n'est utile que dans situations tellement rares qu'on peut légitimement questionner son statut d'avantage. En bref, les différentes formes de boutisme se valent.
==
Il arrive que le bus de données ait une largeur de plusieurs
[[File:Exemple du chargement d'un octet dans un registre de trois octets.jpg|centre|vignette|upright=2|Exemple du chargement d'un octet dans un registre de trois octets.]]
Sur certains processeurs, il existe des restrictions sur la place de chaque mot en mémoire, restrictions résumées sous le nom d''''alignement mémoire'''.
Ligne 50 :
Sans alignement, on peut lire ou écrire un mot, peu importe son adresse. Pour donner un exemple, je peux parfaitement lire une donnée de 16 bits localisée à l'adresse 4, puis lire une autre donnée de 16 bits localisée à l'adresse 5 sans aucun problème.
[[File:Chargement d'une donnée sur un processeur sans contraitnes d'alignement.jpg|centre|vignette|upright=2|Chargement d'une donnée sur un processeur sans contraintes d'alignement.]]
===Avec alignement mémoire===
[[File:Chargement d'une donnée sur un processeur avec contraintes d'alignement.jpg|centre|vignette|upright=2|Chargement d'une donnée sur un processeur avec contraintes d'alignement.]]
====La validité des adresses avec alignement mémoire====
Avec cette technique, il y a une différence entre l'adresses d'un mot et l'adresses d'un byte. Les bytes ont une adresse qui est gérée par le processeur, alors que la mémoire ne gère que les adresses des mots. Par convention, l'adresse d'un mot est l'adresse de son byte de poids faible. Les autres bytes du mot ne sont pas adressables par la mémoire. Par exemple, si on prend un mot de 8 octets, on est certain qu'une adresse sur 8 disparaitra. L'adresse du mot est utilisée pour communiquer avec la mémoire, mais cela ne signifie pas que l'adresse des bytes est inutile au-delà du calcul de l'adresse du mot. En effet, l'accès à un byte précis est encore possible : le processeur lit un mot entier, sélectionne le byte adéquat et oublie les autres. Et pour cela, il doit déterminer la position du byte dans le mot
Dans l'exemple précédent, les adresses utilisables sont multiples de la taille d'un mot. Et bien sachez que cela fonctionne
[[File:Adresse d'un mot avec alignement mémoire strict.png|centre|vignette|upright=2|Adresse d'un mot avec alignement mémoire strict.]]
====
Maintenant imaginons un cas particulier : je dispose d'un processeur utilisant des mots de 4 octets. Je dispose aussi d'un programme qui doit manipuler un caractère stocké sur 1 octet, un entier de 4 octets et une donnée de deux octets. Mais un problème se pose : le programme qui manipule ces données a été programmé par quelqu'un qui n'était pas au courant de ces histoire d'alignement, et il a répartit mes données un peu n'importe comment. Supposons que cet entier soit stocké à une adresse non-multiple de 4. Par exemple :
Ligne 104 :
Dans ce cas, il peut se passer des tas de choses suivant le processeur. Sur certains processeurs, la donnée est chargée en deux fois : c'est légèrement plus lent que la charger en une seule fois, mais ça passe. Mais sur d'autres processeurs, la situation devient nettement plus grave : le processeur ne peut en effet gérer ce genre d'accès mémoire dans ses circuits et considère qu'il est face à une erreur, similaire à une division par zéro ou quelque chose dans le genre. Il va alors interrompre le programme en cours d’exécution et exécuter un petit sous-programme qui gérera cette erreur. On dit que notre processeur effectue une exception matérielle. Si on est chanceux, ce programme de gestion d'erreur chargera cette donnée en deux fois : ça prend beaucoup de temps. Mais sur d'autres processeurs, le programme responsable de cet accès mémoire en dehors des clous se fait sauvagement planter. Par exemple, essayez de manipuler une donnée qui n'est pas "alignée" dans un mot de 16 octets avec une instruction SSE, vous aurez droit à un joli petit crash !
Pour éviter ce genre de choses, les compilateurs utilisés pour des langages de haut niveau préfèrent rajouter des données inutiles (on dit aussi du
{|class=wikitable
Ligne 133 :
|}
Comme vous le voyez, ça prend un peu plus de place, et de la mémoire est gâchée inutilement. C'est pas grand chose, mais quand on sait que de la mémoire cache est gâchée ainsi, ça peut jouer un peu sur les performances. Il y a aussi des situations dans lesquelles rajouter du
<noinclude>
|