Question

J'ai lu plusieurs questions sur les exceptions , et certaines d'entre elles suggèrent interrompt en tant qu'exceptions , mais aucun ne permet de clarifier la connexion.

  • Qu'est-ce qu'une interruption?

  • Qu'est-ce qu'une exception? (veuillez expliquer quelles sont les exceptions pour chaque langue que vous connaissez, car il existe certaines différences)

  • Quand une exception est-elle une interruption et vice-versa?

Était-ce utile?

La solution

Une interruption est un signal de la CPU généré par du matériel ou des instructions spécifiques de la CPU. Celles-ci entraînent l'exécution de gestionnaires d'interruptions. Des éléments tels que les signaux d’E / S du matériel d’E / S génèrent des interruptions.

Une exception peut être considérée comme une version logicielle d'un interruption qui affecte uniquement son processus.

Je ne suis pas sûr des détails exacts, mais une exception pourrait être implémentée par un interrupteur.

Autres conseils

Votre processeur va avoir plusieurs broches d'interruption externes. Généralement, ces broches sont connectées au matériel et sont utilisées pour indiquer quand un événement externe se produit. Par exemple, si vous utilisez un port série, l'UART lèvera une broche connectée à l'une des broches d'interruption du processeur pour indiquer qu'un octet a été reçu.

D'autres périphériques tels que les minuteries, les contrôleurs USB, etc. génèrent également des interruptions sur la base d'un événement externe.

Lorsque le processeur reçoit un signal sur l’une de ses broches d’interruption externes, il passe immédiatement à un emplacement désigné de la mémoire et commence à s’exécuter. Le code exécuté est généralement appelé ISR ou routine de service d'interruption. Sauf si vous implémentez des pilotes ou utilisez un logiciel intégré, il est peu probable que vous rencontriez des ISR.

Malheureusement, la réponse à la question sur les exceptions est un peu moins claire: trois significations différentes ont été répertoriées dans les autres réponses figurant sur cette page.

La réponse de Ron Savage fait référence à la structure du logiciel. Il s'agit purement d'une exception au niveau de l'application, dans laquelle un morceau de code peut indiquer une erreur pouvant être détectée par un autre morceau de code. Il n’ya aucune implication matérielle ici.

Ensuite, il y a l'exception telle que vue par une tâche. Il s'agit d'une construction au niveau du système d'exploitation utilisée pour tuer une tâche lorsqu'elle effectue une opération illégale - comme une division par 0, un accès illégal à la mémoire, etc.

Et troisièmement, il y a l'exception matérielle. En termes de comportement, il est identique à une interruption en ce sens que le processeur saute immédiatement vers un emplacement de mémoire désigné et commence à s'exécuter. Lorsqu'une exception diffère d'une interruption, c'est qu'une exception est provoquée par une activité illégale détectée par le processeur. Par exemple, la MMU sur le processeur détectera les accès mémoire illégaux et provoquera une exception. Ces exceptions matérielles constituent le déclencheur initial permettant au système d'exploitation d'effectuer ses tâches de nettoyage (comme décrit dans le paragraphe ci-dessus).

Les

interruptions sont générées par des périphériques externes à la CPU (minuterie, exécution du disque, arrivée des paquets sur le réseau, etc.) et sont asynchrones lors de l'exécution du programme. Les exceptions sont synchrones avec l'exécution du programme (par exemple, division par zéro, accès à une adresse non valide).

À moins que votre programme ne s'exécute sans système d'exploitation (ou que vous ne développiez pas de système d'exploitation), il ne verra jamais d'exception / interruption brute. Ils sont capturés par le système d’exploitation et gérés par celui-ci (interruptions), ou convertis sous une autre forme avant d’être renvoyés au programme utilisateur (signaux, par exemple, sous UNIX, traitement des exceptions structurées (SEH) sous Windows), où il a une chance de le gérer. il.

Les interruptions indiquent qu'un problème externe au cœur du processeur nécessite son attention. Il interrompt le flux normal du programme, exécute une routine de service d'interruption (ISR) et revient généralement à l'endroit où il se trouvait avant l'interruption.

Il existe de nombreuses variations sur ce thème de base: les interruptions peuvent être générées par le logiciel, une autre tâche peut obtenir le processeur après l'ISR, etc. Le point clé est que des interruptions peuvent survenir à tout moment pour une raison quelconque, le code / Le processeur n’a aucun contrôle sur .

Une exception est un peu plus délicate à définir car elle comporte potentiellement trois niveaux de signification:

Exceptions matérielles

Certains processeurs (PowerPC par exemple) définissent des exceptions pour indiquer qu'une condition inhabituelle s'est produite: Réinitialisation du système, Adresse non valide, un cache manquant dans le cache de traduction d'adresses virtuelles, etc.

Ces exceptions sont également utilisées pour implémenter des points d'arrêt et des appels système. Dans ce cas, ils agissent presque comme des interruptions.

Exceptions du système d'exploitation

Certaines des exceptions matérielles seront gérées par le système d'exploitation. Par exemple, votre programme accède à une mémoire invalide. Cela provoquera une exception matérielle. Le système d'exploitation dispose d'un gestionnaire pour cette exception et il y a de fortes chances qu'il envoie un signal à votre application (SIGSEGV par exemple), signalant l'existence d'un problème.

Si un programme de traitement de signal est installé dans votre programme, celui-ci s'exécutera et, espérons-le, gérera la situation. Si vous n’avez pas de gestionnaire de signal, le programme peut être arrêté ou suspendu.

Je considérerais les gestionnaires d’exceptions structurés (SEH) de Windows comme ce type d’exceptions.

Exceptions logicielles

Certains langages tels que Java, C ++ et C # utilisent le concept d’exceptions logicielles, ce langage permettant de gérer des conditions imprévues ou inhabituelles liées au fonctionnement du programme . Dans ce cas, une exception est générée à un moment donné dans le code et un code situé plus haut dans la pile d'exécution du programme serait "intercepté". l'exception et exécuter. C’est ce que font les blocs try / catch.

Je vais expliquer ce qu'est une interruption, car il existe un type d'interruption essentiel dont personne n'a encore parlé: le minuteur.

Mais d'abord, laissez-moi reculer. Lorsque vous recevez une interruption, votre gestionnaire d’interruptions (qui réside dans le kernelspace) s’exécute, ce qui désactive généralement les interruptions, s’occupe des affaires en attente (traitement du paquet qui vient d’arriver sur le réseau, traitement de la frappe, etc.), puis (rappelez-vous êtes toujours dans le noyau à ce stade) détermine quel processus est supposé s'exécuter ensuite (il pourrait s'agir du même processus, d'un processus différent, selon le planificateur), puis exécutez-le.

Un seul processus s'exécute sur le processeur à la fois. Et lorsque vous utilisez un système d’exploitation multitâche, la façon dont il bascule entre eux s'appelle un changement de contexte: en gros, les registres du processeur sont vides en mémoire, le flux passe au nouveau processus et, lorsque le processus est terminé, vous passez au contexte. sinon.

Donc, disons que j’écris un programme en C simple qui compte tous les nombres, ou la séquence de Fibonacci, ou autre chose sans s’arrêter. Ou même mieux: ne fait que tourner à l'intérieur d'une boucle while (1). Comment les autres processus du système ont-ils une chance de s'exécuter? Que se passe-t-il s'il ne se passe rien pour provoquer une interruption?

La réponse est que vous avez un dispositif de minuterie qui s’interrompt constamment. Et c’est ce qui empêche un processus en rotation de détruire tout le système. Bien que je remarque que les gestionnaires d’interruptions désactivent les interruptions, vous pouvez supprimer tout le système si vous faites quelque chose qui bloque indéfiniment.

Exception

Une exception se produit lorsque le processeur exécute un code qui ne se trouve pas sur son chemin normal. Il s'agit d'une "exception" au fonctionnement normal, qui consiste essentiellement en un mouvement linéaire à travers le code et les structures de contrôle. Différentes langues prennent en charge différents types d'exceptions, généralement utilisés pour gérer les erreurs lors de l'exécution du programme.

Interruption

Une interruption est une exception au niveau matériel (en général). L'interruption est un signal physique dans le processeur qui indique à la CPU de stocker son état actuel et de passer au code du gestionnaire d'interruption (ou d'exception). Une fois le gestionnaire terminé, l’état initial est restauré et le traitement peut continuer.

Une interruption est toujours une exception, même si elle est prévue. Les interruptions peuvent indiquer:

  • erreurs, telles qu'une violation d'accès à la mémoire
  • le système d'exploitation doit effectuer une opération pour prendre en charge un programme en cours d'exécution, tel qu'une interruption logicielle ou une demande de pagination de mémoire
  • un périphérique nécessite votre attention, tel qu'un paquet réseau reçu ou un tampon de transmission vide

Celles-ci forcent toujours le processeur à suspendre son activité en cours pour traiter l'exception levée, et ne reprennent que lorsque le gestionnaire d'interruption est terminé.

Pièges

En ce qui concerne les interruptions, les pièges courants sont les conditions de concurrence. Par exemple, vous pouvez avoir une interruption qui incrémente périodiquement une horloge globale en temps réel. L’horloge peut être 64 bits sur une machine 32 bits.

Si un programme lit l'horloge et obtient le premier mot de 32 bits, alors l'interruption se produit, une fois que le gestionnaire d'interruptions quitte le processus, le deuxième mot de 32 bits est obtenu et les données sont incohérentes - les deux mots peuvent être désynchronisés. Si vous essayez d'utiliser un mutex ou un sémaphore pour verrouiller la variable dans le processus, l'interruption sera suspendue dans l'attente du verrouillage et du système (impasse), à ??moins que le gestionnaire et les processus qui utilisent les données ne soient écrits avec beaucoup de soin. Il est facile d'avoir des ennuis en écrivant pour des interruptions.

Les fonctions ré-entrantes constituent également un autre problème. Si vous exécutez funcA dans le code du programme, prenez une interruption qui exécute également funcA, ce qui pourrait entraîner des conséquences inattendues en raison de variables partagées (variables statiques ou tas, classes, etc.). En règle générale, vous souhaitez exécuter le moins de code possible dans le gestionnaire d'interruptions et le définir fréquemment afin que le processus puisse effectuer le vrai travail plus tard, sans vous soucier des conflits.

À certains égards, cela ressemble au développement pour un multiprocesseur et c’est l’une des raisons pour lesquelles la programmation du noyau est encore considérée par beaucoup comme de la magie noire.

-Adam

On s'attend à ce que les interruptions se produisent régulièrement (même si parfois elles ne le sont pas). Elles interrompent le processeur, car un événement important vient de se produire et doit être traité immédiatement.

Les

exceptions sont supposées être des exceptions à la règle; ceux-ci sont lancés par un logiciel parce que quelque chose d’inattendu s’est passé et c’est votre chance d’essayer de faire quelque chose, ou tout au moins de vous planter gracieusement.

Lorsque vous parlez d'interruptions et d'exceptions, vous parlez généralement d'un code de niveau matériel. Les interruptions et les exceptions sont souvent implémentées en partie par le matériel et par le logiciel.

Une interruption est un événement matériel (ou déclenché manuellement dans un assembly) associé à un vecteur de gestionnaires pouvant être utilisé pour gérer l'événement de l'interruption, qu'il s'agisse de l'achèvement IO, d'une erreur IO (défaillance de la mémoire du disque) ou d'un événement IO. (Mouse Move par exemple). Les interruptions peuvent donner lieu à des exceptions, souvent lorsqu'une interruption inattendue se produit.

Une exception est un comportement inattendu. Le plus souvent, lors de l’utilisation du matériel, elles proviennent d’une interruption et sont gérées séparément dans le logiciel à l’aide d’un gestionnaire d’interruptions. Les langages de programmation tels que nous les voyons déguisent presque toujours cela en une structure de contrôle.

En général, une interruption est un piège implémenté dans le matériel. Vous enregistrez un gestionnaire pour une interruption spécifique (division par 0, données disponibles sur un périphérique, minuterie expirée) et lorsque cet événement se produit, tout le traitement s'arrête à l'échelle du système, vous traitez rapidement l'interruption et les choses continuent. Celles-ci sont généralement implémentées dans un pilote de périphérique ou dans le noyau.

Une exception est un moyen implémenté par logiciel de gérer les erreurs de code. Vous configurez un gestionnaire pour des exceptions spécifiques (ou générales). Lorsqu'une exception se produit, l'exécution en langues commence à dérouler la pile jusqu'à ce qu'elle atteigne un gestionnaire pour ce gestionnaire spécifique. À ce stade, vous pouvez gérer l'exception et continuer ou quitter votre programme.

Garder les choses simples ...

Lorsque vous avez terminé de gérer une interruption, vous revenez (normalement) à ce que vous faisiez avant d'être interrompu.

Pour gérer une exception, vous devez jeter les couches successives de ce que vous êtes en train de travailler, jusqu'à ce que vous fassiez des bulles au point que l'exception puisse être traitée (interceptée).

Lors du traitement d'une interruption, vous pouvez décider de lever une exception, mais cela ne signifie pas que vous devez considérer l'interruption elle-même comme une exception. Les exceptions ne "interrompent" pas (puisque cela impliquerait la possibilité de revenir à ce que vous faisiez juste avant d'être interrompu); ils "abandonnent" plutôt (un sous-ensemble de) votre activité actuelle.

Et, comme on l’a déjà souligné à plusieurs reprises, les interruptions sont généralement déclenchées par des entités extérieures telles que le matériel ou des utilisateurs (comme un clic de souris ou une frappe au clavier, comme CTRL-C), tandis que des exceptions sont générées (levées) de manière synchrone par un logiciel détectant un " problème " ou "condition exceptionnelle".

Les Iterrupts sont essentiellement basés sur le matériel, comme l’imprimant l’imprimant "manque de papier". ou la carte réseau indiquant qu'elle a perdu la connexion.

Une exception est simplement une condition d'erreur dans votre programme, détectée par un bloc try / catch. J'aime:

Try
   {
   ... various code steps that "throw exceptions" on error ...
   }
catch (exception e)
   {
   print 'Crap! Something bad happened.' + e.toString()
   }

C’est un moyen pratique de détecter "toute erreur". cela se produit dans un bloc de code afin que vous puissiez les gérer de la même manière.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top