Interrupt-Request

Ein Interrupt-Request (IRQ) ist ein Signal, das den Prozessor bei seiner Arbeit unterbricht, um andere dringende Aufgaben an die CPU zu leiten.  Der Interrupt-Handler entscheidet, wie auf diesen Interrupt reagiert werden soll: zur späteren Bearbeitung speichern oder  sofort darauf reagieren. Man unterscheidet Software- und Hardwareinterrupts. Letztere werden von einem Peripheriegerät ausgesandt und haben die Funktion, Daten von aussen zu empfangen. Jedes Peripheriegerät hat eine Nummer für seine IRQ (Interrupt  Request). Es können sich auch mehrere Geräte eine Nummer teilen.  Multitasking wird durch die Interrupt-Technologie ermöglicht. Softwareinterrupts dienen dazu, um beispielsweise Funktionen des Betriebssystems zwischendurch auszuführen. Wird eine bestimmte Flag gesetzt, um wichtige Arbeiten  des Prozessors nicht zu unterbrechen, der Interrupt also ausgesetzt, so nennt man das Interrupt-Maskierung. Unterschiedliche Prioritäten bezeichnet man als Interrupt-Ebenen. Der Interrupt-Controller ist für die Verwaltung und  Weiterleitung von Interrupts zuständig. IRQ-Konflikte entstehen, wenn mehrere Geräte gleichzeitig den gleichen Interrupt verwenden. Die Konsequenzen reichen von einer Fehlfunktion bis zum Absturz des Rechners.

IRQ - Belegung
 
IRQ 0 - System Timer Interrupt from Timer
IRQ 1 - Keyboard
IRQ 2 - Kaskadiert mit 2. IRQ-Controller
IRQ 3 - COM2 Serielle Schnittstelle
IRQ 4 - COM1 Serielle Schnittstelle
IRQ 5 - LPT2
IRQ 6 - Floppy Disk Controller 
IRQ 7 - Parallele Schnittstelle LPT1
IRQ 8 - Realtime Clock
IRQ 9 - Umgeleiteter IRQ 2
IRQ 10 - frei
IRQ 11 - frei
IRQ 12 - frei
IRQ 13 - Mathematischer Coprozessor
IRQ 14 - Primary Hard Disk Controller
IRQ 15 - Secondary Hard Disk Controller                                         
Siehe auch:    CPU   Plug-und-Play   Mainboard   Bus-Mastering   MCA   PCI-Express   Grafikkarte   Riser-Karte   

  Hyper-Threading

Hyper-Threading wurde von Intel entwickelt. Die Abarbeitung von Multithreaded Anwendungen werden optimiert indem die Ressourcen der CPU besser ausgenutzt werden.  Die Threads werden auf 2 logische Prozessoren aufgeteilt und vom Betriebssystem mit Hilfe von (S)MP-Verfahren (Symmetrisches Multiprozessorsystem) abgearbeitet. 

Hintergrund für die Einführung der Hyper-Threading-Technology
Verschiedene Möglichkeiten die Performance des Prozessors zu erhöhen wurden ausprobiert: Steigerung der Taktzyklen, Prefetching oder erweiterte  L1- bzw. L2- oder L3-Caches. Jedoch ergaben sich daraus einige Probleme: die mögliche Leistungssteigerung durch schnellere Taktzyklen erfolgt nicht linear zur Taktzahl sondern unterproportional und bedingt auch einen höheren Stromverbrauch und Abwärme.  Die Abwärmeproblematik bewog Intel dann auch zur Aufgabe der NetBurst-Architektur. Die 20 Pipeline-Stufen des Pentium 4 bewirken zudem eine wachsende Anzahl von Cache Misses (Cache Hit:  Daten sind bei der Anfrage im Cache vorhanden, Cache Miss: Daten sind bei der Anfrage nicht im Cache vorhanden) sowie Interrupts und fehlerhafte Sprung-Voraussagen. Eine Vergrösserung der Caches ist nicht wirklich effizient:  neben Kostensteigerungen in der Produktion wachsen mit grösseren L1- oder L2-Caches die Anforderungen zur Aufrechterhaltung höherer Taktzyklen oder geringerer Antwortzeiten.

Es wurde versucht, die Anzahl der Instruktionen pro Taktzyklus durch  Instruction-Level-Parallelism (ILP) zu erhöhen. Massnahmen dazu waren: Instruction Pipelining, Superskalarität, Out-of-Order-Execution, Registerumbenennung, Sprungvorhersagen und Speculative Execution.  Die parallele Ausführung mehrerer Threads wird durch replizierte Ressourcen bei modernen Prozessoren unterstützt, ist jedoch nicht immer sehr effektiv. Die Strategie der Out-of-Order Execution beispielsweise ermöglicht bei  superskalaren Prozessoren zwar Befehle ausserhalb der seriellen Reihenfolge auszuführen und damit die Pipelines besser auszulasten, bedingt jedoch, dass immer genügend Befehle zur Verfügung stehen, um die Prozessor-Ressourcen optimal auszulasten.  Die Tendenz, Errungenschaften aus dem Serverbereich auf den Desktopbereich zu übertragen trägt auch beim Hyper-Threading Rechnung: im Serverbereich wird schon länger mit zwei vollständigen Prozessoren (2-Prozessor-Systeme) gearbeitet, die in der Lage  sind, 2 Threads parallel abzuarbeiten.

Hyper-Threading-Technologie
Hyper-Threading wurde bei den Intel Prozessoren mit NetBurst Architektur eingeführt und ist eine Variante des hardwareseitigen Multithreading.  Die Hyper-Threading-Technology (HTT) funktioniert nur bei Multithreaded-Prozessoren (Mehrfädige Prozessoren). Dazu besitzt der Prozessorkern mehrere Registersätze und Programmzähler. Aus einem physischen Prozessor werden 2 logische Prozessoren, die  sich als solche auch beim Betriebssystem ausgeben. Beim Intel Pentium 4 Prozessor mit Northwood Kern wurden Hyper-Threading Ressourcen aktiviert (die auch schon beim Willamette-Kern vorhanden waren). Dabei handelt es sich um einen Trace Cache Next IP,  Instruction Streaming Buffers, ein Return Stack Predictor, Register Alias Tables, einen Next Instruction Pointer, ein Instruction TLB (Translation Lookaside Buffer) sowie Trace Cache Fill Buffers. Zudem verfügt jeder virtuelle Prozessorkern über  einen eigenen Interrupt Controller (Advanced Programmable Interrupt Controller). Der Trace Cache, die L1- und L2-Caches sowie die Instruction Queues, Memory Operation Queues und der Key Buffer werden aufgeteilt  (Ressourcen-Sharing). Ein Prozessorkern ist damit in der Lage, Threads simultan zu verarbeiten. Threads werden in mehrere Teilaufgaben zerlegt und durch parallel arbeitende Pipeline-Stufen abgearbeitet. Dazu  sind mehrere Registersätze und ein angepasstes Steuerwerk vorhanden. Ein Thread besitzt dazu einen eigenen Registersatz mit Stackpointer und Programcounter. Damit Hyper-Threading funktioniert, sollte das Betriebssystem SMP-Architekturen unterstützen.  Denn die CPU bzw. die Prozessorkerne sind beim Hyper-Threading softwaretechnisch ähnlich gesteuert wie ein SMP-System. Weiterhin sollte das Betriebssystem Multitasking-fähig sein und Kernel-Level-Threads unterstützen. 

Hyper-Threading Ressourcen werden unterteilt in:

1. Replicated Ressources: Replicated Ressources sind nachgebildete Ressourcen, bei denen die beiden virtuellen Prozessorkerne (Siblings - Geschwister) über einige der Ressourcen als eigene  Kopie verfügen. Dazu gehören ein vollständiger Registersatz mit Stackpointer und Programcounter (Befehlszählregister, Befehlszähler, Programmzähler, Instruction Pointer). 

2. Partitioned Ressources (unterteilte Ressourcen): die Ressourcen werden unter den Siblings aufgeteilt. Dazu gehören der Record Buffer, die Load/Store Buffer und die Instruction Queues. 

3. Shared Ressources (geteilte Ressourcen): die Siblings müssen sich Ressourcen mit anderen Siblings aufteilen. Oftmals können sie nur von einem Sibling gleichzeitig verwendet werden. Dazu zählen u.a. die ALU und die FPUs  (Floating Point Unit). Wenn das Betriebssystem die notwendigen Voraussetzungen erfüllt, können Standard-Anwendungen um bis zu 20% beschleunigt werden und entsprechend optimierte Anwendungen um bis zu 33%. 

Hyper-Threading Unterstützung durch Prozessoren und Betriebssysteme
Zu den Prozessoren, welche Hyper-Threading unterstützen gehören: Pentium 4 (ab Northwood mit 3066 MHz, Prescott, Prescott 2M und Cedar Mill),  Pentium Extreme Edition (Dual Core Prozessor Pentium D mit freigeschaltetem Hyper-Threading: Smithfield und Presler, Pentium EE) und die XEON 603/604.  Bei AMD: Athlon 64 X2, Opteron Dual Core Prozessoren und der Phenom. Betriebssysteme, welche Hyper-Threading unterstützen, sind: Windows XP, Windows Vista, Windows Server 2003, FreeBSD und Linux ab Kernel-Version 2.4.17.  Windows 2000 unterstützt zwar Hyper-Threading, kann es aber nicht effizient ausnutzen, da Windows 2000 nicht über eine Unterscheidung zwischen physikalischen und logischen Prozessoren verfügt.  Compiler, welche Hyper-Threading-fähigen Code erzeugen sind: die Intel-Compiler und die GNU Compiler Collection (GCC).  Voraussetzung ist jedoch, dass die Anwendungen parallelisierbar sind: die Abarbeitung eines Threads darf nicht abhängig sein vom Ergebnis eines anderen Threads.
Siehe auch:    Multithreading   Simultaneous-Multithreading   NetBurst   Mehrkernprozessor   Pipeline-Architektur   Superskalar   Thread   Register   ALU   SMP