Hyper-Threading im Detail

Prozesse und Threads

Bevor wir weiter auf Hyper-Threading eingehen, gilt es zunächst, die zu Grunde liegenden Begriffe und Hintergründe auf der Software-Seite zu definieren und zu erläutern. Unter einem Software-Prozess versteht man eine Instanz eines Programms in der Ausführung. Hierzu gehören insbesondere [1]:

  • das zeitlich invariante (unabhängige) Programm

  • ein Satz von Daten, mit dem der Prozess initialisiert wird

  • ein zeitlich varianter Zustand

  • sowie verschiedene Informationen über diesen Prozess.

Die Koordination zwischen den Prozessen eines Systems erfolgt einerseits dadurch, dass sie von sich aus bestimmte Zustände einnehmen. Andererseits kann ein spezieller Prozess hoher Priorität - ein Dispatcher - sie in definierte Zustände versetzen.

Prozesse sind mit einer Vielzahl von Zustandsinformationen verknüpft, die im Process Control Block (PCB) abgelegt werden. Deswegen eignen sie sich kaum, um nebenläufige Vorgänge innerhalb einer Anwendung zu realisieren. Ein Konzept, das hier Abhilfe schafft [2], ist der "leichtgewichtige" Prozess oder Handlungsfaden (Thread of Control). Einem solchen Thread ist nur ein minimaler Umfang von Kontextinformationen zugeordnet, die für den Ablauf wichtig sind: Prozessor-Register und -Zustand sowie Stack. Software, die solche Threads implementiert und verwaltet, bietet oft eine weitere Abstraktionsebene an. Auf ihr werden mehrere dieser Threads gruppiert und ihnen gemeinschaftlich die fehlenden Kontextelemente zugewiesen.

Ein Betriebssystem, das zu dieser Abstraktion beigetragen hat, ist der an der Carnegie-Mellon University entwickelte Mach-Kernel. Hier sind mehrere Threads zu einem Task zusammengefasst, der einen eigenen Adressraum besitzt. Bei Mach entspricht ein Task mit einem Thread einem Prozess bei Unix. Ein Thread ist somit ein sequenzieller Kontrollfluss, der nebenläufig zu weiteren im selben Adressbereich eines Tasks ausgeführt wird.