Chapitre 2 Les Interruptions

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 10

Chapitre 2 : LES INTERRUPTIONS

1. Introduction :

Dans un ordinateur, ils coexistent deux types de programmes :


− Les programmes usagers qui font un calcul utile.
− Les programmes du SE qui font un travail de superviseur de tous les événements qui
arrivent à la machine.

Ces deux types de programmes se partagent les ressources communes de la machine et plus
particulièrement le processeur. Lorsqu’un programme est en cours d’exécution, plusieurs
événements peuvent arriver :

• Les événements synchrones qui sont liés à l’exécution du programme en cours,


comme :
1. Division par zéro.
2. Exécution d’une instruction inexistante ou interdite.
3. Tentative d’accès à une zone protégée.
4. Appel à une fonction du S.E.
• Les événements asynchrones qui ne sont pas liés à l’exécution du programme en
cours :
1. Fin d’opération d’E/S.
2. Signal d’horloge.

La supervision de ces deux types d’événements se fait par des contrôles continus sur l’arrivée
de ceux-ci.

Problème : Par quel mécanisme peut-on réduire le temps de supervision du S.E. ?


Solution : Au lieu que ça soit le processeur qui contrôle continuellement l’état d’une
ressource, c’est plutôt à la ressource d’informer le processeur central sur son état au moment
significatif. C’est le principe des interruptions de programmes.

2. Notions de base :

2.1. Mode d’exécution : Deux modes d’exécution d’un processus :

• Mode utilisateur (Esclave) : accès restreint, certaines instructions sont interdites


(pas d’accès direct aux périphériques). Il peut être interrompu par d’autres processus.
Les appels systèmes (SVC) permettent à un processus en mode utilisateur
d’accéder (temporairement) à des fonctions nécessitant le mode noyau.

• Mode noyau (Maître) : accès sans restriction (manipulation de la mémoire, dialogue


avec les contrôleurs de périphériques, . . .)

Le Noyau ou Superviseur est l’entité permettant la gestion des processus. Celui-ci


regroupe la gestion des E/S, l’ordonnancement des processus, la gestion de la mémoire,
la gestion des interruptions. Seul le noyau a des accès directs à toutes les ressources.

Un processus utilisateur souhaitant acquérir un périphérique devra en faire la demande


au travers d’un appel-système (SVC). Un appel-système est une requête traité par le

B. H. 1
noyau pour le compte d’un processus. Ces notions de noyau et d’appel-système
permettent de protéger les données sensibles, celles du noyau, car seul celui-ci peut les
modifier. De plus, un appel-système n’est pas interruptible, ce qui fait qu’il n’y a pas de
concurrence entre ceux-ci.

2.2. Le mot d’état du processeur :

Une machine est composée schématiquement d’un processeur (CPU), d’une mémoire
principale et d’organes d’E/S. Le processeur est un circuit actif qui comporte des registres
généraux et des registres spécialisés. L’ensemble des registres spécialisés forment le mot
d’état du processeur (MEP ou PSW pour : Processor Status Word).

Parmi ces registres on trouve :


• le compteur ordinal (CO) qui contient l’adresse de la prochaine instruction à
exécuter ;
• le mode d’exécution (MODE) qui peut être maître ou esclave ;
• Le masque d’interruptions que nous détaillerons plus tard.
• Un ou plusieurs pointeur(s) de pile.
• etc.

La notion de mode a été introduite essentiellement pour des raisons de protection, afin qu’un
programme quelconque ne puisse accéder à des zones ou à des registres propres au SE. Dans
la pratique, la CPU distingue les instructions normales et les instructions privilégiées. Ces
dernières ne sont utilisables qu’en mode maître. Elles permettent en général la modification
des registres spécialisés et le dialogue avec les unités d’E/S.

Partons du principe que le SE s’exécute en mode maître et que les programmes utilisateur
s’exécutent en mode esclave. La programmation directe des E/S est donc réservée au SE et
les E/S des programmes utilisateurs devront passer par des requêtes au SE.

2.3. Contexte du processus :

Chaque processus est représenté par une structure appelée Bloc de Contrôle du Processus
(ou PCB en anglais : Process Control Bloc) et qui renferme le contexte du processus, ce
contexte permettra de reprendre l'exécution du processus après une interruption de son
exécution. Les données des contextes contiennent les informations suivantes :

• numéro du processus et de son parent


• adresse du début du code du processus : adresse de main(),
• adresse de la pile du processus,
• état du processus et la priorité,
• valeurs de certains registres du processeur,
• descripteurs des fichiers ouverts
• masques de signaux.

3. Définition et Principe de l’interruption :

Définition Une interruption est un signal déclenché par un événement interne à la machine
ou externe, provoquant l'arrêt d'un programme en cours d'exécution à la fin de l'opération
courante (à un point observable (interruptible) du processeur central), au profit d'un

B. H. 2
programme plus prioritaire appelé programme d'interruption. Ensuite, le programme
interrompu reprend son exécution à l'endroit où il avait été interrompu.

En informatique, une interruption est un arrêt temporaire de l'exécution normale


d'un programme informatique par le processeur afin d'exécuter un autre programme (appelé
traitant de l'interruption).

Physiquement, l’interruption se traduit par un signal envoyé au processeur. Elle permet de


forcer le processeur à suspendre l’exécution du programme en cours, et à déclencher
l’exécution d’un autre programme prédéfini, spécifique à l’événement et qui permet
d'exécuter le traitement de l'interruption, ce dernier peut avoir plusieurs appellations : Rit
(Routine d’interruption), ISR (Interrupt Service Routine), ou traitant d’interruption ou
encore Interrupt-handler.

Ces interruptions sont les sonnettes que tirent les périphériques pour dire au processeur que
quelque chose se passe. Mais si chaque périphérique pouvait envoyer directement un signal
au processeur, il faudrait sur celui-ci autant de broches (jouant le rôle de cordons de sonnette)
que de périphériques. Pour éviter cela, les périphériques envoient leur requête d'interruption
à une puce à laquelle ils sont connectés, c’est le contrôleur d'interruption. C'est ce
contrôleur qui va envoyer à leur place une interruption au processeur. Les requêtes faites par
le contrôleur sont appelées IRQ (Interrupt Request).

Lorsque l'interruption se produit le processeur, après la fin de l'exécution de l'instruction en


cours, transfère le contrôle à la routine d'interruption associée à l'événement. La routine
d’interruption fait d’abord une sauvegarde du contexte du processus interrompu avant de
réaliser son propre traitement. A la fin de celui-ci, le contexte du processus interrompu est
restauré ce qui lui permet de continuer son exécution convenablement à l’endroit où il a été
interrompu.

Figure 1 : Déroulement d’une routine d’interruption

4. Commutation de contexte :

Le fait de commuter le processeur sur un autre processus demande :


• de sauvegarder l’état de l’ancien processus
• et de charger l’état du nouveau processus. Cette tâche est connue sous le nom de
commutation de contexte (voir partie TD).
Le temps pour le changement de contexte est l’overhead1 dans lequel le SE ne fait pas de
travail utile (temps dépendant du support matériel).

1
Overhead : Temps d'exécution des fonctions systèmes 3

B. H.
Le basculement d'un processus à l'autre est géré par
le noyau, Cette opération est généralement décidée
et réalisée par l'ordonnanceur :
• Suspendre le processus P0
• Sauvegarder et mettre à jour le PCB du
processus P0
• Charger le PCB du processus P1
• Démarrer processus P1

Figure 9 : Commutation de contexte

5. Vecteur d’interruptions :

Lors de l'occurrence d'une interruption, ou d'un déroutement (dans certaines machines), le


processeur reçoit un index qui pointe dans le vecteur d’interruptions. Cet index est généré
par le processeur dans le cas des déroutements. Il est fourni par un circuit de la carte mère
appelé contrôleur d'interruption dans le cas d'une interruption matérielle et par l'instruction
dans le cas d'une interruption logicielle. Au vu de cet index, le processeur accède à l'entrée
correspondante de la table d'interruption (voir figure 4).

On associe à chaque cause d’interruption un numéro k qui l’identifie. On dispose également


dans les adresses basses de la mémoire d’une table appelée le vecteur d’interruptions (vi).
Les cases vi[k] de cette table contiennent l’adresse de la routine à exécuter lors d’une
interruption de cause k. Cette routine est appelée le traitant d’interruption de cause k.

Lorsque le signal d’une interruption arrive, il modifie l'état d'un indicateur (drapeau ou flag)
dans le registre d’interruptions qui est régulièrement testé par l'unité centrale. Une fois que
le signal est détecté, il faut déterminer la cause de l'interruption. Pour cela on utilise un
indicateur, pour les différentes causes d’interruption. On utilise cet indicateur pour accéder à
un vecteur d’interruptions qui associe à chaque type d’interruption l’adresse de la routine
d’interruption correspondante. Un vecteur d’interruption a donc la structure suivante :

Figure 4 : Vecteur d’interruptions

B. H. 4
6. Mécanismes de gestion des interruptions :

Une interruption ne peut arriver au processeur que dans les conditions suivantes :

1. Le système d’interruption est actif.


2. L’UC est à un point observable (interruptible).
3. L’interruption est armée.
4. L’interruption est démasquée.
5. L’interruption est plus prioritaire que le programme en cours.

Figure 5 : Mécanisme de gestion d’une interruption

Remarque : Le programme repris après le traitement de l’interruption peut être le programme


interrompu ou un autre programme (le cas d’interruptions imbriquées).

− Système d’interruption actif : Dans certains cas, le processeur a besoin d’interdire toute
interruption possible. Pour cela, il dispose d’un mécanisme d’activation/désactivation
globale des interruptions. Dans ces conditions, aucune interruption ne peut interrompre
l’UC, et toute interruption est retardée à la prochaine activation du système d’interruption.

− L’interruption est armée : Une interruption désarmée ne peut interrompre l’UC. Ceci se
passe comme si la cause de l’interruption était supprimée. Toute demande d’interruption faite
durant son désarmement est perdue. On utilise ce procédé quand on désire qu’un élément ne
doive plus interrompre.

− L’interruption est démasquée : Parfois, il est utile de protéger, contre certaines


interruptions, l’exécution de certaines instructions (par exemple, les programmes
d’interruption eux-mêmes). Une interruption masquée ne peut alors interrompre l’UC, mais
toute demande d’interruption faite durant le masquage est retardée (mémorisée) pour être
traitée à la levée du masquage.
Les informations concernant l’état masqué des interruptions figurent dans le mot d’état du
processeur (PSW). On utilise le procédé de masquage pour définir des règles de priorité entre

B. H. 5
différentes causes d’interruption. Ainsi, les interruptions de même niveau de priorité ou d’un
niveau plus bas peuvent être masquées, alors qu’une interruption de priorité supérieure est
en cours d’exécution.

Remarque importante : Le masquage porte sur un niveau ou une cause d’interruption,


contrairement à l’activation qui porte sur l’ensemble du système d’interruptions.

Lors d’une interruption de cause k, la CPU effectue dès la fin de l’instruction en cours les
actions suivantes :
1. sauvegarder la valeur du compteur ordinal et le mode d’exécution (dans une pile ou
dans une case mémoire particulière suivant les CPU) ;
2. passer en mode maître ;
3. forcer dans le compteur ordinal la valeur vi[k], c’est à dire l’adresse de la première
instruction de la routine associée à l’interruption de cause k.

L’interruption est donc un mécanisme matériel puisque la sauvegarde et l’initialisation du


compteur ordinal à partir du vecteur d’interruptions sont des opérations réalisées par la CPU.
Le traitant représente la partie logicielle du mécanisme d’interruption. Il a (presque) toujours
la structure suivante :

1. Sauvegarder la valeur des registres de la CPU (dans un emplacement particulier de la


mémoire). Cette étape est couramment appelée la sauvegarde du contexte (Sauver
(zone)).
2. Traiter la cause de l’interruption.
3. Restaurer la valeur des registres de la CPU et le mode du programme interrompu.
C’est la restauration du contexte (Restaurer (zone)).
4. Forcer dans le compteur ordinal la valeur préalablement sauvegardée (Lpsw (ancien-
mep)).

L’étape 4 est souvent réalisée au moyen d’une instruction de la CPU qui provoque le retour
au programme interrompu (LPSW : Load-PSW qui signifie, Chargé le mot d’état du
processeur). Cette étape est appelée l’acquittement de l’interruption.

7. Types d’interruption :

Les interruptions peuvent d’être d’origines diverses, mais on peut les classer en deux grandes
classes :
− Les interruptions externes ou matérielles.
− Les interruptions internes ou logicielles.

7.1. Interruptions externes (indépendantes du processus) : sont au nombre de 16. Elles


sont baptisées IRQ 0 à 15. Ce sont les interruptions causées par des organes externes
au processeur central, comme les horloges de temps, les périphériques d’E/S, …etc.

Les interruptions externes ou matérielles se présentent comme un ensemble de fils


numérotés reliant la CPU et les circuits externes de la machine. La présence d’un signal
sur un de ces fils provoque une interruption du programme en cours d’exécution. Le
numéro de cette interruption est directement lié au fil qui l’a déclenchée. Ces
interruptions asynchrones (c’est-à-dire, peuvent arriver à tout moment indépendamment

B. H. 6
de l’exécution du programme en cours et qu’il n’est pas possible de prévoir leur arrivée.)
sont dues à :
− Périphérique prêt.
− Erreur durant l’E/S.
− Fin d’E/S.
− Ecoulement d’un délai de garde (horloge) : (voir partie TD)
− Réinitialisation du système.
− …etc.

Certaines de ces interruptions sont pré-affectées, mais beaucoup d'entre elles ne sont
affectées à des événements périphériques que lors de la configuration de la machine.

En voici quelques-unes :

Figure 2 : Interruptions externes ou matérielles

7.2. Interruptions internes : Ce sont des interruptions causées par l’exécution du


programme. Ces interruptions sont synchrones et se divisent en deux sous-classes :

A. Les Déroutements (Trap en anglais ou Exception en terme de langage de


programmation comme en ADA et JAVA) : qui sont dus à des erreurs lors de
l’exécution d’un programme et en empêchent la poursuite de son exécution. Ces
erreurs peuvent avoir diverses causes et sont au nombre de 6 :

• Tentative d’exécution d’une opération interdite ou invalide.


• Le fonctionnement pas à pas (une interruption est générée à chaque instruction)
• Violation d’accès à une zone mémoire protégée ou inexistante (voir TD)
• Division par zéro.
• Débordement arithmétique.
• Défaut de page (causes qui entraîne la réalisation d'une sauvegarde sur disque de l'image
mémoire),
• …etc.

Remarque : Un déroutement ne peut être masqué ou retardé, mais il peut être


supprimé (comme pour les déroutements liés aux opérations arithmétiques).

B. Les appels au superviseur (SuperVisor Call ou SVC) qui est une instruction
permettant, à partir d’un programme utilisateur d’accéder à un service du SE (Ex.

B. H. 7
demande d’E/S, allocation dynamique de la mémoire, fin de programme, accès à un
fichier, …etc.).

Cette façon de procéder permet au système de :


• Se protéger des usagers.
• Vérifier les droits d’accès au service demandé.
Et elle a les avantages suivants :
• L’interruption provoque un branchement vers le traitant d’interruption mais aussi
un changement de mode (Esclave Maître). Il y a donc un passage automatique
du programme utilisateur en mode esclave au S.E. en mode maître.
• Il existe un et un seul point d’entrée vers le S.E. pour les processus utilisateur. Il
est donc plus facile (du point de vue du concepteur du système) de sécuriser
l’appel des routines système.
• Si on part du principe que le vecteur d’interruptions se trouve dans une zone
inaccessible au programme utilisateur, alors ce dernier n’a aucun moyen de
passer en mode maître et l’instruction SVC est le seul point de passage.

Figure 3 : Appel au superviseur

L’appel au superviseur est en fait un appel de procédure système avec un passage de


paramètres. Le service demandé par l’utilisateur sera choisi au moyen d’un paramètre
supplémentaire désignant la cause de l’appel. Toutefois, l’appel au superviseur d’un
usager est traité comme interruption pour permettre une commutation du contexte
usager par le contexte superviseur, car l’utilisation d’un service de superviseur
nécessite un changement d’état (droits d’accès, mode d’exécution, priorité, …etc.).
- Le traitant de l’interruption SVC a la structure suivante :

1. sauver le contexte du demandeur


2. vérifier la nature de la requête
3. vérifier les arguments de la requête
4. vérifier les droits du demandeur
5. exécuter la demande
6. restaurer le contexte du demandeur
7. retour vers le demandeur

B. H. 8
Remarque : La distinction entre interruption, déroutement et appel au superviseur se
base sur la fonction, mais le mécanisme est commun.

8. Système hiérarchisé d’interruptions :

On peut envisager une hiérarchie de priorité des interruptions. Ainsi, lorsque plusieurs
interruptions arrivent en même temps, c’est la plus prioritaire qui est pris en charge en
premier. Cela implique aussi que la routine elle-même d’une interruption peut être
interrompue par une interruption plus prioritaire (voir figure 6).

1 2

2
1

Figure 6 : Interruptions en cascade

Les fils d’interruptions peuvent être hiérarchisés c’est-à-dire classés par ordre de priorités
respectives. Un traitant d’interruption peut donc être lui-même interrompu par une demande
d’interruption intervenant sur un fil de priorité supérieure. Il passe alors à l’état d’attente. La
figure 7 représente l’activité des programmes dans le temps pour un système hiérarchisé à 8
niveaux où le niveau 0 est le plus prioritaire, le niveau 7 correspondant au programme
d’arrière-plan (moins prioritaire).

après avoir exécuté


complétement l’int. niv 1

Figure 7 : Effet de la hiérarchisation d’un système d’interruptions

Chaque niveau d’interruption peut être dans l’un des états suivants :

– état désarmé : le niveau n’accepte aucune demande d’interruption.


– état armé : le niveau accepte et mémorise une demande d’interruption. On peut armer ou
désarmer un niveau d’interruption par programme en utilisant des instructions privilégiées.
Cette possibilité est donc réservée au SE.
– état masqué : le niveau a été inhibé par programme de sorte que l’interruption a pu être
mémorisée mais ne peut être prise en compte par la CPU.

B. H. 9
– état d’attente : l’interruption peut être prise en compte immédiatement si deux conditions
sont remplies :
– aucun niveau de priorité supérieure n’est en état d’attente ;
– la CPU se trouve dans une phase interruptible (fin d’instruction).
Le niveau passe alors à l’état actif.
– état actif : il implique la prise en compte de l’interruption par la CPU et dure pendant toute
la durée du traitant d’interruption.
Des instructions privilégiées permettent d’armer (ou de désarmer), d’autoriser (ou de
masquer), de déclencher un ou plusieurs niveaux d’interruption. Lorsque le nombre de
niveaux d’interruption est limité, un registre spécialisé de la CPU contient ce que l’on appelle
le masque d’interruption. A chaque niveau est associé un bit indiquant s’il est autorisé ou
masqué.

B. H. 10

Vous aimerez peut-être aussi