<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Interrupt</id>
	<title>Interrupt - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Interrupt"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Interrupt&amp;action=history"/>
	<updated>2026-05-24T14:33:42Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Interrupt&amp;diff=39340&amp;oldid=prev</id>
		<title>134.109.211.54: /* Maskierbarer Interrupt */</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Interrupt&amp;diff=39340&amp;oldid=prev"/>
		<updated>2025-02-04T19:59:17Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Maskierbarer Interrupt&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Datei:Interrupt Routine (Diagramm).png|alternativtext=Vereinfachter Ablauf eines Interrupts anhand eines Diagramms|mini|440x440px|Vereinfachter Ablauf eines Interrupts anhand eines Diagramms]]&lt;br /&gt;
In der [[Informatik]] versteht man unter einem &amp;#039;&amp;#039;&amp;#039;Interrupt&amp;#039;&amp;#039;&amp;#039; ({{enS|to interrupt}}, „unterbrechen“ nach {{laS|interruptus}}, dem [[Partizip Perfekt Passiv]] von &amp;#039;&amp;#039;interrumpere&amp;#039;&amp;#039;, unterbrechen) eine kurzfristige Unterbrechung der normalen Programmausführung&amp;lt;!--Formulierung mit „…ausführung“ verdeutlicht, dass die Abfolge von (Maschinen-)Befehlen gemeint ist; nur „Programm“ kann auch die Anwendung aus Benutzersicht sein, und die wird mitnichten unterbrochen.--&amp;gt;,&amp;lt;ref name=&amp;quot;Metzlar-379&amp;quot;&amp;gt;A. Metzlar: &amp;#039;&amp;#039;BIOS. Das Praxisbuch.&amp;#039;&amp;#039; Franzis, 2004, ISBN 978-3-7723-6706-9, S. 379.&amp;lt;/ref&amp;gt; um einen in der Regel kurzen, aber zeitlich kritischen, Vorgang abzuarbeiten.&lt;br /&gt;
&lt;br /&gt;
Das auslösende Ereignis wird &amp;#039;&amp;#039;&amp;#039;Unterbrechungsanforderung&amp;#039;&amp;#039;&amp;#039; (englisch &amp;#039;&amp;#039;Interrupt Request&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;IRQ&amp;#039;&amp;#039;&amp;#039;) genannt. Nach dieser Anforderung führt der [[Prozessor]] eine &amp;#039;&amp;#039;&amp;#039;Unterbrechungsroutine&amp;#039;&amp;#039;&amp;#039; aus (auch &amp;#039;&amp;#039;&amp;#039;Unterbrechungsbehandlung&amp;#039;&amp;#039;&amp;#039; genannt, [[Englische Sprache|engl.]] &amp;#039;&amp;#039;interrupt handler&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;interrupt service routine&amp;#039;&amp;#039;&amp;#039; oder kurz &amp;#039;&amp;#039;&amp;#039;ISR&amp;#039;&amp;#039;&amp;#039;). Die Unterbrechungsroutine wird (bei entsprechenden [[Prozessor|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.&lt;br /&gt;
&lt;br /&gt;
Interrupts (genauer: Hardware-Interrupts) werden durch asynchrone externe Ereignisse ausgelöst.&amp;lt;ref&amp;gt;W. Stallings: &amp;#039;&amp;#039;Operating Systems: Internals and Design Principles.&amp;#039;&amp;#039; Prentice Hall International, 2000, ISBN 978-0-13-031999-9, S. 136.&amp;lt;/ref&amp;gt; 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 [[Maschinenbefehl]]s („INT nn“) ausgelöst werden ([[Software-Interrupt]]). Effektiv ist dies eher mit einem [[Unterprogramm]]-Aufruf zu vergleichen; einzelne Betriebssysteme implementieren so [[Systemaufruf]]e.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
Die [[Tastatur]] sendet eine Unterbrechungsanforderung, wenn eine Taste gedrückt wurde. Dazu wird ein Signal auf den [[Bus (Datenverarbeitung)|Bus]] oder direkt an einen nur dafür vorgesehenen Prozessorpin (&amp;#039;&amp;#039;IRQ-Eingang&amp;#039;&amp;#039;) gelegt.&amp;lt;ref&amp;gt;[[Andrew S. Tanenbaum|A. Tanenbaum]]: &amp;#039;&amp;#039;Moderne Betriebssysteme.&amp;#039;&amp;#039; Pearson Studium, 2009, ISBN 978-3-8273-7342-7, S. 406.&amp;lt;/ref&amp;gt; Die Unterbrechungsroutine kann daraufhin das jeweilige Zeichen von der Tastatursteuerung lesen und es an die jeweilige Anwendung weiterleiten.&lt;br /&gt;
&lt;br /&gt;
Die [[Computermaus|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 (&amp;#039;&amp;#039;Hardware-Maus&amp;#039;&amp;#039;). [[Mausgeste]]n 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.&lt;br /&gt;
&lt;br /&gt;
Weitere Beispiele, bei denen üblicherweise Hardware-Unterbrechungsanforderungen generiert werden:&lt;br /&gt;
* [[Netzwerkkarte]]: wenn Daten empfangen wurden und für die weitere Verarbeitung im Puffer zur Verfügung stehen;&lt;br /&gt;
* [[Festplattenlaufwerk|Festplatte]]: wenn die zuvor angeforderten Daten gelesen wurden und zur Abholung bereitstehen (das Lesen von der Festplatte dauert relativ lange);&lt;br /&gt;
* [[Grafikkarte]]: wenn das aktuelle Bild fertig gezeichnet wurde;&lt;br /&gt;
* [[Soundkarte]]: wenn weitere Audiodaten zum Abspielen benötigt werden, um den Ausgabepuffer der Soundkarte nachzufüllen.&lt;br /&gt;
&lt;br /&gt;
== Geschichte ==&lt;br /&gt;
Ältere Computermodelle hatten keine Interrupts.&amp;lt;ref&amp;gt;W. Stallings: &amp;#039;&amp;#039;Operating Systems: Internals and Design Principles.&amp;#039;&amp;#039; Prentice Hall International, 2000, ISBN 978-0-13-031999-9, S. 62.&amp;lt;/ref&amp;gt; Um 1958 gab es erste Modelle mit Interrupts, ein Beispiel war die [[Electrologica&amp;amp;nbsp;X1]].&amp;lt;ref&amp;gt;[[Edsger W. Dijkstra|E. W. Dijkstra]]: [https://www.cs.utexas.edu/users/EWD/ewd13xx/EWD1303.PDF &amp;#039;&amp;#039;My recollection of operating system design&amp;#039;&amp;#039;.] (PDF; 1013&amp;amp;nbsp;kB) EWD 1303, 2000, S. 15&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In den 1980er Jahren wurden [[Rasterzeileninterrupt]]s intensiv auf den 8-Bit-Heimcomputern genutzt. Dabei handelt es sich um [[Hardwareinterrupt|Hardwareinterrupts]], die ausgelöst werden, wenn der Videochip eines Computers die Darstellung einer bestimmten [[Kathodenstrahlröhre#Rasterbilder|Zeile ]] auf dem Bildschirm beginnt. [[Rasterzeileninterrupt|Rasterzeileninterrupts]] waren entscheidend für die Programmierung grafisch anspruchsvoller [[Computerspiel|Computerspiele]] dieser Zeit.&lt;br /&gt;
&lt;br /&gt;
== Zweck ==&lt;br /&gt;
Ein Interrupt dient dazu, auf eine [[Eingabe und Ausgabe|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).&lt;br /&gt;
&lt;br /&gt;
=== Vorteile gegenüber dem Polling ===&lt;br /&gt;
Neben Interrupts gibt es lediglich die Technik des programmierten (zyklischen) Abfragens ([[Polling (Informatik)|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 (Informatik)|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.&lt;br /&gt;
&lt;br /&gt;
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 –&amp;amp;nbsp;also ohne Klingel&amp;amp;nbsp;– 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.&lt;br /&gt;
&lt;br /&gt;
=== Anwendungsbeispiele ===&lt;br /&gt;
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äemptives Multitasking|präemptive]] (=verdrängen von laufenden Programmen) Multitasking-Betriebssysteme unmöglich, da Programme ohne sie nicht mehr unterbrochen, vom Betriebssystem umgeschaltet ([[Time-Sharing (Informatik)|Timesharing]]) und Ein-/Ausgabegeräte nicht mehr bedient werden könnten.&lt;br /&gt;
&lt;br /&gt;
== Funktionsweise ==&lt;br /&gt;
Um ein Interrupt auslösen zu können, muss die an den [[Hauptprozessor]] (&amp;lt;abbr title=&amp;quot;engl. „central processing unit“&amp;quot;&amp;gt;CPU&amp;lt;/abbr&amp;gt;) angeschlossene [[Hardware]] interruptfähig sein, d.&amp;amp;nbsp;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).&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Nicht maskierbarer Interrupt ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Maskierbarer Interrupt ===&lt;br /&gt;
{{Überarbeiten|2=Dieser Abschnitt}}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Durch Software ausgelöster Interrupt ===&lt;br /&gt;
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 [[Systemaufruf|Systemaufrufe]]. {{Hauptartikel|Software-Interrupt}}&lt;br /&gt;
&lt;br /&gt;
=== Latenz ===&lt;br /&gt;
Die Zeit zwischen dem Anlegen des IRQ-Signals und dem Beginn der entsprechenden Verarbeitung nennt man [[Latenzzeit (Technik)|Latenz]]. Für einen Interrupt der höchsten vergebenen Priorität hängt die Latenz vor allem von der Hardware ab – mit [[Registerumbenennung|&amp;#039;&amp;#039;Schattenregistern&amp;#039;&amp;#039;]] 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. [[Echtzeitbetriebssystem]]e sind so organisiert und konfigurierbar, dass damit [[Echtzeitsystem|Echtzeitanforderungen]] leichter und beweisbar erfüllt werden können.&lt;br /&gt;
&lt;br /&gt;
=== Maskierung ===&lt;br /&gt;
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 [[Prozesssynchronisation|synchronisierende]] Routinen wie in Gerätetreibern notwendig sein. Die &amp;#039;&amp;#039;Maskierung&amp;#039;&amp;#039; (zeitweilige Sperrung / Deaktivierung) ist für alle Interrupts bis auf die &amp;#039;&amp;#039;nicht maskierbaren Interrupts&amp;#039;&amp;#039; ([[Hardwareinterrupt|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 &amp;#039;int IRQNUMMER&amp;#039; bei x86-Systemen von [[Linux]] genutzt, um von normalen Anwendungen über [[Systemaufruf]]e (syscalls) in den [[Kernel-Modus]] zu wechseln.&lt;br /&gt;
&lt;br /&gt;
=== Asynchronität ===&lt;br /&gt;
Externe Interrupts ([[Hardwareinterrupt]]s) 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 (&amp;#039;&amp;#039;Reentrance&amp;#039;&amp;#039;) des gleichen Interrupts geschaffen wird.&lt;br /&gt;
&lt;br /&gt;
Einige Prozessoren kennen spezielle Befehle, um sogenannte „[[Software-Interrupt]]“ aus einem laufenden Task heraus auszulösen, die außer den besonderen Ein- und Rücksprungbedingungen wie Unterprogrammaufrufe wirken und daher auch nicht asynchron sind. Das Gleiche gilt für [[Ausnahmebehandlung|&amp;#039;&amp;#039;Traps&amp;#039;&amp;#039;]], die von der CPU bei Fehlern (geschützte Zugriffe, verbotene Instruktionen (zum Beispiel Division durch Null), Singlestep Debugging, Memory-Management-Ereignisse, aber auch als Standard-Schnittstelle zu Betriebssystem-Aufrufen usw.) selbst ausgelöst werden und sinnvollerweise den gleichen Mechanismus benutzen.&lt;br /&gt;
&lt;br /&gt;
=== Interrupt-Service-Routinen als Programmierprinzip ===&lt;br /&gt;
Insbesondere bei hardwarenahen ereignisgesteuerten Anwendungen, wie sie in [[Eingebettetes System|eingebetteten Systemen]] üblich sind, ist eine mögliche Vorgehensweise, mehr oder weniger die gesamte Funktionalität des Systems in die Interrupt-Routinen bzw. in von diesen angestoßene Tasks zu verlegen. Der Prozessor kann dabei typischerweise in einen energiesparenden Ruhezustand (Idle State oder Leerlauf) versetzt werden, aus dem er bei Interruptanforderungen (also bei externen Ereignissen) erwacht. Das Hauptprogramm besteht im Extremfall nur noch aus einem Initialisierungsteil, welcher nach dem Systemstart durchlaufen wird, gefolgt von einer Endlosschleife, in der –&amp;amp;nbsp;abgesehen vom Aktivieren des o.&amp;amp;nbsp;g. Ruhezustands&amp;amp;nbsp;– nichts passiert.&lt;br /&gt;
&lt;br /&gt;
== Ablauf ==&lt;br /&gt;
[[Datei:Interrupt-Prozess.png|alt=Interrupt-Prozess: Unterbrechungsanforderung, Thread anhalten, Status speichern, Interrupt-Routine ausführen, Status wiederherstellen, unterbrochenen Thread fortführen.|mini|Vereinfachte Ablaufdarstellung]]&lt;br /&gt;
[[Datei:Was passiert bei einem Interrupt.webm|alt=Animation mit Tonspur, eine vereinfachte Darstellung des Ablaufs bei einem Interrupt.|mini|Animation zum Ablauf eines Interrupts]]&lt;br /&gt;
Im Interruptzyklus der CPU wird der alte (unterbrochene) [[Befehlszähler]]-Stand (bei Intel [[Codesegment]] und Instruction Pointer) und bei einigen Architekturen auch das [[Statusregister]] auf dem [[Stapelspeicher|Stack]] gespeichert. Nun muss bestimmt werden, welche Quelle die Unterbrechungsanforderung ausgelöst hat. Bei den meisten CPUs wird die Quelle innerhalb des Interruptzyklus über einen Wert auf dem Datenbus, der üblicherweise vom Interrupt-Controller gesetzt wird, identifiziert, dadurch der zugehörige [[Interruptvektor]] gefunden und der Sprung zu der passenden Unterbrechungsroutine (ISR) ausgelöst. Vor oder während der ISR muss noch die bearbeitete Unterbrechungsanforderung (IRQ) gelöscht werden, damit sie nicht erneut ausgelöst wird. Bei Intel(=PC)-kompatiblen Architekturen erfolgt dies durch Input/Output-Instruktionen innerhalb der Unterbrechungsroutine. So können u.&amp;amp;nbsp;U. ohne besondere Maßnahmen in der Software wegen der kurzen Laufzeit bis zur Löschinstruktion auch echte IRQs mit gelöscht werden. Bei einigen CPU-Architekturen, insbesondere bei [[Mikrocontroller]]n, kann es mehrere Interrupteingänge geben, wobei hier der Interrupt-Controller schon integriert ist. Bei einfachen CPUs erfolgt nur der IRQ und der Interruptzyklus, wobei per Software überprüft werden muss, welche Quelle der Auslöser war und dementsprechend welche Routine abzuarbeiten ist.&lt;br /&gt;
&lt;br /&gt;
Stehen bis zum Zeitpunkt des Interruptzyklus mehrere IRQs von mehreren Quellen an, so wird mittels eines Auswahlverfahrens durch die Hardware (Interrupt-Controller) der Vektor der wichtigsten Unterbrechungsanfrage bestimmt und abgearbeitet. Im Anschluss folgt die Bearbeitung der anderen noch anstehenden IRQs.&lt;br /&gt;
&lt;br /&gt;
Prinzipieller Ablauf beim Auftreten einer Unterbrechungsanfrage (Übergang von Hardware auf Software):&lt;br /&gt;
# Solange entweder der Interrupteingang der CPU oder der Einzelinterrupt auf dem Interrupt Controller maskiert ist, passiert nichts weiter. Interruptanforderungen werden auch nur nach Ablauf der gerade laufenden Instruktion akzeptiert. Normalerweise bleiben Interruptanforderungen bestehen, bis sie akzeptiert werden.&lt;br /&gt;
# Hardware (Interruptlogik des Interrupt-Controllers) bestimmt den [[Interruptvektor]] des aktivierten IRQs mit der höchsten Priorität, der nicht maskiert ist.&lt;br /&gt;
# Die CPU akzeptiert die Unterbrechungsanforderung und führt den Interruptzyklus durch, in dessen Verlauf (je nach CPU) der Interruptvektor vom [[Datenbus]] gelesen wird. Danach wird der Interrupteingang automatisch maskiert und somit gesperrt, damit nicht beliebig viele geschachtelte Interruptsequenzen auftreten können und den [[Puffer (Informatik)#Stacking (LIFO-Buffer)|Stack]] überlaufen lassen.&lt;br /&gt;
# Im Interruptzyklus der CPU wird der alte (unterbrochene) [[Befehlszähler]]-Stand (bei x86 [[Codesegment]] &amp;#039;&amp;#039;cs&amp;#039;&amp;#039; und Instruction Pointer &amp;#039;&amp;#039;eip&amp;#039;&amp;#039;) und bei einigen Architekturen auch das [[Statusregister]] auf dem [[Stapelspeicher|Stack]] gespeichert. Der neue Befehlszählerstand wird aus bestimmten Speicherstellen oder aus einer Interrupttabelle gelesen, deren Index aus dem Interruptvektor bestimmt wird. Die Vektoren selbst stellen im letzteren Fall jedoch nicht die indirekten Einsprungadressen dar.&lt;br /&gt;
# Die Software der Interrupt-Service-Routine (ISR) startet und muss zunächst die Inhalte aller Register, die sie selbst benutzen wird (ggf. auch das Statusregister, wenn es nicht automatisch gesichert wurde) auf den Stack kopieren, da sonst die Daten der unterbrochenen Tasks nicht wiederhergestellt werden können. (Wenn dabei Fehler gemacht werden, führt das zu zufälligen Fehlerauswirkungen in fremden Programmen, die nur schwer verfolgt werden können!)&lt;br /&gt;
# Die eigentliche Interrupt-Service-Routine läuft nun ab. Je nach Aufgabe werden zum Beispiel Ein- und/oder Ausgabendaten gepuffert zum Beispiel in einem [[Ringpuffer]]; hierbei gehen üblicherweise Zeitbezüge verloren, nicht aber Reihenfolgen. Bei Bedarf kann evtl. nach Aufruf einer speziellen Betriebssystemfunktion durch die ISR ein entsprechender Task durch den [[Scheduler (Informatik)|Scheduler]] des Betriebssystems gestartet (geweckt) werden. Da das eine Zeit dauert, kann evtl. zwischenzeitlich der gleiche Interrupt erneut auftreten, was im Algorithmus der ISR zu berücksichtigen ist, falls die Interrupts nicht ohnehin maskiert bleiben.&lt;br /&gt;
# Die Software der ISR stellt alle von ihr gesicherten [[Register (Prozessor)|Register]] wieder her (englisch to restore).&lt;br /&gt;
# Die ISR beendet sich durch einen Rücksprung (&amp;lt;abbr title=&amp;quot;Return from Interrupt&amp;quot;&amp;gt;RTI&amp;lt;/abbr&amp;gt;), der das Rückspeichern des alten Befehlszählers und ggf. des alten Statusregisters vom Stack bewirkt und der dadurch wieder seinen Stand wie vor der Unterbrechung hat (so als wäre nichts gewesen). Durch die Rückspeicherung des Statusregisters (das auch das Interrupt-Mask-Bit enthält) ist die Interruptlogik unmittelbar bereit, weitere IRQs zu akzeptieren.&lt;br /&gt;
# Die aufgerufene Task kann nun die weitere Bearbeitung der gepufferten Daten übernehmen.&lt;br /&gt;
&lt;br /&gt;
== Kategorisierung ==&lt;br /&gt;
Es wird zwischen präzisen Interrupts und unpräzisen Interrupts unterschieden. Präzise Interrupts halten die Maschine in einem wohldefinierten Zustand, unpräzise nicht.&amp;lt;ref&amp;gt;[[Andrew S. Tanenbaum|A. Tanenbaum]]: &amp;#039;&amp;#039;Moderne Betriebssysteme.&amp;#039;&amp;#039; Pearson Studium, 2009, ISBN 978-3-8273-7342-7, S. 109.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein [[Software-Interrupt]] ist ein Programmbefehl, der so wirkt wie ein Hardware-Interrupt, man spricht von einem expliziten Interrupt-Auftrag. Ein [[Hardwareinterrupt]] wird dagegen von außen über einen IRQ-Kanal oder -Pin an den Prozessor eingeleitet.&amp;lt;ref name=&amp;quot;Metzlar-379&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch nach ihrem Auslöser werden Interrupts unterschieden:&amp;lt;ref&amp;gt;W. Stallings: &amp;#039;&amp;#039;Operating Systems: Internals and Design Principles.&amp;#039;&amp;#039; Prentice Hall International, 2000, ISBN 978-0-13-031999-9, S. 17.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Die Ein-/Ausgabegeräte können ein Signal schicken, dass sie mit ihrer Aufgabe fertig sind oder einen Fehler hatten.&lt;br /&gt;
* Das Programm kann durch [[Arithmetischer Überlauf|arithmetischen Überlauf]], das Teilen durch Null, den Versuch, einen unerlaubten Maschinencode auszuführen, oder eine Referenz auf ein Ziel außerhalb des erlaubten Bereichs einen Interrupt auslösen. Hierbei schlägt eine prozessorinterne Fehlererkennung an und aktiviert den Interrupt auf prozessorinternen, aber rein hardwaremäßigen Signalwegen.&lt;br /&gt;
* Der [[Timer]] erlaubt dem Betriebssystem, Aufgaben regelmäßig zu erledigen. Dazu werden laufende Programme unterbrochen. So kann ein Timer sowohl in den Prozessor eingebaut sein als auch als externer Baustein vorliegen, in beiden Fällen wirkt sein Ablaufen wie ein Ein-/Ausgabeereignis.&lt;br /&gt;
&lt;br /&gt;
Ein weiterer Unterschied besteht in der Realisierung auf der signalverarbeitenden Ebene:&lt;br /&gt;
* Bei &amp;#039;&amp;#039;level-sensitiven&amp;#039;&amp;#039; Interrupts reagiert der Prozessor anhaltend und solange auf ein Interrupt-Signal, wie dessen vorgesehener [[Logikpegel]] anliegt, &amp;#039;&amp;#039;aktiv-high&amp;#039;&amp;#039; und &amp;#039;&amp;#039;aktiv-low&amp;#039;&amp;#039; sind mögliche Umsetzungen.&lt;br /&gt;
* Bei &amp;#039;&amp;#039;flanken-sensitiven&amp;#039;&amp;#039; Interrupts wird das Ereignis durch den Wechsel des Logikpegels selbst angezeigt und dann vom Prozessor für eine vorgegebene Zeitspanne gehalten, normal sind einige wenige Taktzyklen.&lt;br /&gt;
&lt;br /&gt;
Prozessor-Interrupts werden auch als Exceptions bezeichnet und können in drei Typen eingeteilt werden:&amp;lt;ref&amp;gt;A. Metzlar: &amp;#039;&amp;#039;BIOS. Das Praxisbuch.&amp;#039;&amp;#039; Franzis, 2004, ISBN 978-3-7723-6706-9, S. 85.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Aborts sind sehr wichtige Fehler, zum Beispiel Hardwarefehler,&lt;br /&gt;
* Fehler (Faults) treten vor Abschluss einer Anweisung auf,&lt;br /&gt;
* Traps treten nach Abschluss einer Anweisung auf (Einsatz beim Debuggen).&lt;br /&gt;
&lt;br /&gt;
== Hardware-Beispiel x86-Architektur ==&lt;br /&gt;
Alle Intel-Prozessoren haben einen Interrupt-Signaleingang für maskierbare Interrupts. Um mehrere Interruptquellen anschließen zu können, gibt es einen eigenen Interrupt-Controller-Baustein (zum Beispiel den {{lang|en|[[Programmable Interrupt Controller]]}}, PIC), der mehrere Interrupt-Eingänge besitzt und zu einem Signal zusammenführt. Außerdem ist er über interne [[Register (Prozessor)|Register]] konfigurierbar, sodass er je nach ausgelöstem Interrupt im CPU-Interruptzyklus verschiedene, vorgegebene [[Interruptvektor]]en auf den [[Bus (Datenverarbeitung)|Bus]] legt, die die CPU dann einliest. Bei neueren Prozessoren sind all diese Funktionalitäten mit in den Kern des [[Hauptprozessor]]s integriert.&lt;br /&gt;
&lt;br /&gt;
Bei [[X86-Prozessor|x86]]-Prozessoren sind 256 verschiedene Interruptvektoren möglich. Der Interruptvektor wird im Interruptzyklus des Prozessors als 8-Bit-Wert vom Datenbus gelesen. Bei x86-Prozessoren sind die Vektoren selbst nicht die indirekten Einsprungadressen. Der Vektor wird vielmehr im Real-Mode mit 4 multipliziert (binäres Verschieben), damit für jeden Vektor 32-Bit-Sprungadressen untergebracht werden können, zu denen dann gesprungen wird. Im Protected-Mode wird mit 8 multipliziert, weil ein Deskriptoreintrag 8&amp;amp;nbsp;Bytes lang ist. Im [[Real Mode]] befindet sich die Interrupttabelle in dem ersten Kilobyte des Hauptspeichers (0000h:0000h-0000h:03FFh). Jede Interruptnummer benötigt 4&amp;amp;nbsp;Bytes: 2&amp;amp;nbsp;Bytes für das [[Segmentierung (Speicherverwaltung)|Codesegment]] und 2 für den [[Speicheradresse#Segmentierte Adressen|Offset]] innerhalb des Segments. Im [[Protected Mode]] der CPU wird die Position der Tabelle durch die Interrupt-Deskriptor-Tabelle festgelegt. Hier werden für jeden Interrupt 8 Bytes für den [[Deskriptor (Prozessor)|Deskriptor]]-Eintrag der ISR benötigt.&lt;br /&gt;
&lt;br /&gt;
Bei modernen Systemen (zum Beispiel PCI-Systemen) können sich in der Regel mehrere Geräte einen Interrupteingang teilen (&amp;#039;&amp;#039;Interrupt-Sharing&amp;#039;&amp;#039; genannt). Die Behandlungsroutine für einen solchen Interrupt muss dann alle Treiber, deren Geräte diesen Interrupt ausgelöst haben könnten, aufrufen (am IRQ kann dies nicht festgestellt werden). Dabei kann es zu Problemen kommen, wenn einzelne Treiber zu lange aktiv sind, und in der Zwischenzeit im Gerät, welches den Interrupt ursprünglich ausgelöst hat, beispielsweise der Puffer voll wird und überläuft. Im schlimmsten Fall führt dies zu einem Datenverlust.&lt;br /&gt;
&lt;br /&gt;
Bei modernen Peripheriegeräten vergeben der Computer und das Betriebssystem selbst die IRQ-Nummern (PnP = [[Plug and Play|Plug-and-Play]]-Geräte); während bei alten Steckkarten, beispielsweise bei [[Industry Standard Architecture|ISA]]-Karten, die IRQ-Eingänge von Hand eingestellt werden müssen oder fest auf den Karten verdrahtet sind.&lt;br /&gt;
&lt;br /&gt;
Unter [[Linux]] kann man die Interrupts mit folgendem Befehl abfragen: &amp;lt;code&amp;gt;cat /proc/interrupts&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unter [[Microsoft Windows]] (XP und neuer) kann man die Interrupts mit folgendem Befehl abfragen: &amp;lt;code&amp;gt;msinfo32.exe&amp;lt;/code&amp;gt; → Hardwareressourcen → IRQs&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ IRQ-Geräte-Tabelle&amp;lt;br /&amp;gt;&amp;lt;small style=&amp;quot;font-weight:normal;&amp;quot;&amp;gt;(Diese Liste unterscheidet sich von System zu System)&amp;lt;/small&amp;gt;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot; style=&amp;quot;font-size:98%;&amp;quot;&lt;br /&gt;
! IRQ&lt;br /&gt;
! Verwendung&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding:0 10px 0 6px;text-align:right;&amp;quot; | 0&lt;br /&gt;
|style=&amp;quot;padding:0 6px;&amp;quot; | System-[[Taktgeber]]&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding:0 10px 0 6px;text-align:right;&amp;quot; | 1&lt;br /&gt;
|style=&amp;quot;padding:0 6px;&amp;quot; | [[Tastatur]]&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding:0 10px 0 6px;text-align:right;&amp;quot; | 2&lt;br /&gt;
|style=&amp;quot;padding:0 6px;&amp;quot; | Kaskadiert zu IRQ 9 (für 8–15)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding:0 10px 0 6px;text-align:right;&amp;quot; | 3&lt;br /&gt;
|style=&amp;quot;padding:0 6px;&amp;quot; | COM 2, 4, 6, 8 (EIA-232/[[RS-232]])&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding:0 10px 0 6px;text-align:right;&amp;quot; | 4&lt;br /&gt;
|style=&amp;quot;padding:0 6px;&amp;quot; | COM 1, 3, 5, 7&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding:0 10px 0 6px;text-align:right;&amp;quot; | 5&lt;br /&gt;
|style=&amp;quot;padding:0 6px;&amp;quot; | LPT 2 ([[IEEE 1284]]) oder [[Soundkarte]]&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding:0 10px 0 6px;text-align:right;&amp;quot; | 6&lt;br /&gt;
|style=&amp;quot;padding:0 6px;&amp;quot; | [[Diskette]]nlaufwerk (Floppy)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding:0 10px 0 6px;text-align:right;&amp;quot; | 7&lt;br /&gt;
|style=&amp;quot;padding:0 6px;&amp;quot; | LPT 1&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding:0 10px 0 6px;text-align:right;&amp;quot; | 8&lt;br /&gt;
|style=&amp;quot;padding:0 6px;&amp;quot; | [[Echtzeituhr]] (RTC)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding:0 10px 0 6px;text-align:right;&amp;quot; | 9&lt;br /&gt;
|style=&amp;quot;padding:0 6px;&amp;quot; | Zu IRQ 2 umgeleitet (aber auch [[VGA-Anschluss|VGA]] und [[Netzwerkkarte|NIC]], IRQ 16–23)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding:0 10px 0 6px;text-align:right;&amp;quot; | 10&lt;br /&gt;
|style=&amp;quot;padding:0 6px;&amp;quot; | Frei ggf. [[Peripheral Component Interconnect|PCI-Bus]]&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding:0 10px 0 6px;text-align:right;&amp;quot; | 11&lt;br /&gt;
|style=&amp;quot;padding:0 6px;&amp;quot; | Frei ggf. Adaptec-[[Small Computer System Interface|SCSI]]&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding:0 10px 0 6px;text-align:right;&amp;quot; | 12&lt;br /&gt;
|style=&amp;quot;padding:0 6px;&amp;quot; | [[PS/2-Schnittstelle|PS/2]] (Maus, andere Eingabegeräte)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding:0 10px 0 6px;text-align:right;&amp;quot; | 13&lt;br /&gt;
|style=&amp;quot;padding:0 6px;&amp;quot; | [[Gleitkommaeinheit|Mathematischer Coprozessor]] (FPU)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding:0 10px 0 6px;text-align:right;&amp;quot; | 14&lt;br /&gt;
|style=&amp;quot;padding:0 6px;&amp;quot; | Primärer [[Integrated Drive Electronics|IDE]] oder ATA&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding:0 10px 0 6px;text-align:right;&amp;quot; | 15&lt;br /&gt;
|style=&amp;quot;padding:0 6px;&amp;quot; | Sekundärer IDE oder ATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Kontextwechsel]]&lt;br /&gt;
* [[Beobachter (Entwurfsmuster)]]&lt;br /&gt;
* [[Ereignis (Programmierung)]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
{{Wiktionary|Interrupt}}&lt;br /&gt;
{{Wiktionary|Unterbrechungsroutine}}&lt;br /&gt;
{{Wikibooks|Computerhardware: Prozessor: Unterbrechungen|Erklärung von Unterbrechungen|suffix=Kapitel „Prozessor“ des Wikibooks „Computerhardware“}}&lt;br /&gt;
&amp;lt;!-- {{Commons|Interrupt}} --&amp;gt;&lt;br /&gt;
* [http://www.bjoern-koester.de/iogrundlagen/ I/O-Grundlagen]&lt;br /&gt;
* [http://www.ctyme.com/intr/int.htm Ralf Browns Interrupt List]&lt;br /&gt;
* [https://www.heise.de/ct/Redaktion/ciw/irq.html Interrupts, IRQs und Ressourcenkonflikte] auf heise.de&lt;br /&gt;
* [https://stanislavs.org/helppc/int_table.html Stanislavs Interrupt-Tabelle]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Normdaten|TYP=s|GND=4625501-1}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Rechnerarchitektur]]&lt;br /&gt;
[[Kategorie:Controller (Hardware)]]&lt;br /&gt;
[[Kategorie:Mikroprozessortechnik]]&lt;br /&gt;
[[Kategorie:Programmierung]]&lt;br /&gt;
[[Kategorie:Betriebssystemkomponente]]&lt;br /&gt;
[[Kategorie:Wikipedia:Artikel mit Video]]&lt;/div&gt;</summary>
		<author><name>134.109.211.54</name></author>
	</entry>
</feed>