Verwendung von Multitasking

Es gibt zwei Möglichkeiten, Multitasking zu implementieren: als einzelner Prozess mit mehreren Threads oder als mehrere Prozesse, jeweils mit einem oder mehreren Threads. Eine Anwendung kann jeden Thread, der einen privaten Adressraum und private Ressourcen erfordert, in einen eigenen Prozess versetzen, um ihn vor den Aktivitäten anderer Prozessthreads zu schützen.

Ein Multithreadprozess kann sich gegenseitig ausschließende Aufgaben mit Threads verwalten, z. B. das Bereitstellen einer Benutzeroberfläche und das Ausführen von Hintergrundberechnungen. Das Erstellen eines Multithreadprozesses kann auch eine praktische Möglichkeit sein, ein Programm zu strukturieren, das mehrere ähnliche oder identische Aufgaben gleichzeitig ausführt. Beispielsweise kann ein Named Pipe-Server einen Thread für jeden Clientprozess erstellen, der an die Pipe angefügt wird. Dieser Thread verwaltet die Kommunikation zwischen dem Server und dem Client. Ihr Prozess kann mehrere Threads verwenden, um die folgenden Aufgaben auszuführen:

  • Verwalten von Eingaben für mehrere Fenster.
  • Verwalten von Eingaben von mehreren Kommunikationsgeräten.
  • Unterscheiden von Tasks unterschiedlicher Priorität. Beispielsweise verwaltet ein Thread mit hoher Priorität zeitkritische Tasks, und ein Thread mit niedriger Priorität führt andere Tasks aus.
  • Gewährleisten einer reaktionsschnellen Benutzeroberfläche bei gleichzeitigem Zuweisen von Zeitsegmenten für im Hintergrund ausgeführten Tasks

Es ist in der Regel effizienter, wenn eine Anwendung Multitasking implementiert, indem ein einzelner Multithreadprozess erstellt wird, anstatt mehrere Prozesse zu erstellen. Dies hat folgende Gründe:

  • Das System kann einen Kontextwechsel für Threads schneller ausführen als für Prozesse, da ein Prozess mehr Aufwand als ein Thread hat (der Prozesskontext ist größer als der Threadkontext).
  • Alle Threads eines Prozesses nutzen denselben Adressraum und können auf die globalen Variablen des Prozesses zugreifen, was die Kommunikation zwischen Threads vereinfachen kann.
  • Alle Threads eines Prozesses können offene Handles für Ressourcen freigeben, z. B. Dateien und Pipes.

Es gibt andere Techniken, die Sie anstelle von Multithreading verwenden können. Die wichtigsten davon sind: asynchrone Eingabe und Ausgabe (E/A), E/A-Abschlussports, asynchrone Prozeduraufrufe (APC) und die Möglichkeit, auf mehrere Ereignisse zu warten.

Ein einzelner Thread kann mehrere zeitaufwändige E/A-Anforderungen initiieren, die gleichzeitig mit asynchroner E/A ausgeführt werden können. Asynchrone E/A kann auf Dateien, Pipes und seriellen Kommunikationsgeräten ausgeführt werden. Weitere Informationen finden Sie unter Synchronisierung und überlappende Eingabe und Ausgabe.

Ein einzelner Thread kann seine eigene Ausführung blockieren, während darauf gewartet wird, dass eines oder alle ereignisse eintreten. Dies ist effizienter als die Verwendung mehrerer Threads, die jeweils auf ein einzelnes Ereignis warten, und effizienter als die Verwendung eines einzelnen Threads, der Prozessorzeit verbraucht, indem ständig überprüft wird, ob Ereignisse auftreten. Weitere Informationen finden Sie unter Wait Functions.