Multitasking

aus Wikipedia, der freien Enzyklopädie
(Weitergeleitet von Präemptives Multitasking)
Wechseln zu: Navigation, Suche
Dieser Artikel erläutert den Informatik-Begriff Multitasking, zur Bedeutung in Bezug auf Menschen siehe Multitasking (Psychologie).

Der Begriff Multitasking [ˌmʌltiˈtɑːskɪŋ] (engl.) bzw. Mehrprozessbetrieb bezeichnet die Fähigkeit eines Betriebssystems, mehrere Aufgaben (Tasks) (quasi-)nebenläufig auszuführen. Im Allgemeinen bietet der Prozessor hierzu auch unterstützende Hardware-Strukturen. Die verschiedenen Prozesse werden in so kurzen Abständen immer abwechselnd aktiviert, dass der Eindruck der Gleichzeitigkeit entsteht. Multitasking ist somit ein Synonym für Zeit-Multiplexverfahren. Besitzt ein Computer mehrere CPU-Kerne, so dass er mehrere Aufgaben echt-gleichzeitig ausführen kann, so spricht man von Multiprocessing. In modernen Computern werden beide Verfahren kombiniert eingesetzt.

Zweck des Multitasking[Bearbeiten]

Multitasking kann bei verschiedenen Anforderungen nützlich sein, insbesondere bei der Optimierung der Auslastung und für eine je nach Zielsetzung ausgeglichene oder prioritätsbasierte Ressourcenverteilung.

Der Grundgedanke hinter der „Optimierung der Auslastung“ ist der, dass in einem durchschnittlichen Rechner der überwiegende Teil der Rechenzeit nicht genutzt werden kann, weil häufig auf verhältnismäßig langsame, externe Ereignisse gewartet werden muss (beispielsweise auf den nächsten Tastendruck des Benutzers). Würde nur ein Prozess laufen (zum Beispiel die wartende Textverarbeitung), so ginge diese Wartezeit komplett ungenutzt verloren (siehe „aktives Warten“). Durch Multitasking kann jedoch die Wartezeit eines Prozesses von anderen Prozessen genutzt werden.

Ist ein Rechner bzw. seine Rechenzeit demgegenüber größtenteils ausgelastet, beispielsweise 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. Dies kommt insbesondere auch der Interaktivität zugute.

Da das System zugleich für die verschiedenen Prozesse Prioritäten berücksichtigen kann, ist eine entsprechende Gewichtung möglich, je nach Zielsetzung. Ein Server kann zum Beispiel die Dienste bevorzugen, welche er anbieten soll, jedoch direkte Benutzer-Interaktionen niedrig priorisieren. Ein Desktop-PC wird umgekehrt vor allem die Ein- und Ausgaben von/an den Benutzer bevorzugen, und dafür Hintergrund-Prozesse etwas zurückstellen.

Vorläufer und Entwicklung[Bearbeiten]

Multiprogrammierung und TSR-Programme[Bearbeiten]

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[Bearbeiten]

Der technische Ablauf beim Multitasking ist im Prinzip immer gleich.

Als wichtige Grundvoraussetzung des Multitaskings gilt im Allgemeinen, dass ein Prozess, der zugunsten eines anderen unterbrochen wird, nichts über diesen anderen (oder ggf. auch mehrere andere) „wissen“ muss. Dies wird meist erreicht, indem jeder Prozess einen eigenen sogenannten Prozesskontext besitzt, der seinen Zustand beschreibt. Ein Prozess ändert immer nur seinen eigenen Prozesskontext, niemals den eines anderen Prozesses.

In der Regel wird der gesamte Prozesskontext (der Zustand des Prozesses) beim Unterbrechen gespeichert, z. B. auf dem Stapelspeicher (engl. Stack). Er bleibt so lange gespeichert, bis der betreffende Prozess wieder Rechenzeit erhalten soll. Unmittelbar bevor dieser Prozess wieder aktiv wird, wird der gespeicherte Zustand wieder geladen, sodass 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.

So kann ein Prozess bei der weiteren Ausführung nach der Unterbrechung wieder eine definierte Umgebung vorfinden, auch wenn zwischenzeitlich andere Prozesse ausgeführt wurden.

Beim kooperativen Multitasking ähnelt der Taskwechsel stark dem Aufruf von Prozeduren bzw. Funktionen in der prozeduralen Programmierung.

Kooperatives Multitasking[Bearbeiten]

Beim „kooperativen Multitasking“ wird das Multitasking durch eine zentrale Prozessverwaltung im Systemkernel realisiert: ein einfacher, sogenannter Scheduler. Der Scheduler sichert den Prozesskontext der gerade unterbrochenen Task, wählt den nächsten Prozess aus, der Rechenzeit erhalten soll, stellt dessen Prozesskontext her und gibt den Prozessor dann an diesen neuen Prozess ab. Der Scheduler kann Listen mit verschieden priorisierten Tasks führen, und niedrig priorisierte entsprechend selten aufrufen. Dabei kann auch die bereits verbrauchte Rechenzeit einer Task berücksichtigt werden. In der Regel werden Betriebssystem-interne Aufgaben zuerst erledigt, bevor eine neue Task den Prozessor erhält. Es ist jedem Prozess selbst überlassen, wann er die Kontrolle an den Kern zurückgibt; in der Regel wird zumindest jede Dienst-Anforderung an das Betriebssystem mit einem Taskwechsel verbunden.

Vorteil dieser Methode ist, dass viele Systemfunktionen (z. B. die Ausgabe) nicht wiedereintrittsfähig sein müssen und daher nicht synchronisiert sein müssen, was eine erhebliche Vereinfachung für den Hersteller bedeutet. (Unterbrechungsroutinen müssen jedoch stets dieses Problem lösen.) Diese Form des Multitasking hat wie auch das TSR-Konzept den Nachteil, dass Programme, die nicht kooperieren, das restliche System zum Stillstand bringen. Gründe für solches Programmverhalten können sein:

  • im Programm enthaltene Fehler;
  • durch den Programmierer gewollte Fehlfunktion eines Systems;
  • gewollte (vorteilhafte) „Alleinherrschaft“ des Programms, zum Beispiel für eine zeitkritische Anwendung wie ein Computerspiel.

Das Konzept wurde zum Beispiel eingesetzt

  • bei Windows 3.x: Unter diesem System wird Multitasking nur teilweise unterstützt, da nur die jeweiligen Speicherbereiche nebeneinander existieren und die Anwendungen im Hintergrund zugunsten des aktiven Programms einfach angehalten werden.
  • bei vielen Heimcomputern wie zum Beispiel dem Atari ST.
  • in grafischen Oberflächen für MS-DOS und Kompatible.
  • (eingeschränkt) in erweiterten TSR-Programmen für MS-DOS.

Diese Form des Multitasking ist prinzipiell schnell und ressourcenschonend, sowie technisch verhältnismäßig einfach realisierbar. Für multiuserfähige Großrechner war es nie eine praktikable Alternative und wurde z. B. unter Unix nie eingesetzt, da ja ein Benutzer mittels unkooperativem Programm alle anderen blockieren könnte. Auch in den neueren Windows-Betriebssystemen der NT-Linie und in Mac OS X wird diese inzwischen als veraltet geltende Technik nicht eingesetzt. Teilweise unterstützen sie ähnliche Funktionalität begrenzt zum Beispiel als User Mode Threads, jedoch in jedem Fall nur eingebettet in präemptivem Multitasking.

Präemptives Multitasking[Bearbeiten]

Basis der heutzutage standardmäßig angewendete Methode ist das präemptive Multitasking. Die Abarbeitung der einzelnen Prozesse wird ebenfalls gesteuert durch den Scheduler, ein Bestandteil des Betriebssystemkerns (siehe unten). Jeder Prozess wird nach einer bestimmten Abarbeitungszeit unterbrochen. Dabei spricht man auch von so genannten Zeitschlitzen (bzw. Zeitscheiben, engl. time slices). Dann „schläft“ der Prozess (ist inaktiv) und andere Prozesse werden bearbeitet. Erhält er wieder eine Prozessorzuteilung, so setzt er seine Arbeit fort (ist aktiv). Meist wird jedem Prozess eine „absolute“ Zeitscheibe zugewiesen (alle Zeitscheiben haben die gleiche, feste Dauer); alternativ wird ihm pro definierter Zeiteinheit ein bestimmter Prozentteil dieser Zeiteinheit zugewiesen (z. B. abhängig von seiner Priorität), den er höchstens nutzen kann (die Länge der Zeitscheibe wird also jedes Mal neu bestimmt). Endet seine Zeitscheibe („seine Prozessorzuteilung ist zu Ende“), dann unterbricht ihn ein Hardware-Timer, er wird wieder „schlafen gelegt“ und das Betriebssystem erlangt wieder Kontrolle. Sollte er bereits vor Ablauf seiner Zeitscheibe eine Funktion des Betriebssystems benötigen, so wird er sogleich angehalten und als „nicht rechenbereit“ markiert, bis das Betriebssystem den gewünschten Dienst erbracht hat. Nur als „rechenbereit“ markierte Prozesse erhalten Prozessorzeit-Zuteilungen.

Eine beliebte Umsetzung des präemptiven Multitaskings ist die Verwendung einer Vorrangwarteschlange in Verbindung mit der Round-Robin-Scheduling-Strategie. Es gibt auch die Prozessorzuteilung abhängig von der Taskpriorität, vor allem bei Echtzeitsystemen z. B. MicroC/OS-II. Für das Multitasking spielt das nur eine untergeordnete Rolle, da präemptives Multitasking die Kernel- bzw. Prozessorkontrolle über die Prozesse beschreibt.

Hardwareseitig benötigt präemptives Multitasking im Gegensatz zur kooperativen Variante (vergl. TSR-Programm als Vorläufer) zwingend einen Interrupterzeuger (meist ein Zeitgeber) im geeigneten Prozessor, da das System softwareseitig keine Möglichkeit hat, Prozessen die Kontrolle über den Prozessor zu entziehen. Der Zeitgeber sendet regelmäßig oder nach Ablauf einer eingestellten Zeit ein Signal (Interrupt) an die CPU, was sie zur Unterbrechung der aktuell laufenden Task und zur Ausführung des Schedulers veranlasst. Dieser speichert den gerade unterbrochenen Prozesskontext, übernimmt nötige Verwaltungsaufgaben und aktiviert dann wieder einen (anderen) Prozess.

Moderne Betriebssysteme arbeiten darüber hinaus mit einem Speicherschutz, der verhindert, dass verschiedene Prozesse sich im Speicher gegenseitig beeinflussen oder gar überschreiben. Diese Schutzfunktion übernimmt im PC die Memory Management Unit (MMU), welche 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 i286-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) und der CommodoreAmiga (1985) im Heimbereich (beim Amiga ohne Speicherschutz/Privilegierung und somit „aushebelbar“), 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 i386-kompatiblen Prozessor ausgeführt werden, da dieser in solchen Fällen hardwareseitige Virtualisierung ermöglicht. Moderne Betriebssysteme, die präemptives Multitasking vollständig unterstützen, sind Windows NT (und alle Nachfolger), QNX, BeOS und alle auf Unix basierenden Systeme wie Linux, HP-UX, Solaris, Mac OS X u.v.m.

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]

Präemptibles Multitasking[Bearbeiten]

Eine Sonderform des präemptiven Multitasking ist das weniger bekannte Präemptible Multitasking (englische Schreibweise Preemptible Multitasking), das erstmals im Betriebssystem OS/2 implementiert wurde. Viele Betriebssystem-eigene Kernel-Routinen werden als Scheduler-Threads geführt; somit können Anwendungsprozesse auch Zeitschlitze erhalten, während eigentlich eine Betriebssystem-Aktion ausgeführt wird (mit Ausnahmen für atomare OS-Prozesse).[2] Das Konzept ermöglicht schnellere Reaktionszeiten. Mit Version 2.6 hat es auch in den Linux-Kernel Eingang gefunden.[3]

Siehe auch[Bearbeiten]

Literatur[Bearbeiten]

  • C. Strachey, Time Sharing in Large Fast Computers, Proceedings of the International Conference on Information Processing, UNESCO, 1959
  • Klaus D. Thies, Echtzeit-Multitasking: Der Kernel - Elementare Einführung in die parallele Systemprogrammierung [SHAKER-Verlag, Aachen]

Einzelnachweise[Bearbeiten]

  1. 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)
  2. Präemptibler Kernel ab Linux 2.6, von http://articles.tutorialonline.biz, abgerufen 14. September 2012
  3. Informationen auf www.jakoxx.de