Wafer

Wafer sind runde Scheiben aus vordotiertem Material mit Halbleitereigenschaften wie monokristallines Silicium, Siliciumcarbid, Gallium-Arsenid oder Indium-Phosphit. Wafer werden mittels verschiedener Verfahren (Zonenschmelz-Verfahren,  Czochralski-Verfahren (Liquid-Encapsulated-Czochralski-Verfahren (LEC)), Bridgman-Stockbarger-Verfahren, Vertical Gradient Freeze, Pedestalverfahren, Blockgussverfahren)  hergestellt. Die resultierenden runden Scheiben sind monokristallin und teilweise polykristallin. Die Oberfläche darf nur Unebenheiten von wenigen Nanometern aufweisen und  muss spiegelnd poliert sein. Auf der Oberfläche dieser Wafer werden mittels anspruchsvoller Verfahren die Strukturen mehrerer gleicher Chips (integrierte Schaltkreise, ICs) erzeugt. Diese Chips werden anschliessend ausgeschnitten.

Je grösser der Wafer,  desto geringer ist der geometrische Verschnitt. Deswegen ist die Grösse dieser Scheiben bedeutend für die Wirtschaftlichkeit des Prozesses. Heute arbeitet man mit 200 bis 300 mm Wafern bei Silicium (geplant sind 450 mm) und bei Gallium-Arsenid  mit 50 bis 150 mm Wafern (geplant: 200 mm). Früher waren solche Wafer wesentlich kleiner. Die Strukturbreiten der Chips befinden sich derzeit bei 45 Nanometer, 32 Nanometer oder 25 Nanometer bei NAND-Flash Bausteinen bzw. 22 Nanometer.  Nanoröhren-Transistoren werden bereits mit einer Strukturbreite von 18 Nanometer gefertigt. 

Physikalische Grenzen, Y-Transistoren, Optische Transistoren mit Photonischen Kristallen
Die Grenze des EUV-Lithografie-Verfahrens wird bei 22 Nanometer-Prozessen und darunter erreicht werden (ca. 2015).  Dann steht entweder ein grundsätzlicher Technologiewechsel in der Herstellung noch feinerer Strukturen (Strukturbreite) an, oder man erreicht eine höhere Packungsdichte von Transistoren auf diesen Chips mit anderen Materialien oder Prozessen.  Die derzeit diskutierten Möglichkeiten reichen von Y-Transistoren (Senkung der Leckströme) über optische Transistoren mit photonischen Kristallen  bis Quantencomputer oder Gencomputer.  Optische Transistoren könnten mit photonischen Kristallen mit Bandlücke gesteuert werden, die sich für Lichtwellen verhalten wie Halbleiter.  Eine Lichtwelle kann sich nicht in dem Kristall fortbewegen, wenn deren Frequenz in die Bandlücke fällt.                                 
Siehe auch:    EUV-Lithografie   Integrated-Circuit   Halbleiterspeicher   Mooresches-Gesetz   High-k-Dielektrikum   Strukturbreite   Chipsatz   Die   Packaging   Bridgman-Stockbarger-Verfahren

  Strukturierte-Analyse

Die Methode der Strukturierten Analyse (SA) von Tom DeMarco unterstützt die Analysephase im Softwareentwicklungsprozess. Die SA gibt eine formale  Systembeschreibung durch grafische Elemente die mit der Top-Down Methode Prozesse, Programmelemente und den Datenfluss modelliert. Dabei werden statische Elemente verwendet die um dynamische  Komponenten erweitert werden können. Elemente der Strukturierten Analyse sind: Kontextdiagramm, Datenflussdiagramm, Minispezifikation (formale Darstellung von atomaren Elementarprozessen mit  Einsatz von Pseudocodes, Entscheidungstabellen und Entscheidungsbäumen) und ein Data Dictionary (Datenverzeichnis welches einen Katalog von Metadaten (Datendefinitionen, Datenelemente) enthält). 

Das Ergebnis der SA wird durch die Methode des Strukturierten Designs (SD) soweit verfeinert, dass es in die Praxis umgesetzt werden kann. SD von  Yourdan und Constantine wendet modulares Design an, welches die Wechselwirkungen von übergeordneten Modulen beschreibt.                                               
Siehe auch:    CASE   UML   Ablaufdiagramm   Repository   Normalform   

  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 Thread darf nicht abhängig sein vom Ergebnis eines anderen Thread.
Siehe auch:    Multithreading   Simultaneous-Multithreading   NetBurst   Mehrkernprozessor   Pipeline-Architektur   Superskalar   Thread   Register   ALU   SMP

  Task

Unter Task versteht man ein Auftrag, der von einem Computer erledigt wird. Dabei kann es sich auch um Aufgaben für Peripheriegeräte wie Drucker oder Scanner handeln. Ist ein Computer bzw. das Betriebssystem in der Lage mehrere Tasks parallel  auszuführen, so spricht man von Multitasking. Dies ist beispielsweise bei allen neueren Windows-Betriebssystemen der Fall.

Durch das Task-Management werden den einzelnen Programmen die benötigten Ressourcen zugeteilt.  Eine Task (auch: Prozess) kann in mehrere Teilaufgaben zerlegt werden, die sequentiell abgearbeitet werden (Thread).                                                     
Siehe auch:    Thread   Multitasking   Multithreading   Hyper-Threading   Simultaneous-Multithreading   SMP   

  Multitasking

Ein multitaskingfähiges Betriebssystem (wie Windows) ist in der Lage, mehrere Aufgaben (Tasks, Prozesse) gleichzeitig zu bearbeiten.  So können Wartezeiten für ein bestimmtes Programm dazu genutzt werden um andere Prozesse zu bearbeiten. Es handelt sich dabei  nicht um echte Parallelverarbeitung, da eine CPU bisher nur einen Befehl auf einmal abarbeiten kann. Die Prozesse werden jedoch effizienter (in sog. Zeitscheiben) durch die Bearbeitung geschleust. Die Reihenfolge der Bearbeitung  wird durch den Scheduler festgelegt, der den Prozessen Prioritäten zuordnet. Dabei unterscheidet man die kooperative und die präemptive Methode: Kooperatives Multitasking und Präemptives Multitasking. 

Vorläufer des Multitasking war die Multiprogrammierung, bei der Kontextwechsel der Anwendungen bei Peripheriezugriffen stattfanden um die dabei entstehenden Wartezeiten zu nutzen. Durch den Einsatz der Interruptsteuerung  wurde TSR-Programmierung (Terminate and Stay Resident) möglich. Der allgemeine Ablauf zeichnet sich dadurch aus, dass ein Prozess, der für einen anderen Prozess in die Warteposition versetzt wird, keine Informationen  über diesen oder andere Prozesse benötigt. Dadurch kann diesem Prozess, wenn die Ausführung fortgesetzt wird, ein definierter Prozesskontext zur Verfügung gestellt werden, unabhängig davon, ob sich dieser in der  Zwischenzeit für andere Prozesse verändert hat. Dazu wird der gesamte Prozesszustand vor der Unterbrechung auf einem Stack gespeichert. Bei Fortsetzung der Ausführung wird dieser gespeicherte Prozesszustand wieder geladen -  dieser Vorgang wird Taskwechsel genannt.

Kooperatives Multitasking
Das kooperative Multitasking funktioniert ähnlich wie der Aufruf von Prozeduren bei der prozeduralen  Programmierung. Es handelt sich um eine weiterentwickelte Form der TSR-Programmierung nach dem Konzept der  synchronen Interrupts.

Das Multitasking wird im Betriebssystemkernel als zentrale Prozessverwaltung gesteuert. Das Betriebssystem weist jeder Anwendung eine Priorität zu, jedoch bestimmen die Prozesse selber, wann sie die  Kontrolle an den Kern zurückgeben. Die Anwendung mit der höchsten Priorität kann für sich die gesamte Rechenleistung bestimmen. 

Präemptives Multitasking
Auch beim präemptiven Multitasking werden vom Betriebssystem Prioritäten für die Programme vergeben, jedoch teilen sich die Prozesse die Rechenleistung, gegliedert nach Priorität. Ein einzelner Prozess kann  somit nicht die gesamte Rechenleistung beanspruchen. Das Betriebssystem steuert die Abarbeitungsfolge der Prozesse und weist ihnen Zeitscheiben (oder Zeitschlitze) zu. Ist die zugewiesene Zeit vergangen, so wird ein Prozess  angehalten um einen anderen zu starten. Die angehaltenen Prozesse werden inaktiv und dann wieder gestartet, sobald sich ein neuer Zeitschlitz für sie öffnet. Beim Scheduling der Prozesse können verschiedene Strategien angewendet werden.  Eine populäre Strategie ist die Anwendung von Vorrangwarteschlangen in Kombination mit der Round-Robin-Scheduling-Strategie. Die Auslastung des Systems ist besser verteilt und damit effektiver. 

Multitaskingfähige Betriebssysteme
Multitaskingfähige Betriebssysteme sind Windows, Unix, Linux, OS/2 oder Mac OS X und alle auf UNIX basierenden Betriebssysteme wie Solaris oder HP-UX.                         
Siehe auch:    Task   Thread   Multithreading   Multiuser   Hyper-Threading   Solaris   Kernel   Mac-OS-X   

  Thread

Ein Thread ist die kleinste ausführbare Einheit einer Task (Prozess). Ein Task wird dazu in Teilaufgaben unterteilt.  Threads werden auch als Faden bezeichnet, und Prozessoren, die mehrere Threads parallel verarbeiten können, als Multithreaded Prozessoren (die Multithreaded Anwendungen bearbeiten können). Das Betriebssystem  verwaltet die Threads, deswegen wird auch von Kernel-Thread gesprochen (vgl. User Thread). Ein Prozess wird durch eine sequentielle Abarbeitung von Kernel-Threads ausgeführt. 

Beim Multithreading teilen sich die Threads der entsprechenden Prozesse einige Ressourcen, wie das Codesegment, das Datensegment und die Dateideskriptoren. Jeder Thread verwendet jedoch seinen eigenen Befehlszähler und  Stack. Threads verwenden denselben Adressraum und können deswegen Interprozesskommunikation betreiben.  Manche Ressourcen können nur von dem erzeugenden Thread verwendet werden, wie z. B. das Windows-Handle. 

Threads innerhalb einer Task teilen sich Speicherressourcen sowie OS-abhängige Betriebsmittel wie Dateien und Netzwerkverbindungen. Daher erzeugen Threads weniger administrativen Aufwand als Prozesse, insbesondere  ist bei einem Thread-Wechsel kein vollständiger Wechsel des Prozesskontextes notwendig, da alle Threads einen Teil davon bereits nutzen. 

Thread-Wechsel sind beim hardwareseitigen Multithreading Performance-steigernd, da Konflikte in den Pipelines der Prozessoren (Pipeline-Hazards) reduziert werden. Beim softwareseitigen Multithreading erzeugen viele Thread-Wechsel  zusätzlichen Overhead, so dass sogar eine Leistungsminderung entstehen könnte.                                       
Siehe auch:    Task   Multithreading   Hyper-Threading   Simultaneous-Multithreading   SMP   Pentium-4   Pipeline-Architektur   Kernel   

  Multithreading

Beim Multithreading werden die einzelnen Tasks (Aufträge) in kleinere eigenständige Prozesse (= Threads) aufgeteilt.  Ein multithreading-fähiger Prozessor ist somit in der Lage, mehrere Threads auf einmal zu bearbeiten. Echte Parallel-Verarbeitung ist nur bei mehreren Prozessoren gegeben. 

Aber auch ein einzelner Prozessor, der multithreading-fähig ist, kann damit schneller arbeiten, wenn die Threads intelligent abgearbeitet werden, beispielsweise durch Verkürzung von Wartezeiten, optimale Auslastung bzw. Einlastung (Scheduling) von  Threads. Im Unterschied zum Multitasking bezieht sich die Nebenläufigkeit nicht nur auf Prozesse sondern auch auf Bearbeitungsstränge (Threads) innerhalb der Prozesse. Intel leitet seine Hyper-Threading-Technologie vom Multithreading ab.

Es handelt  sich um Simultaneous Multithreading (SMT) beim Pentium 4 und XEON Prozessor. Diese Technologie erhöht die Leistung von multi-threaded Anwendungen, indem sie die Auslastung der On-Chip-Ressourcen (welche in der Intel NetBurst Architektur verfügbar sind)  erhöht.

Die NetBurst-Ressourcen sind im Normalfall nur zu 30% + X ausgelastet. Hyper-Threading erhöht diese Auslastung durch entsprechende Logik und erzeugt einen zweiten logischen Prozessor.  Weitere Beispiele für Prozessoren mit Multithreading sind der UltraSPARC T1 (Niagara), UltraSPARC T2 (Niagara II) oder der Rock Prozessor von Sun Microsystems. 

Man unterscheidet softwareseitiges Multithreading und hardwareseitiges Multithreading. 

Softwareseitiges Multithreading
Beim softwareseitigen Multithreading steht meist nur ein Prozessor zur Verfügung. Die einzelnen Threads werden effizient auf die zur Verfügung stehenden Ressourcen aufgeteilt.  Die Anzahl der Threadwechsel sollte jedoch möglichst gering sein um den dadurch entstehenden Verwaltungsaufwand möglichst gering zu halten. 

Hardwareseitiges Multithreading
Beim hardwareseitigen Multithreading wird das Multithreading von der Hardware unterstützt,  indem z. B. mehrere Prozessorkerne die Thread-Abarbeitung parallelisieren oder indem ein Multithreaded Prozessor vorliegt. Ein Multithreaded Prozessor  kann mehrere Threads gleichzeitig abarbeiten. Dazu besitzt ein Thread einen eigenen Registersatz mit Stackpointer und Befehlszähler (Programcounter, Befehlszählregister). Häufige Thread-Wechsel  bewirken beim hardwareseitigen Multithreading sogar eine Steigerung der Performance, da Konflikte in den Pipelines der Prozessoren (Pipeline Hazards) reduziert werden können.  Multithreading-Prozessoren können unterschiedliche Strategien für die Aufteilung und Einlastung der Threads bzw. deren paralleler Verarbeitung anwenden:

1. Switch-By-Event: Ereignisse welchen einen Thread-Wechsel auslösen. 

2. Time-Slices: jedem Thread wird eine bestimmte Zeitspanne zugewiesen.

3. Simultaneous Multithreading (SMT). 

Thread
Grundsätzlich ist zu unterscheiden zwischen Prozess, Kernel-Thread und User-Thread. Ab ca. 1995 unterstützen die meisten Betriebssysteme alle 3 Kategorien.  Moderne Prozessoren sind i.d.R. mehrfädig, d.h. sie unterstützen hardwareseitiges Multithreading.                       
Siehe auch:    Multitasking   Pipeline-Architektur   Simultaneous-Multithreading   Hyper-Threading   SMP   Superskalar   Thread   Pentium-4   Dual-Core   NetBurst