Frage

Ich habe hier über mehrere Frage gesehen Ausnahmen , und einige von ihnen weisen auf unterbricht als Ausnahmen , aber keine machen die Verbindung klar.

  • Was ist ein Interrupt?

  • Was ist eine Ausnahme? (Bitte erklären, welche Ausnahmen für jede Sprache sind Sie wissen, wie es gibt einige Unterschiede)

  • Wenn eine Ausnahme ein Interrupt und umgekehrt?

War es hilfreich?

Lösung

Ein Interrupt ist ein CPU-Signal durch Hardware erzeugt oder spezielle CPU-Anweisungen. Diese verursachen Interrupt-Handler ausgeführt werden. Dinge wie E / A-Signale von I / O-Hardware erzeugen interupts.

Eine Ausnahme kann als eine Software-Version eines Interrupts gedacht werden, dass nur seinen Prozess auswirkt.

Ich bin auf die genauen Details nicht sicher, aber eine Ausnahme könnte durch einen Interrupt implementiert werden.

Andere Tipps

Ihr Prozessor wird eine Reihe von externen Interrupt-Pins haben. Typischerweise sind diese Stifte an Hardware angeschlossen und werden verwendet, um anzuzeigen, wann ein externes Ereignis auftritt. Zum Beispiel, wenn Sie die UART eine serielle Schnittstelle verwenden, erhöhen wird ein Stift heben, die auf einer der Interrupt-Pins auf dem Prozessor, daß ein Byte, um anzuzeigen, verbunden ist, empfangen worden ist.

Andere Peripheriegeräte wie Timer, USB-Controller, etc. wird auch Interrupts auf der Basis von einem externen Ereignisse erzeugen.

Wenn der Prozessor ein Signal auf einer seiner externen Interrupt-Pins empfängt, wird es sofort zu einem gewissen nominierten Stelle im Speicher springen und die Ausführung starten. Der Code ausgeführt wird in der Regel einen ISR genannt, oder Service-Routine unterbrechen. Es sei denn, Sie Treiber oder tun eingebettete Software von einer Art sind der Umsetzung ist es unwahrscheinlich, dass Sie jemals über ISR kommen werden.

Leider ist die Antwort auf die Frage nach Ausnahmen etwas weniger klar -. Gibt es 3 verschiedene Bedeutungen in anderen Antworten auf dieser Seite aufgelistet

Ron Savage Antwort bezieht sich auf die Software-Konstrukt. Dies ist lediglich eine Anwendungsebene Ausnahme, wo ein Stück Code in der Lage, einen Fehler anzuzeigen, die von einem anderen Teil des Codes erfaßt werden können. Es gibt keine Hardware-Beteiligung hier überhaupt nicht.

Dann gibt es die Ausnahme, wie durch eine Aufgabe gesehen. Dies ist ein Betriebssystemebene Konstrukt, das verwendet wird, um eine Aufgabe zu töten, wenn es etwas tut, illegal -. Wie Division durch 0, illegal Zugriff auf den Speicher etc

Und drittens gibt es die Hardware-Ausnahme. In Bezug auf Verhalten ist identisch zu einem Interrupt, dass der Prozessor sofort zu einem gewissen nominierten Speicherplatz springen und Ausführen starten. Wurde eine Ausnahme von einem Interrupt unterscheidet, ist, dass eine Ausnahme von einigen illegalen Aktivitäten verursacht wird, dass der Prozessor erkannt hat. Zum Beispiel wird der MMU auf dem Prozessor illegale Speicher erkennen zugreift und eine Ausnahme verursachen. Diese Hardware-Ausnahmen sind die Initialzündung für das Betriebssystem auszuführen es Cleanuptasks ist (wie im Abschnitt oben beschrieben).

Interrupts wird von externen Geräten an die CPU (timer tick, Plattenbetriebsbeendigungs, Netzwerkpaketankunft, etc.) und asynchrone mit der Programmausführung erzeugt. Ausnahmen sind synchrone mit der Programmausführung (beispielsweise eine Division durch Null, eine ungültige Adresse zugreifen).

Es sei denn, Ihr Programm ohne Betriebssystem ausgeführt wird (oder Sie entwickeln ein O), es wird nie eine rohe Ausnahme / Interrupt sehen. Sie werden, bevor sie wieder an den Benutzer durch das Betriebssystem und behandelt, indem es (Interrupts), oder umgerechnet in eine andere Form gefangen Programm reflektiert wird (zB Signale auf UNIX, Structured Exception Handling (SEH) unter Windows), wo es eine Chance, Handhabung hat es.

Unterbricht zeigen, dass etwas außerhalb des Prozessorkerns Aufmerksamkeit ist es erfordert. Es unterbricht den normalen Ablauf des Programms führt eine Interrupt Service Routine (ISR) und in der Regel zurück, wo es war, bevor die Unterbrechung auftrat.

Es gibt viele Variation dieses Grundthema ist: Interrupts können durch Software generiert werden, eine andere Aufgabe könnte die CPU nach der ISR bekommen, etc .. Der entscheidende Punkt ist, dass Unterbrechungen jederzeit aus einem Grunde auftreten können der Code / CPU hat keine Kontrolle über .

Eine Ausnahme ist ein bisschen schwieriger zu definieren, da es möglicherweise drei Bedeutungsebene hat:

Hardware Ausnahmen

Bestimmte Prozessoren (PowerPC zum Beispiel) definieren Ausnahmen, um anzuzeigen, dass irgendeine Art von ungewöhnlichen Zustand aufgetreten ist: System-Reset, Ungültige Adresse, eine virtuelle Adresse Übersetzung Cache-Miss, etc ...

Diese Ausnahmen auch zu implementieren Breakpoints und Systemaufrufe verwendet. In diesem Fall wirken sie fast wie Interrupts.

OS Ausnahmen

Einige der Hardware-Ausnahmen werden die vom Betriebssystem behandelt. Beispielsweise greift das Programm ungültige Speicher. Dies wird eine Hardware-Ausnahme verursachen. Das Betriebssystem hat einen Handler für die Ausnahme, und die Chancen, dass das O ein Signal , um Ihre Anwendung (SIGSEGV zum Beispiel mit) bezeichnet es ein Problem gibt.

Wenn Ihr Programm ein Signal-Handler installiert ist, werden die Signal-Handler und hoffentlich mit der Situation umzugehen. Wenn Sie nicht über einen Signal-Handler haben, kann das Programm beendet oder ausgesetzt werden.

Ich würde Fenster Structured Exception Handler (SEH) betrachten diese Art von Ausnahmen.

Software Ausnahmen

Einige Sprachen wie Java, C ++ und C #, das Konzept der Software Ausnahmen haben, in denen die Sprache für den Umgang mit unvorhergesehenen oder außergewöhnlichen Bedingungen bietet im Zusammenhang mit dem Betrieb des Programms . In diesem Fall wird eine Ausnahme an einem gewissen Punkt in dem Code und einig Code höher auf der Programmausführung Stapel würde „fangen“ die Ausnahme und führt angehoben. Dies ist, was try / catch-Blöcke tun.

Ich werde auf auszuarbeiten, was eine Unterbrechung ist, da gibt es noch eine kritische Art von Interrupt niemand mit noch behandelt hat:. Der Timer

Aber zuerst, lassen Sie mich wieder nach oben. Wenn Sie einen Interrupt erhalten, Ihr Interrupt-Handler (die in Kernel- lebt) läuft, die Unterbrechungen der Regel deaktiviert, sieht auf allen ausstehenden Geschäft (Umgang mit dem Paket, das gerade auf dem Netzwerk angekommen, die Verarbeitung der Tastendruck, etc.) und dann (wir erinnern uns ist an dieser Stelle im Kernel noch) herausfindet, was Prozess neben laufen soll (könnte die gleiche sein, könnte eine andere sein, abhängig von dem Scheduler) und führen sie es.

Nur ein Prozess läuft auf dem Prozessor zu einem bestimmten Zeitpunkt. Und wenn Sie ein Multitasking-Betriebssystem verwenden, die Art und Weise schaltet es zwischen ihnen ein Kontextschalter genannt wird - im Grunde die Register des Prozessors auf den Speicher entleert erhalten, geht der Ablauf auf den neuen Prozess, und wenn der Vorgang abgeschlossen ist Sie Kontext wechseln, um etwas sonst.

So

, lassen Sie uns sagen, dass ich ein einfaches C-Programm schreiben, das alle Zahlen zählt, oder die Fibonacci-Folge, oder etwas anderes, ohne anzuhalten. Oder noch besser: tut nichts anderes als Spin innerhalb einer while (1) Schleife. Wie kommen die anderen Prozesse auf dem System eine Chance zu laufen? Was passiert, wenn es passiert nichts, eine Unterbrechung verursachen?

Die Antwort ist, dass Sie ein Timer-Gerät, das ständig zu unterbrechen ist. Und es ist das, was ein Spinnverfahren hält das gesamte System von Abbau. Obwohl ich fest, dass die Interrupt-Handler-Interrupts zu deaktivieren, so dass, wenn Sie etwas tun, blockiert auf unbestimmte Zeit können Sie das gesamte System herunternehmen.

Ausnahme

Eine Ausnahme ist, wenn der Prozessor Code ausführt, die nicht auf dem normalen Weg. Dies ist eine ‚Ausnahme‘ in den Normalbetrieb, der im wesentlichen eine lineare Bewegung durch den Code und Kontrollstrukturen ist. Verschiedene Sprachen haben Unterstützung für verschiedene Arten von Ausnahmen, in der Regel Fehler während des Programmbetriebs zu behandeln verwendet.

Interrupt

Eine Unterbrechung ist eine Ausnahme auf Hardware-Ebene (in der Regel). Der Interrupt ist ein physikalisches Signal in dem Prozessor, der die CPU seinen aktuellen Zustand zu speichern, teilt und springen (oder Ausnahme) Handler-Code zu unterbrechen. Sobald die Prozedur der ursprüngliche Zustand durchgeführt wird wieder hergestellt wird und kann die Verarbeitung fortgesetzt werden.

Eine Unterbrechung ist immer eine Ausnahme, auch wenn es bestimmt ist. Interrupts könnte darauf hindeuten:

  • Fehler, wie eine Speicherzugriffsverletzung
  • , dass das O eine Operation auszuführen, muss ein laufendes Programm, wie zum Beispiel eines Software-Interrupt oder eine Speicher-Paging-Anforderung unterstützen
  • ein Hardware-Gerät erfordert Aufmerksamkeit, wie zum Beispiel ein Netzwerkpaket empfangen oder ein leerer Sendepuffer

zwingen, diese immer den Prozessor seine aktuelle Tätigkeit zu unterbrechen mit der erhöhten Ausnahme zu behandeln, die Wiederaufnahme nur, wenn die Interrupt-Handler abgeschlossen sind.

Pitfalls

Im Hinblick auf den Interrupts, häufige Fehlerquellen sind Rennbedingungen. Zum Beispiel könnten Sie einen Interrupt haben, die regelmäßig eine globale Echtzeituhr erhöht. Die Uhr kann 64 Bit auf 32-Bit-Maschine sein.

Wenn ein Programm liest die Uhr, und bekommt die erste 32-Bit-Wort, dann ist die Unterbrechung auftritt, sobald der Interrupt-Handler verlässt der Prozess die zweite 32-Bit-Wort erhält, und die Daten werden inkohärent sein - die beiden Worte sein können nicht mehr synchronisiert. Wenn Sie versuchen, einen Mutex oder Semaphore zu verwenden, um die Variable in dem Prozess zu sperren, wird der Interrupt hängt für die Sperre warten und das System anhält (Sackgasse), es sei denn, beide die Handler und die Prozesse, die die Daten verwenden, sind sehr sorgfältig geschrieben. Es ist einfach, in Schwierigkeiten zu bringen, wenn für Interrupts zu schreiben.

Einspringende Funktionen sind auch ein anderes Problem. Wenn Sie funcA in Programmcode ausgeführt werden, nehmen Sie eine Unterbrechung, die auch funcA führt Sie auf gemeinsam genutzte Variablen durch mit unbeabsichtigten Folgen können am Ende (statisch oder Heap-Variablen, Klassen, etc.). Sie wollen die Regel so wenig Code wie möglich in den Interrupt-Handler auszuführen, und häufig haben sie einen Flag setzten so dass der Prozess später die eigentliche Arbeit tun können, ohne sich um Konflikte zu sorgen.

In gewisser Weise ist dies ähnlich für einen Multi zu entwickeln, und ist einer der Gründe, warum Kernel-Programmierung noch schwarze Magie von vielen betrachtet wird.

-Adam

Interrupts wird erwartet, dass regelmäßig auftreten (auch wenn sie manchmal nicht regulär sind) .. sie Interrupt die CPU weil etwas Wichtiges gerade passiert ist, und es muss sofort erledigt werden.

Ausnahmen sein sollen Ausnahmen , um die Regel; diese wird durch Software geworfen, weil etwas Unvorhergesehenes passiert und das ist Ihre Chance, um zu versuchen, etwas dagegen zu tun, oder zumindest Absturz anmutig.

Wenn Sie über Unterbrechungen und Ausnahmen sprechen Sie in der Regel nah Level-Code auf der Hardware zu sprechen sind und Unterbrechungen und Ausnahmen sind oft teilweise durch Hardware und teilweise in Software implementiert werden.

Ein Interrupt ist ein Ereignis in der Hardware (oder manuell in der Montage gebrannt), die mit einem Vektor des Handler zugeordnet ist, die verwendet werden können, die Unterbrechung des Ereignis zu behandeln, sei es IO Completion, IO Fehler (Disk Speicherfehler), IO-Ereignis (Maus bewegt zum Beispiel). Die Unterbrechungen können zu Ausnahmen oft geben, wenn einige unerwartete Unterbrechung auftritt.

Eine Ausnahme ist ein unerwartetes Verhalten, oft am meisten, wenn die Hardware diese kam aus einem Interrupt verwenden und wird separat in der Software mit einem Interrupt-Handler behandelt. Programmiersprachen, wie wir sie fast immer verschleiert dies als eine Kontrollstruktur von einer Art zu sehen.

Im Allgemeinen wird ein Interrupt ist eine Hardware implementiert Falle irgendwelcher Art. Sie einen Handler für eine bestimmte Interrupt-Register (von 0 Division verfügbaren Daten auf einem peripheren, Timer abgelaufen ist) und wenn das Ereignis eintritt, werden alle Verarbeitungssystemweite stoppt, können Sie schnell die Interrupt-Verarbeitung, und die Dinge weiter auf. Diese werden in der Regel in einem Gerätetreiber zuzurAufnahme oder den Kernel.

Eine Ausnahme ist eine Software implementiert Art und Weise Fehler im Code der Handhabung. Sie legen einen Handler für bestimmte (oder allgemein) Ausnahmen nach oben. Wenn eine Ausnahme auftritt, Laufzeit die Sprachen startet den Stapel Abwickeln, bis es einen Handler für diesen spezifischen Handler erreicht. An diesem Punkt können Sie die Ausnahme behandeln und weiter auf, oder das Programm beenden.

Keeping Dinge einfach ...

Wenn Sie fertig sind eine Interrupt-Handling, Sie (in der Regel) Rückkehr zu dem, was Sie tun, bevor Sie unterbrochen wurden.

Handhabung eine Ausnahme beinhaltet Wegwerfen aufeinanderfolgenden Schichten von dem, was Sie gerade, bis Sie arbeiten an Blase bis zu einem Punkt, wo die Ausnahme behandelt werden kann (gefangen).

einen Interrupt Beim Umgang, können Sie entscheiden, eine Ausnahme zu werfen, aber das bedeutet nicht, dass Sie den Interrupt selbst als Ausnahme zu betrachten haben. Ausnahmen nicht „unterbrechen“ (da diese die Möglichkeit der Rückkehr bedeuten würden, was Sie gerade tun, bevor Sie wurden unterbrochen); sie „Abbruch“ und nicht (eine Untergruppe) Ihre aktuelle Aktivität.

Und, wie bereits mehrfach erwähnt, werden Unterbrechungen in der Regel durch externe Einrichtungen wie Hardware oder Benutzer ausgelöst (wie ein Mausklick oder Tastendruck wie CTRL-C), während Ausnahmen erzeugt (geworfen) synchron von Software eines „Problems Erkennung "oder "Ausnahmezustand".

Iterrupts sind grundsätzlich Hardware angetrieben, wie Sie Ihren Drucker indiciating es „kein Papier“ ist oder die Netzwerkkarte angibt, dass es Verbindung verloren hat.

Eine Ausnahme ist einfach ein Fehler in Ihrem Programm, durch einen try / catch-Block erkannt. Wie:

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

Es ist eine praktische Möglichkeit, „einen Fehler“ zu fangen, die in einem Block von Code geschieht, damit Sie sie in ähnlicher Weise handhaben können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top