Qu'est-ce que Interruption ?
Mécanisme du CPU qui suspend temporairement le traitement en cours, en réponse par exemple à une requête d'un périphérique, pour exécuter en priorité le traitement correspondant, puis reprend le traitement initial.
Nom japonais: 割り込み
« Interruption » apparaît dans 44 questions d'entraînement réparties sur 12 thèmes, dont Systèmes embarqués et firmware, Système d'exploitation et matériel, CPU et architecture.
Domaine: CPU et architecture
Ce qui se passe lors de la prise en compte d'une interruption
Lorsqu'un périphérique, un timer ou une autre source lève une interruption et que celle-ci est autorisée, le CPU sauvegarde dans des registres dédiés l'adresse de l'instruction suivante ainsi que des éléments d'état comme le mode de privilège et le bit d'autorisation des interruptions. Il obtient un numéro de vecteur correspondant à la cause, lit l'adresse de début du gestionnaire dans la table des vecteurs d'interruption mise en place par le système d'exploitation, et y saute. Le gestionnaire sauvegarde les registres qu'il utilise, sert le périphérique, acquitte la source d'interruption, restaure l'état et revient au moyen d'une instruction spéciale comme mret ou sret en RISC-V, qui restaure le mode et l'adresse de retour de manière atomique.
Interruptions, exceptions et scrutation
Les interruptions sont asynchrones : un tic d'horloge ou un paquet réseau arrive quelle que soit l'instruction en cours d'exécution. Les exceptions comme les défauts de page, la division par zéro ou un appel système volontaire (ecall en RISC-V) sont synchrones, causées par une instruction précise. La scrutation (polling), dans laquelle le CPU lit régulièrement l'état du périphérique, est l'alternative aux interruptions. Les interruptions sont préférables lorsque les événements sont rares ou que le CPU doit dormir, mais chacune coûte une sauvegarde d'état et un saut : à des fréquences d'événements très élevées, comme en réseau rapide, une scrutation par lots peut être plus efficace.
Priorités, masquage et latence
Un contrôleur d'interruptions arbitre les requêtes simultanées, souvent à l'aide d'un encodeur de priorité, et avec l'imbrication, une interruption plus prioritaire peut préempter un gestionnaire moins prioritaire, comme avec le NVIC des Arm Cortex-M. Le logiciel peut masquer les interruptions, mais une interruption non masquable (NMI) est réservée aux événements graves comme les erreurs mémoire non corrigeables ou l'expiration du chien de garde (watchdog). La latence d'interruption dans le pire cas est surtout fixée par la plus longue section exécutée avec les interruptions désactivées ; les systèmes d'exploitation scindent donc le traitement en une partie urgente courte et un travail différé, effectué plus tard avec les interruptions autorisées. Les périphériques PCI Express signalent leurs interruptions par des écritures en mémoire (MSI) au lieu de fils dédiés.
Questions fréquentes
Quelle est la différence entre une interruption et une exception ?
Une interruption est asynchrone et provient de l'extérieur du flot d'instructions, par exemple d'un timer ou d'un périphérique d'E/S. Une exception est synchrone, déclenchée par l'exécution d'une instruction particulière, comme un défaut de page, une instruction illégale ou un appel système.
Qu'est-ce qu'une table des vecteurs d'interruption ?
C'est une table, mise en place par le système d'exploitation ou le firmware, qui associe à chaque numéro d'interruption ou d'exception l'adresse de début de son gestionnaire. Le CPU l'utilise pour sauter vers la bonne routine selon la cause.
Pourquoi un gestionnaire d'interruption doit-il rester court ?
Pendant l'exécution d'un gestionnaire, les interruptions de priorité égale ou inférieure sont généralement retenues et le programme principal est suspendu : un gestionnaire long augmente donc la latence de tout le reste. Les traitements lourds sont reportés à une tâche ou à la boucle principale, qui s'exécutent avec les interruptions autorisées.