Fenêtre de registres
En architecture des ordinateurs, les fenêtres de registres constituent une technique pour améliorer la performance des appels de fonctions. Elles ont été utilisées pour la première fois dans les processeurs RISC de Berkeley, qui sont à l'origine des architectures SPARC, AMD 29000 et Intel i960.
La plupart des processeurs ont un petit nombre de mémoires très rapides appelées registres. Les processeurs utilisent les registres afin de stocker temporairement des valeurs lors de l'exécution des suites d'instructions. L'augmentation du nombre de registres dans la conception initiale du processeur peut donner lieu à des gains de performances très importants.
Bien que les registres soient un facteur de performance, ils présentent également des inconvénients. Les différentes parties d'un programme informatique utilisent chacune leurs propres valeurs temporaires, et par conséquent veulent toutes utiliser les registres. La bonne compréhension du déroulement de l'exécution d'un programme étant très difficile, il n'existe pas de méthode simple qui permette au développeur de savoir à l'avance combien de registres chaque partie de programme devrait utiliser. En règle générale, les considérations de ce genre sont tout simplement ignorées : les développeurs et encore plus probablement les compilateurs qu'ils utilisent essaient d'utiliser tous les registres visibles. C'est d'ailleurs la seule bonne façon de procéder dans le cas où le processeur utilisé dispose de peu de registres.
C'est alors qu'entrent en jeu les fenêtres de registres. Puisque chaque partie du programme aimerait disposer des registres pour elle seule, il suffit alors de fournir plusieurs ensembles de registres distincts aux différentes parties du programme. Le problème, c'est que si tous les registres sont visibles, alors une partie va vouloir utiliser des registres qui ne font pas partie de l'ensemble des registres qu'elle s'est vue attribuée. L'astuce est donc de rendre invisible pour elle tous les registres qui n'appartiennent pas à son ensemble de registres.
Ainsi, dans la conception du RISC de Berkeley, les programmes ne voient que 8 registres sur un total de 64. L'ensemble complet des registres constitue un banc de registres, et chaque sous-ensemble de 8 registres une fenêtre. De cette manière, il peut y avoir jusqu'à 8 appels de fonctions qui ont leur propre ensemble de 8 registres chacune. Si le programme ne présente pas d'appels de fonctions imbriqués dont la profondeur dépasse 8, le processeur n'a alors pas besoin de décharger les registres, c'est-à-dire de les sauvegarder en mémoire centrale ou en cache, des mémoires dont les temps d'accès sont extrêmement lents comparés à celui des registres. Notons d'ailleurs que des études statistiques sur des programmes tels des systèmes d'exploitation ou des applications réelles ont montré que la profondeur maximale d'appels imbriqués est en moyenne de 8 et qu'une profondeur plus importante ne se rencontre que dans 1 % des cas[1].