Les ordinateurs ne sont pas indéfiniment rapides. Dans un système temps réel, il est absolument crucial que le temps de calcul du processeur ne soit pas inutilement gaspillé.
Lors de l'exécution d'un programme, celui-ci peut être interrompu par un évènement extérieur. Il est de la responsabilité du système d'exploitation de minimiser le temps entre la prise en compte de l'évènement et l'exécution du programme chargé de traiter celui-ci. C'est cette durée qu'on appelle temps de latence.
Il existe plusieurs types de temps de latence dans le système QNX :
Temps de latence de traitement des interruptions
Temps de latence générés par l'ordonnancement des processus
Temps de latence générés par les interruptions en cascade
Ce temps de latence est la durée qui sépare la réception d'une interruption matérielle et l'exécution du code associé à cette interruption (interrupt handler).
QNX laisse la détection des interruptions activée la plupart du temps. Mais certaines sections de programmes nécessitent la désactivation temporaire des interruptions. Ce qui décale d'autant le traitement des interruptions.
Le temps de latence de traitement des interruptions (Til) dans le diagramme ci-dessus représente le temps de latence minimum. C'est le cas lorsque la gestion des interruptions est activée. Dans le plus mauvais cas, le temps de latence est égal à Til + le temps pendant lequel la gestion des interruptions est désactivée.
La valeur de Til dépend du cadencement du processeur.
Dans certain cas, le code de gestion d'une interruption matérielle peut déclencher l'exécution d'un programme haut niveau. Lorsque cela se produit, le gestionnaire d'interruption se termine en programmant l'exécution de ce programme. Ce phénomène génère une deuxième forme de temps de latence.
Par exemple, le temps de latence généré par l'ordonnancement d'un processus est le temps entre la fin d'un gestionnaire d'une interruption matérielle et l'exécution du drivers associé.
Il est important de noter que la plupart des interruptions se termine sans programmer l'exécution d'un programme haut niveau. Dans la plupart des cas, le gestionnaire d'interruption est en mesure de traiter l'interruption.
Dans le cas où l'architecture des ordinateurs autorise l'attribution de priorités aux interruptions matérielles, une interruption de priorité haute peut en interrompre une autre de priorité plus basse. Ce mécanisme est supporté par QNX. Le cas le plus simple que l'on puisse rencontrer est l'apparition d'une seule interruption matérielle. Mais lorsque plusieurs interruptions apparaissent, celles qui possèdent les priorités les plus hautes stoppent temporairement l'exécution des gestionnaires d'interruptions des plus basses.
Dans le schéma ci-dessus, le processus A s'exécute. Une première interruptionIRQx provoque l'exécution du gestionnaire d'interruptionINTx. C'est alors qu'une seconde interruptionIRQy provoque l'exécution du gestionnaire d'interruptionINTy. Ce gestionnaire non seulement bloque l'exécution deINTx, mais programme l'exécution d'un processus B avant de se terminé.INTx reprend son exécution et programme a son tour l'exécution d'un processus C avant de se terminer. Les processus B et C s'exécutent. Le processus A peut enfin reprendre son exécution.