Hiérarchie matérielle

En général, le temps nécessaire pour passer d'un niveau matériel à un autre correspond principalement au temps d'attente du niveau inférieur (le temps entre l'émission d'une requête et la réception des premières données).

Disques fixes

L'opération la plus lente pour un programme en cours d'exécution sur un système autonome consiste à obtenir du code ou des données à partir d'un disque, pour les raisons suivantes :

  • Le contrôleur de disque doit être dirigé pour accéder aux blocs spécifiés (délai de mise en file d'attente).
  • Le bras de disque doit rechercher le cylindre correct (temps d'attente de recherche).
  • Les têtes de lecture/écriture doivent attendre que le bloc correct tourne sous elles (temps d'attente de rotation).
  • Les données doivent être transmises au contrôleur (temps de transmission), puis acheminées vers le programme d'application (temps de traitement des interruptions).

La lenteur des opérations sur le disque peut avoir de nombreuses causes autres que les demandes explicites de lecture ou d'écriture dans le programme. Les activités d'optimisation du système sont souvent une chasse aux entrées/sorties inutiles sur le disque.

Mémoire réelle

La mémoire réelle, souvent appelée mémoire vive, ou RAM, est plus rapide que le disque, mais beaucoup plus chère par octet. Les systèmes d'exploitation essaient de ne conserver dans la mémoire vive que le code et les données qui sont actuellement utilisés, en stockant tout excédent sur le disque, ou en ne les introduisant jamais dans la mémoire vive.

La mémoire vive n'est cependant pas nécessairement plus rapide que le processeur. En général, une latence de mémoire vive de plusieurs dizaines de cycles de processeur se produit entre le moment où le matériel reconnaît la nécessité d'un accès à la mémoire vive et le moment où les données ou les instructions sont disponibles pour le processeur.

Si l'accès se fait à une page de mémoire virtuelle qui est stockée sur le disque ou qui n'a pas encore été introduite, un défaut de page se produit et l'exécution du programme est suspendue jusqu'à ce que la page ait été lue sur le disque.

Cache associatif de traduction d'adresse (TLB)

Les programmeurs ne sont pas confrontés aux limites physiques du système grâce à la mémoire virtuelle. Vous concevez et codez les programmes comme si la mémoire était très grande, et le système se charge de traduire les adresses virtuelles du programme pour les instructions et les données en adresses réelles qui sont nécessaires pour obtenir les instructions et les données de la mémoire vive. Comme ce processus de traduction d'adresses peut prendre beaucoup de temps, le système conserve les adresses réelles des pages de mémoire virtuelle récemment accédées dans un cache appelé "cache associatif de traduction d'adresse" ou TLB.

Tant que le programme en cours d'exécution continue d'accéder à un petit ensemble de pages de programme et de données, la traduction complète de l'adresse de page virtuelle en adresse réelle n'a pas besoin d'être refaite pour chaque accès à la mémoire vive. Lorsque le programme tente d'accéder à une page de mémoire virtuelle qui n'a pas d'entrée dans le TLB ( TLB miss), des dizaines de cycles du processeur (TLB-miss latency), sont nécessaires pour effectuer la traduction d'adresse.

Caches

Pour minimiser le nombre de fois où le programme doit subir la latence de la mémoire vive, les systèmes intègrent des caches pour les instructions et les données. Si l'instruction ou la donnée requise se trouve déjà dans le cache, une réussite en mémoire cache se produit et l'instruction ou la donnée est disponible pour le processeur au cycle suivant, sans délai. Dans le cas contraire, un échec en mémoire cache se produit avec une latence de la mémoire vive.

Dans certains systèmes, il existe deux ou trois niveaux de cache, généralement appelés L1, L2 et L3. Si une référence de stockage particulière résulte en un échec de L1, alors L2 est vérifié. Si L2 génère un échec, alors la référence passe au niveau suivant, à savoir L3, s'il est présent, ou la mémoire vive.

La taille et la structure des caches varient selon les modèles, mais les principes de leur utilisation efficace sont identiques.

Pipeline et registres

Une architecture superscalaire en pipeline permet, dans certaines circonstances, le traitement simultané de plusieurs instructions. Les grands ensembles de registres à usage général et de registres à virgule flottante permettent de conserver des quantités considérables de données du programme dans les registres, plutôt que de stocker et de recharger continuellement les données.

Les compilateurs d'optimisation sont conçus pour tirer le meilleur parti de ces capacités. Les fonctions d'optimisation des compilateurs doivent toujours être utilisées lors de la génération de programmes de production, aussi petits soient-ils. Le Guide d'optimisation et de réglage pour XL Fortran, XL C et XL C++ décrit comment les programmes peuvent être réglés pour une performance maximale.