alternativtext=Vereinfachter Ablauf eines Interrupts anhand eines Diagramms|mini|440x440px|Vereinfachter Ablauf eines Interrupts anhand eines Diagramms In der Informatik versteht man unter einem Interrupt (, „unterbrechen“ nach , dem Partizip Perfekt Passiv von interrumpere, unterbrechen) eine kurzfristige Unterbrechung der normalen Programmausführung,A. Metzlar: BIOS. Das Praxisbuch. Franzis, 2004, ISBN 978-3-7723-6706-9, S. 379. um einen in der Regel kurzen, aber zeitlich kritischen, Vorgang abzuarbeiten.

Das auslösende Ereignis wird Unterbrechungsanforderung (englisch Interrupt Request, IRQ) genannt. Nach dieser Anforderung führt der Prozessor eine Unterbrechungsroutine aus (auch Unterbrechungsbehandlung genannt, engl. interrupt handler, interrupt service routine oder kurz ISR). Die Unterbrechungsroutine wird (bei entsprechenden Prozessoren) mit erweiterten Privilegien ausgeführt. Im Anschluss an die Unterbrechungsroutine wird der vorherige Zustand des Prozessors (inkl. Privilegierung) wiederhergestellt und die unterbrochene Programmausführung dort fortgeführt, wo sie unterbrochen wurde.

Interrupts (genauer: Hardware-Interrupts) werden durch asynchrone externe Ereignisse ausgelöst.W. Stallings: Operating Systems: Internals and Design Principles. Prentice Hall International, 2000, ISBN 978-0-13-031999-9, S. 136. Asynchron bedeutet in diesem Zusammenhang, dass die laufende Programmausführung nicht an immer der gleichen Stelle unterbrochen wird. Im Gegensatz dazu kann ein Interrupt bei vielen Prozessoren auch durch den laufenden Programmcode selbst mittels eines Maschinenbefehls („INT nn“) ausgelöst werden (Software-Interrupt). Effektiv ist dies eher mit einem Unterprogramm-Aufruf zu vergleichen; einzelne Betriebssysteme implementieren so Systemaufrufe.

Beispiele Die Tastatur sendet eine Unterbrechungsanforderung, wenn eine Taste gedrückt wurde. Dazu wird ein Signal auf den Bus oder direkt an einen nur dafür vorgesehenen Prozessorpin (IRQ-Eingang) gelegt.A. Tanenbaum: Moderne Betriebssysteme. Pearson Studium, 2009, ISBN 978-3-8273-7342-7, S. 406. Die Unterbrechungsroutine kann daraufhin das jeweilige Zeichen von der Tastatursteuerung lesen und es an die jeweilige Anwendung weiterleiten.

Die Maus sendet eine Unterbrechungsanforderung, wenn die Achsenposition des Gerätes geändert oder eine Maustaste gedrückt wird. Unterstützt werden zwei Maustasten als Hardware-Interrupt (Hardware-Maus). Mausgesten wie der Doppelklick müssen von der Software, etwa einem Betriebssystem, erfasst werden. Zusätzliche Tasten an einer Maus werden nur durch passende Gerätetreiber unterstützt.

Weitere Beispiele, bei denen üblicherweise Hardware-Unterbrechungsanforderungen generiert werden: Netzwerkkarte: wenn Daten empfangen wurden und für die weitere Verarbeitung im Puffer zur Verfügung stehen; Festplatte: wenn die zuvor angeforderten Daten gelesen wurden und zur Abholung bereitstehen (das Lesen von der Festplatte dauert relativ lange); Grafikkarte: wenn das aktuelle Bild fertig gezeichnet wurde; Soundkarte: wenn weitere Audiodaten zum Abspielen benötigt werden, um den Ausgabepuffer der Soundkarte nachzufüllen.

Geschichte Ältere Computermodelle hatten keine Interrupts.W. Stallings: Operating Systems: Internals and Design Principles. Prentice Hall International, 2000, ISBN 978-0-13-031999-9, S. 62. Um 1958 gab es erste Modelle mit Interrupts, ein Beispiel war die Electrologica X1.E. W. Dijkstra: My recollection of operating system design. (PDF; 1013 kB) EWD 1303, 2000, S. 15

In den 1980er Jahren wurden Rasterzeileninterrupts intensiv auf den 8-Bit-Heimcomputern genutzt. Dabei handelt es sich um Hardwareinterrupts, die ausgelöst werden, wenn der Videochip eines Computers die Darstellung einer bestimmten Zeile auf dem Bildschirm beginnt. Rasterzeileninterrupts waren entscheidend für die Programmierung grafisch anspruchsvoller Computerspiele dieser Zeit.

Zweck Ein Interrupt dient dazu, auf eine Ein- oder Ausgabe (etwa von Tastatur, Festplatte, Netzwerk oder Zeitgeber) sofort reagieren zu können, während ein anderes Programm (zum Beispiel eine Benutzeranwendung) abgearbeitet wird. Die Interface-Hardware muss nur dann einen Interrupt auslösen, wenn die nächste Interface-Operation nicht möglich ist, beispielsweise bei Puffer leer (Ausgabe), Puffer voll (Eingabe), bei Fehlermeldungen der Interface-Hardware oder bei einem Ereignis ohne Datentransfer (zum Beispiel Timer).

Vorteile gegenüber dem Polling Neben Interrupts gibt es lediglich die Technik des programmierten (zyklischen) Abfragens (Polling), um den Status von Ein-/Ausgabegeräten, Prozessen oder anderem zu erfahren. Diese Methode ist zwar einfacher und benötigt keine zusätzliche Hardware, ist allerdings sehr viel ineffizienter als die Arbeit mit Interrupts, da sie die CPU viel stärker in Anspruch nimmt. Zudem hängt die Reaktionsgeschwindigkeit beim Polling davon ab, wie viel Zeit zwischen den Abfragen vergeht – dies kann bei Situationen, die eine sofortige Reaktion verlangen, kritisch sein. Bei Multitasking-Betriebssystemen ist das Polling als alleinige Methode nicht möglich.

Die Standard-Analogie für Interrupts im Alltag ist eine Tür mit Klingel: Während man seine Aufgaben erledigt, kann man jederzeit durch die Klingel unterbrochen werden, wenn ein Gast eine „Abarbeitung“ wünscht, und sich ihm dann zuwenden. Beim Polling – also ohne Klingel – müsste immer wieder an der Tür nachgeschaut werden, ob Besuch da ist oder nicht. Beim Erhitzen von Milch hingegen ist es wohl besser, nicht erst auf den „Interrupt“ des Überkochens zu warten, sondern den Prozess regelmäßig zu überwachen.

Anwendungsbeispiele Als Beispiel für eine Anwendung von Interrupts kann man sich einen Prozessor vorstellen, der, nachdem er einer Hardwarekomponente einen Auftrag gegeben hat, nicht aktiv auf deren Antwort wartet (Polling), sondern so lange andere Aufgaben erledigt, bis ihn jene Hardwarekomponente von sich aus durch einen Interrupt wieder auf sich aufmerksam macht. Ohne Interrupts wären beispielsweise präemptive (=verdrängen von laufenden Programmen) Multitasking-Betriebssysteme unmöglich, da Programme ohne sie nicht mehr unterbrochen, vom Betriebssystem umgeschaltet (Timesharing) und Ein-/Ausgabegeräte nicht mehr bedient werden könnten.

Funktionsweise Um ein Interrupt auslösen zu können, muss die an den Hauptprozessor (CPU) angeschlossene Hardware interruptfähig sein, d. h., bei Eintreffen eines bestimmten Ereignisses über die sogenannte Interrupt-Leitung ein Ausgangssignal (elektrische Spannung an einem Ausgangs-Pin) erzeugen. Die CPU hat im Allgemeinen getrennte Pins für maskierbare (abschaltbare) Interrupts (INTR) und nicht maskierbare Interrupts (NMI). Da bei nicht maskierbaren Interrupts zusätzlich noch die Interrupt-Nummer an die CPU übermittelt werden muss, haben viele Systeme einen Interrupt-Controller, an den diese Aufgabe delegiert wird, falls das Peripheriegerät das nicht selbst übernehmen kann.

Nicht maskierbarer Interrupt Beim Auslösen des NMI deaktiviert die CPU die maskierbaren Interrupts und springt an eine vom CPU-Hersteller für NMI vorgegebene Adresse, die sich je nach Computer meist im Festwertspeicher befindet. Die dort hinterlegte ISR (Interrupt Service Routine) veranlasst dann meistens einen Neustart des Systems oder eine globale Fehlerbehandlung. Anwendungssoftware hat keinerlei Einfluss auf das Verhalten beim Eintreffen eines NMI. Auch die Systemsoftware kann nicht verhindern, dass ein NMI behandelt wird.

Maskierbarer Interrupt

Erscheint an diesem meistens mit NMI bezeichneten Pin ein Signal ([Vcc]), während Interrupts aktuell nicht maskiert sind (bei x86 ist dann das Interrupt-Flag (IF) gesetzt), so deaktiviert die CPU alle maskierbaren Interrupts und liest die Nummer des angeforderten Interrupts vom Systembus (Intel64-Hardware unterscheidet 256 Interrupt-Nummern). Dort muss der Anforderer die Nummer vor der Anforderung anlegen. Die CPU konsultiert damit dann die Interrupt-Vektortabelle und entnimmt dieser die Adresse der zugehörigen Interrupt-Service-Routine. Diese gehört zur Treibersoftware der auslösenden Hardware. Diese Routine muss bei Ausführung zuerst den gesamten gefährdeten Verarbeitungskontext, also die Prozessorregister, die sie benutzen wird, sichern. Anschließend erfolgt die eigentliche Behandlung des Interrupts und schließlich die Rückspeicherung des Kontextes und Rücksprung hinter die Anweisung, die zuletzt vor der Behandlung des Interrupts ausgeführt wurde. Beim Rücksprung erfolgt auch die Demaskierung (Reaktivierung) der zuvor gesperrten Interrupts. Dafür gibt es eine besondere Interrupt-Return-Anweisung aus dem CPU-Befehlssatz, die anstelle der normalen Return-Anweisung verwendet wird. Der Ablauf entspricht technisch insgesamt dem eines normalen Unterprogramm-Aufrufs mit ergänzender Behandlung der Interrupt-Maskierung.

Durch Software ausgelöster Interrupt Bei vielen Prozessoren lässt sich die Interrupt-Behandlung auch durch einen Maschinenbefehl („INT nn“) auslösen. Ebenso wie bei Hardware-Interrupts erreicht der Prozessor bei der Behandlung der Unterbrechungsanforderung eine höhere Privilegierungsebene, mit der die Unterbrechungsroutine ausgeführt wird. So implementieren einzelne Betriebssysteme Systemaufrufe.

Latenz Die Zeit zwischen dem Anlegen des IRQ-Signals und dem Beginn der entsprechenden Verarbeitung nennt man Latenz. Für einen Interrupt der höchsten vergebenen Priorität hängt die Latenz vor allem von der Hardware ab – mit Schattenregistern kann der Kontextwechsel in einem Taktzyklus gelingen. Für Unterbrechungen mit geringerer Priorität wird die Latenz von der Ausführungsdauer der bevorzugten Interrupt-Routinen bestimmt. Echtzeitbetriebssysteme sind so organisiert und konfigurierbar, dass damit Echtzeitanforderungen leichter und beweisbar erfüllt werden können.

Maskierung Unterbrechungsanforderungen können zeitweise von der CPU ignoriert werden, zum Beispiel wenn gerade ein anderer Interrupt behandelt wird. Dies kann für gewisse zeitkritische und synchronisierende Routinen wie in Gerätetreibern notwendig sein. Die Maskierung (zeitweilige Sperrung / Deaktivierung) ist für alle Interrupts bis auf die nicht maskierbaren Interrupts (NMI: Non Maskable Interrupt) möglich. Letztere sind für spezielle Fälle vorgesehen (Stromausfall, Hardwarefehler usw.). Ebenfalls nicht maskierbar sind sogenannte Software-Interrupts, die durch einen Maschinenbefehl in einem Programm ausgelöst werden – beispielsweise wird 'int IRQNUMMER' bei x86-Systemen von Linux genutzt, um von normalen Anwendungen über Systemaufrufe (syscalls) in den Kernel-Modus zu wechseln.

Asynchronität Externe Interrupts (Hardwareinterrupts) sind gegenüber dem unterbrochenen Programm grundsätzlich asynchron, das heißt, die Ausführung des Programms befindet sich an einer unbestimmten Stelle, wenn der Interrupt auftritt. Daher dürfen Interrupts ohne besondere synchronisierende Maßnahmen keinen direkten Einfluss auf Programme (oder Programmvariablen) oder auf Geräte (zum Beispiel Festplatten) ausüben. ISRs sind keine Tasks im Sinne des Betriebssystems. Für ISRs ist weiter darauf hinzuweisen, dass nur mit besonderen Softwarekonzepten innerhalb der ISR die Interruptmaskierung aufgehoben (Interrupt enable) werden darf, da sowohl eine Interruptschachtelung durch fremde ISRs als auch eine Wiedereintrittsmöglichkeit (Reentrance) des gleichen Interrupts geschaffen wird.