- Präemptives Multitasking
-
Der Begriff Multitasking [ˌmʌltiˈtɑːskɪŋ] (engl.) bzw. Mehrprozessbetrieb bezeichnet die Fähigkeit eines Betriebssystems, mehrere Aufgaben (Tasks) nebenläufig auszuführen. Dabei werden die verschiedenen Prozesse in so kurzen Abständen immer abwechselnd aktiviert, dass der Eindruck der Gleichzeitigkeit entsteht.
Inhaltsverzeichnis
Zweck des Multitasking
Multitasking kann bei verschiedenen Anforderungen nützlich sein, insbesondere bei der Optimierung der Auslastung und für eine gerechte oder prioritätsbasierte Ressourcenverteilung.
Der Grundgedanke hinter ersterem ist der, dass in einem durchschnittlichen Rechner der absolut überwiegende Teil der Rechenzeit nicht genutzt werden kann, weil häufig auf verhältnismäßig langsame, externe Ereignisse gewartet werden muss (beispielsweise den nächsten Tastendruck des Benutzers). Würde nur ein Prozess laufen, ginge diese Wartezeit komplett ungenutzt verloren. Durch Multitasking kann jedoch die Wartezeit eines Prozesses von anderen Prozessen genutzt werden. Dies kommt insbesondere auch der Interaktivität zugute.
Ist ein Rechner bzw. seine Rechenzeit demgegenüber größtenteils ausgelastet, beispielsweise auf großen Mehrbenutzer-Rechnern oder durch einzelne rechenintensive Prozesse, so können dennoch mehrere Benutzer oder Prozesse anteilige Rechenzeit erhalten, anstatt auf das Ende eines anderen Prozesses warten zu müssen.
Vorläufer und Entwicklung
Multiprogrammierung und TSR-Programme
Vorläufer des Multitasking ist die Multiprogrammierung mit dem Ziel einer höheren CPU-Auslastung im Gegensatz zur sequenziellen Ausführung der Aufgaben bei Stapelverarbeitung. Bei der Multiprogrammierung findet der Kontextwechsel der Programme mit dem Zugriff auf periphere Geräte statt, da dabei zwangsläufig Wartezeit entsteht. Erste Ansätze basieren auf dem Konzept von Christopher Strachey aus dem Jahr 1959. Praktisch umsetzen ließen sich solche Konzepte aber erst mit leistungsfähiger Hardware, als mit der Interruptsteuerung die Entwicklung von TSR-Programmen möglich wurde.
Allgemeiner Ablauf
Der technische Ablauf beim Multitasking ist im Prinzip immer gleich. Beim kooperativen Multitasking ähnelt er stark dem Aufruf von Prozeduren bzw. Funktionen in der prozeduralen Programmierung.
Wichtige Grundvoraussetzung ist hier, dass ein Prozess, der zugunsten eines anderen unterbrochen wird, nichts über diesen anderen oder ggf. auch mehrere andere „wissen“ muss. Dies bedingt, dass dem Prozess bei der weiteren Ausführung nach der Unterbrechung wieder eine definierte Umgebung, der Prozesskontext, zur Verfügung gestellt wird, auch wenn diese in anderen Prozessen eine andere/veränderte ist.
In der Regel wird dies erreicht, indem der gesamte Zustand des Prozesses unmittelbar vor der Unterbrechung gespeichert wird, z. B. auf dem Stapelspeicher (engl. Stack). Er bleibt solange gespeichert, bis der betreffende Prozess wieder Rechenzeit erhalten soll. Unmittelbar bevor dieser Prozess wieder aktiv wird, wird der gespeicherte Zustand wieder geladen, so dass es für den Prozess so erscheint, als sei er überhaupt nicht unterbrochen worden, unabhängig davon, ob, wie viele und was für Prozesse in der Zwischenzeit ausgeführt worden sind. Dieses Umschalten zwischen einzelnen Prozessen wird mit Taskwechsel bezeichnet.
Kooperatives Multitasking
Eine Weiterentwicklung der TSR-Konzeption ist das „kooperative Multitasking“, das ebenfalls auf dem Konzept der synchronen Interrupts aufsetzt. Hierbei wird das Multitasking durch eine Zentrale Prozessverwaltung im Systemkernel realisiert, die im Innenverhältnis des Betriebssystems als eine Art weiter entwickeltes TSR-Programm arbeitet und die Rechenleistung nacheinander an die gestarteten Prozesse abgibt. Von hier aus werden natürlich auch die Treiber gesteuert. Dabei ist es jedem Prozess selbst überlassen, wann er die Kontrolle an den Kern zurück gibt. Eine Prioritätszuweisung nach Wichtigkeit ist damit systembedingt ausgeschlossen. Vorteil dieser Methode ist, dass Systemfunktionen (z. B. Ein-/ Ausgabe) nicht reentrant sein müssen und daher nicht synchronisiert sein müssen, was eine erhebliche Vereinfachung für den Hersteller bedeutet. Diese Form des Multitasking hat allerdings vom TSR-Konzept den Nachteil übernommen, dass Programme, die ihre Kooperation abbrechen, das gesamte System zum Stillstand bringen können. Ein Grund für ein Abbrechen durch das Programm können enthaltene Fehler oder auch die gewollte Fehlfunktion eines Systems durch den Programmierer sein.
Eingesetzt wurde das Konzept eingeschränkt bereits in erweiterten TSR-Programmen für MS-DOS und Kompatible und in zahlreichen grafischen Oberflächen für diese Betriebssysteme. So wendete unter Anderen Windows 3.x dieses Konzept an. Unter diesem System wird Multitasking nicht unterstützt, da nur die jeweiligen Speicherbereiche nebeneinander existieren und die Anwendungen im Hintergrund zugunsten des aktiven Programms einfach angehalten werden.
Bis Windows 3.x gab es sogar Systemprogramme, die einen Prozess erst vollständig beendeten, bevor sie die Steuerung endlich an das System zurückgaben. Bei umfangreichen Kopieroperationen mit dem Dateimanager wurde dies eine zeitraubende Geduldsprobe. Diese Form des Multitasking war allerdings prinzipiell schnell und ressourcenschonend, da es technisch verhältnismäßig einfach realisierbar ist. Für multiuserfähige Großrechner war es nie eine praktikable Alternative und wurde z. B. unter UNIX (und ähnliche Betriebssystemen wie Linux) nie eingesetzt. Auch in den neueren Windows-Betriebssystemen der NT-Linie und Mac OS X wird diese inzwischen als veraltet geltende Technik nicht mehr eingesetzt, obwohl ähnliche Funktionalität in diesen Systemen noch begrenzt unterstützt wird (s. User Mode Threads), jedoch in jedem Fall nur eingebettet in präemptivem Multitasking.
Präemptives Multitasking
Die heutzutage standardmäßig angewendete Methode ist das präemptive Multitasking, bei dem der Betriebssystemkern die Abarbeitung der einzelnen Prozesse steuert (siehe unten) und jeden Prozess nach einer bestimmten Abarbeitungszeit zu Gunsten anderer Prozesse anhält. Diese „schlafen“ (sind inaktiv) und setzen während ‚ihrer‘ Zuteilung im Prozessor ihre Arbeit fort. Eine beliebte Umsetzung des präemptiven Multitaskings ist die Verwendung einer Vorrangwarteschlange in Verbindung mit der Round-Robin-Scheduling-Strategie. Dabei spricht man auch von so genannten Zeitschlitzen (bzw. Zeitscheiben, engl. time slicing). Damit wird jedem Prozess absolut oder pro definierter Zeiteinheit abhängig von dessen Rechenaufwand ein bestimmter Prozentteil dieser Zeit zugewiesen, die er höchstens nutzen kann.
Es gibt auch die Prozessorzuteilung abhängig von der Taskpriorität, vor allem bei Echtzeitsystemen z. B. microC/OS. Für das Multitasking spielt das nur eine untergeordnete Rolle, da präemptives Multitasking die Kernel- bzw. Prozessorkontrolle über die Prozesse beschreibt. Bei vielen heutigen Betriebssystemen lassen sich diese Konzepte kombinieren, vor allem um den Serverbetrieb zu optimieren. Außerdem muss man zwischen Time slicing (Zeitscheiben-Verfahren) und Time-Sharing unterscheiden, letzteres gestattet mehreren Benutzern bzw. deren Prozessen (z. B. auf Datenbankservern oder Großrechnern mit Terminalzugriff) sich automatisch anteilig die verfügbare Rechenzeit zu teilen.[1]
Hardwareseitig benötigt präemptives Multitasking im Gegensatz zur kooperativen Variante (vergl. TSR-Programm als Vorläufer) zwingend einen Zeitgeber in Verbindung mit einem geeigneten Prozessor, da das System softwareseitig sonst keine Möglichkeit hat, Prozessen die Kontrolle über den Prozessor zu entziehen. Der Zeitgeber sendet regelmäßig ein Signal (Interrupt) an die CPU, was sie zur Ausführung eines Schedulers veranlasst. Dieser unterbricht die Prozesse, übernimmt nötige Verwaltungsaufgaben und gibt die Kontrolle wieder an einen der Prozesse zurück.
Moderne Betriebssysteme arbeiten darüber hinaus mit einem Speicherschutz, der verhindert, dass verschiedene Prozesse sich im Speicher gegenseitig überschreiben. Diese Aufgabe übernimmt im PC die Memory Management Unit (MMU), die die Virtualisierung des Hauptspeichers und verschiedene Berechtigungslevel (Ringe) oder auch Modi (Kernel-Mode versus User-Mode) ermöglicht und so dem Betriebssystem erlaubt, verschiedene parallele Prozesse innerhalb des Rechners voneinander strikt abzukapseln. Im PC kam die MMU erstmals in Rechnern mit 80386 Prozessoren von Intel zum Einsatz. Diese Technik ist aber für Multitasking im engeren Sinne nicht zwingend notwendig.
Die ersten weit verbreiteten Computersysteme, die präemptives Multitasking beherrschten, waren der Sinclair QL (1984), der Amiga von Commodore International (1985), sowie zuvor die unter UNIX betriebenen Großrechenanlagen. Windows beherrscht erstmals in den 3.x-Versionen teilweise präemptives Multitasking, dort allerdings nur für DOS-Programme und das auch nur dann, wenn sie auf einem System mit einem 80386-kompatiblen Prozessor ausgeführt werden. Moderne Betriebssysteme, die präemptives Multitasking vollständig unterstützen, sind Windows NT (und alle Nachfolger), QNX und alle auf UNIX basierenden Systeme wie Linux, HP-UX, Solaris, Mac OS X u. v. m.
Quellen
- ↑ aus Artikel Timesharing, in: Meyers Taschenlexikon in 24 Bänden (B. I. Taschenbuchverlag) – Meyer nennt auch hier ausdrücklich Zeitscheiben im Mehrbenutzerbetrieb (auch MS Encarta Weltatlas verweist beim „Time-Sharing“ auf Mehrbenutzerbetrieb)
Literatur
- C. Strachey, Time Sharing in Large Fast Computers, Proceedings of the International Conference on Information Processing, UNESCO, 1959
- Multitasking Schwerpunkt Interaktive Systeme. TFH Berlin 2005
Siehe auch
Wikimedia Foundation.