2017-01-03 1 views
1

En discutant le principe de la localité, mon manuel fait les déclarations suivantes:Principe de Localité et APPELLENT Instructions

À l'exception de la branche et d'appeler des instructions, qui ne constituent qu'une petite fraction de toutes les instructions du programme, l'exécution du programme est séquentiel. Par conséquent, dans la plupart des cas, l'instruction à extraire immédiatement suit la dernière instruction récupérée.

En tant que novice, je trouve cela difficile à croire. Tout le code que j'ai rencontré est très peuplé avec des instructions d'appel. En effet, il me semble que les instructions d'appel effectuent réellement les actions les plus importantes dans un programme.

Je serais très reconnaissant si quelqu'un pouvait expliquer pourquoi ce concept est vrai, malgré le rôle important des instructions d'appel dans les programmes.

+0

"Petite fraction" est un terme relatif. Je parierais qu'il y a typiquement 1 instruction de branchement pour chaque 4 à 5 instructions non-branchement. Quand je vois tous les BS qu'ils enseignent à l'université, je suis heureux que je l'ai appris en travaillant pour une société d'informatique. – user3344003

Répondre

0

J'ai choisi un binaire aléatoire sur mon ordinateur, le gestionnaire de paquets cargo. Alors je:

  • démonte avec otool -tvV cargo > assembly
  • n'a reçu que les instructions: cat assembly | awk '{print $2}' > instructions
  • comptèrent instruction: sort instructions | uniq -c | sort -n > count

J'ai traité le résultat dans LibreOffice Calc dans une liste d'occurrences pour chaque instruction. Voici celles qui représentent plus de 1% du programme chaque (ces somme jusqu'à 86% donc il y a un nombre important d'opérations perdues je retranchées brewity):

| 34.83% | movq | 
| 7.30% | leaq | 
| 7.00% | callq | 
| 6.90% | je  | 
| 5.61% | movl | 
| 4.86% | cmpq | 
| 3.77% | testq | 
| 3.11% | jmp  | 
| 2.23% | jne  | 
| 2.17% | popq | 
| 2.05% | pushq | 
| 1.69% | addq | 
| 1.29% | cmpl | 
| 1.20% | movabsq | 
| 1.18% | movb | 
| 1.05% | xorl | 

Il y a certainement beaucoup de ramification et appelant en cours ici (callq, jmp, je, jne) mais aussi beaucoup d'opérations de mémoire. Les opérations de mémoire sont relativement lentes et constituent une grande partie de l'exécution du programme. movq est seulement une opération de mémoire et il constitue plus d'un tiers du programme!

Les caches CPU sont utilisés pour conserver les données de mémoire récemment référencées à proximité du cœur du processeur, ce qui accélère les futures opérations de mémoire sur les mêmes données. Ils peuvent le faire en raison du Principle of Locality qui stipule que les opérations sur la même mémoire se rapprochent souvent dans le temps (localité temporelle). Ainsi, les données de la mémoire peuvent être mises en cache car vous en aurez probablement besoin bientôt.