x86-Programmierung und -Betriebsarten (Teil 4)

Task-Switches im Betriebssystem

Zu betonen ist, dass es allein Aufgabe des Betriebssystems ist, den einzelnen Programmen einen entsprechend großen Anteil an der Prozessorzeit zuzuweisen. Die Steuerung der Task Switches ist alleinige Aufgabe des Betriebssystems, die Programme selbst haben bei einem richtigen Multitasking-Betriebssystem wie zum Beispiel Linux, OS/2 oder Windows NT/2000 keine Einflussmöglichkeiten darauf. Windows 3.x weicht davon erheblich ab. Hier entscheidet die Anwendung (und nicht Windows 3.x als Betriebssystemerweiterung), wann sie die Kontrolle an einen anderen Task (ein anderes Programm oder Windows selbst) abgibt. Eine sehr unangenehme Folge davon ist, dass der PC unter Windows 3.x scheinbar nicht oder nur sehr verspätet auf ein gewolltes Umschalten zu einem anderen Task reagiert (zum Beispiel über Strg-Esc). "Richtige" Multitasking-Betriebssysteme führen nämlich ein so genanntes Preemptive Multitasking aus, Windows 3.x dagegen ein Non-Preemptive Multitasking oder kooperatives Multitasking. Ab Windows 95 wird das Multitasking in beiden Formen implementiert, sodass es von den jeweiligen Programmen abhängt (für welche Windows-Version sie ursprünglich geschrieben worden sind), welches Verfahren zum Einsatz kommt, was in der Praxis jedoch leider mit Problemfällen einhergeht, was letztendlich auch vom jeweiligen "Programm-Mix" auf Ihrer Festplatte abhängt.

Das Betriebssystem DOS verwendet von den oben beschriebenen Funktionen nicht eine einzige. Auch die Treiber SMARTDRV.SYS und RAMDRIVE.SYS erstellen nur eine GDT und eine IDT, um Bytegruppen zwischen den unteren 1 MByte des Speichers und dem Extended Memory zu verschieben. Task-Switches und die umfangreichen und sehr nützlichen Zugriffsprüfungen werden in keiner Weise ausgenutzt.

Neben den bereits im Ansatz geschilderten Prüfungen und Besonderheiten beim Aufruf von Prozeduren oder dem Umschalten zwischen verschiedenen Tasks muss ein Systemprogrammierer noch viele weitere Einschränkungen und Vorsichtsmaßnahmen beachten. Erst dann ist es möglich, ein voll funktionsfähiges Betriebssystem zu programmieren, das eine aktuelle CPU voll ausnutzt. Mit diesem Thema könnte man natürlich ohne Probleme mindestens zwei dicke Bücher füllen. Wir wollen uns mit dieser Einführung begnügen. In den nächsten beiden Abschnitten werden dann noch die Schutzvorkehrungen für den zweiten Adressraum erläutert, nämlich die Zugriffsprüfungen für den I/O-Adressraum.