MT: Multitasking-Kern für DOS-Programme

Arbeitsweise und Eigenschaften
Start des Multitasking-Kerns
Tipps für Anwender
Funktionale Einschränkungen
Tipps für Programmierer

Arbeitsweise und Eigenschaften

Mit dem Multitasking-Kern MT.COM arbeiten bis zu acht normale DOS-Programme gleichzeitig. Da MT vollständig im Real Mode und im unteren MByte des PC-Speichers abläuft, ist keine dauernde Protected-/Real-Mode-Umschaltung erforderlich, so dass eine sehr hohe Geschwindigkeit erzielt wird. Insbesondere Anwendungen, die häufig auf Schnittstellen zugreifen oder mit Interrupts arbeiten, können dadurch wesentlich schneller als unter OS/2, Windows oder Unix auf Ereignisse reagieren. Die typische Umschaltzeit zwischen zwei Prozessen liegt unter einer Millisekunde.

MT ist nicht dafür gedacht, um speicherfressende und dialogorientierte Applikationen wie eine Textverarbeitung und eine Datenbank parallel laufen zu lassen. Vielmehr handelt es sich um ein Werkzeug für multitasking-basierende Applikationen in der Mess-, Steuer-, Regel- und Kommunikationstechnik. Durch die geringen Hardware- und Speicheranforderungen eignet sich MT auch optimal zur Implementation in DOS-basierenden, dedizierten Steuerungs-Rechnern; eine Hardware-Kompatibilität mit IBM-PCs ist nicht erforderlich.

Gegenüber speziellen Multitasking-Betriebssystemen ist MT vollständig DOS-kompatibel und stellt keinerlei spezielle Anforderungen an Applikations-Software. Jedes halbwegs nach den für MS-DOS geltenden Programmier-Empfehlungen geschriebene Programm wird sofort und ohne Änderungen im Multitasking-Betrieb arbeiten.

Die einzelnen Applikationen sind selbst dafür verantwortlich, ob, wann und an welcher Stelle des Bildschirms sie Informationen ausgeben, damit Ausgaben anderer Tasks nicht überschrieben werden (MT ist kein "Windows"). Allerdings hat der Anwender die Möglichkeit, nur die Ausgaben der zuletzt geladenen "obersten" Task zuzulassen, um ein Durcheinander auf dem Bildschirm zu verhindern. Ferner werden Tastendrücke stets nur zur zuletzt geladenen Task weitergereicht.

Start des Multitasking-Kerns

Bitte kopieren Sie zunächst den Multitasking-Kern MT.COM sowie das nur als Beispiel-Task dienende Programm TASK.COM von der gelieferten Diskette in ein beliebiges Verzeichnis auf der Festplatte Ihres Computers. Falls die Diskette eine Datei README enthält, lesen Sie diese bitte sorgfältig; sie enthält zusätzliche Hinweise zum Einsatz der Software.

Der Multitasking-Kern wird folgendermaßen am DOS-Prompt gestartet:

MT [/L] [/N] Prog1 Cmd1 + Prog2 Cmd2 + ...

Dabei bedeuten im einzelnen:

MT
/L
/N
Prog
Cmd
+
Name des Multitasking-Kerns (MT.COM)
Optional: Nur Ausgaben des letzten Programms sind sichtbar
Optional: Unterdrückt Statusmeldungen von MT
Name der zu startenden Applikation (ohne .COM/.EXE)
Kommandozeilenparameter für die Applikation
Trennzeichen zwischen den Applikationen

(Die Option /L ist nur wirksam, wenn die gestarteten Applikationen Bildschirmausgaben nicht durch direktes Schreiben in den Video-Speicher, sondern über DOS- oder BIOS-Funktionen tätigen.)

MT kann auch in einer Windows-DOS-Box gestartet werden. Der Vorteil der hohen Geschwindigkeit geht dabei naturgemäß teilweise verloren. Programme, die schon allein nicht in einer Windows-DOS-Box lauffähig sind, werden selbstverständlich auch mit MT nicht Windows-kompatibel.

Ein kleines mitgeliefertes Utility-Programm namens TASK.COM kann dazu dienen, Ihnen die Wirkung von MT vorzuführen. Es zeigt ein in der Kommandozeile hinter TASK und eine Leertaste geschriebenes Zeichen zyklisch an und beendet sich später selbst, wenn es nicht mit der ESC-Taste vorzeitig abgebrochen wird. Wenn Sie z.B. TASK 1 am DOS-Prompt eingeben, wird einfach "1111111..." angezeigt.

Mit MT können Sie TASK mehrmals mit unterschiedlichen Parametern aufrufen, so dass es im Multitasking-Betrieb mehrfach läuft, z.B. so:

MT TASK 1 + TASK 2 + TASK 3 + TASK 4

Die Bildschirmausgabe wird daraufhin etwa so aussehen:

*** Tasks: 0
1
*** Tasks: 1
2
*** Tasks: 2
3
*** Tasks: 3
4
*** Tasks: 4
1234123412341234...
TASK 1 wird gestartet ...
und gibt Ziffer 1 aus
TASK 2 wird gestartet ...
und gibt Ziffer 2 aus
TASK 3 wird gestartet ...
und gibt Ziffer 3 aus
TASK 4 wird gestartet ...
und gibt Ziffer 4 aus
Jetzt laufen vier Programme gleichzeitig!
Abwechselnde Ausgabe durch alle Tasks

Wenn Sie jetzt viermal in kurzem Abstand die ESC-Taste drücken, werden die einzelnen Programme alle der Reihe nach wieder beendet. Nach dem Beenden der letzten Task wird stets automatisch auch MT.COM beendet, so dass der DOS-Prompt wieder erscheint.

Tipps für Anwender

Die Programme sollten mit ihrem kompletten Pfadnamen hinter MT geschrieben werden; andernfalls können sie ihren eigenen Pfad nicht ermitteln. Die ggf. in AUTOEXEC.BAT mit PATH angegebenen Pfade werden MT nicht durchsucht. Die Endung .COM bzw. .EXE darf beim Start nicht angegeben werden, sie wird von MT intern automatisch ergänzt.

Nachdem ein Programm gestartet oder beendet wurde, zeigt MT (ohne Option /N) eine Zeile "*** Tasks: " und dahinter die Anzahl der derzeit aktiven Prozesse an.

Es ist sehr empfehlenswert, Programme genau in der umgekehrten Reihenfolge zu beenden, in der sie vorher gestartet wurden. Dies ist insbesondere bei Programmen wichtig, die Interrupt-Vektoren "verbiegen". Wenn das Beenden in der falschen Reihenfolge geschieht, können Interrupt-Ketten unterbrochen werden, was u. U. zum Rechner-Absturz führt!

Auch der DOS-Kommandointerpreter COMMAND kann als Task gestartet werden (Pfadangabe nicht vergessen, z.B. C:\DOS\COMMAND). Er muss allerdings normalerweise, da er zunächst immer den gesamten restlichen DOS-Speicher beansprucht, als letztes Programm der Liste aufgerufen werden, es sei denn, hinter COMMAND wird mit /K gleich ein weiteres Programm angegeben, das seinen Speicherplatz explizit selbst begrenzt.

Vom Prompt eines als letzte Task geladenen COMMAND aus lässt sich ein weiteres Programm starten, das dann ebenfalls im Multitasking-Betrieb zusammen mit den vorher gestarteten Prozessen läuft. Insbesondere lässt sich mit COMMAND als letzter Task auch eine Batch-Datei abarbeiten, deren Programme wiederum kooperativ mit den anderen Prozessen parallel laufen können.

Funktionale Einschränkungen

Nicht alle Programme sind für einen Multitasking-Betrieb kooperativ genug: Die DOS-Utilities EDIT, FORMAT und MSD sind Beispiele hierfür. Sie halten andere Tasks an, solange man keine Taste drückt. Einige andere, z.B. Clipper-Applikationen, können nur als letzte einer Task-Liste gestartet werden, da sie den gesamten übrigen Speicher für sich selbst beanspruchen und das Laden eines weiteren Programms unmöglich machen.

Eine Ausgabe-Umleitung mit dem Zeichen ">" in der Kommandozeile sollte nicht verwendet werden. Zum einen ersetzt MT einige nicht reentrante DOS-Funktionen durch eigene, die eine Umleitung nicht vorsehen. Zum anderen würde die Ausgabeumleitung immer für alle in der MT-Kommandozeile angegebenen Programme wirken, was gewöhnlich nicht sinnvoll ist. Ähnliches gilt für die Eingabeumleitung mit "<".

Von den gleichzeitig laufenden Programmen sollte maximal eines eine Maus benutzen. Falls das nicht sichergestellt werden kann, sollte in AUTOEXEC.BAT kein Maustreiber geladen werden. Im Gegensatz zu Tastendrücken könnten Mausaktivitäten nicht automatisch dem zuletzt von MT geladenen Programm zugeordnet werden.

Mehrere gleichzeitig laufende Prozesse machen je nach Dateizugriffs-Aktivitäten u.U. höhere Werte für den FILES-Parameter in CONFIG.SYS erforderlich, als wenn sie einzeln laufen. Empfehlenswert ist auch der Einsatz eines Platten-Cache-Programms wie SMARTDRV, um den Datenträger-Zugriff zu beschleunigen.

Hinweise für Programmierer

Mit MT ist es wirklich ein Kinderspiel, DOS-Programme in Programmiersprachen wie C, Pascal, Modula, Basic oder Assembler zu schreiben, die im Multitasking-Betrieb arbeiten. Solche Applikationen sollten allerdings unbedingt einige elementare Programmier-Empfehlungen einhalten.

Das Umschalten zu einer Task geschieht immer dann, wenn eine Applikation auf einen Tastendruck wartet bzw. prüft, ob eine Taste gedrückt wurde (C-Funktion kbhit, Basic-Funktion inkey$, Assembler-Aufruf INT 16H mit AH=1 oder 11H). Dies ist die wichtigste Anforderung an ein kooperatives Programm! Bei jedem solchen Aufruf wird vorübergehend zu den anderen Tasks umgeschaltet, anschließend wird die Programmausführung mit der folgenden Anweisung im eigenen Programm fortgesetzt.

Assembler:
C / C++:
Pascal:
Basic:
mov ah,1; int 16h
kbhit()
KeyPressed
x$=inkey$

MT bietet einige Funktionen als API (Application Program Interface) an, die alle über den Interrupt 16H mit bestimmten Registerinhalten aufgerufen werden. Auf der Diskette sind hierfür Beispielprogramme in C, Pascal und Basic enthalten; die Textdatei README enthält eine Auflistung.

Test auf MT Aufrufparameter: AX=´MT´, CX=0
Rückgabewerte: AX=´SH´, wenn MT läuft; CX= Task-Anzahl
Priorität der
eigenen Task
Aufrufparameter: AX='MT' CX=0100H: geringe Priorität, CX=0101H: normal
Rückgabewerte: AX=´SH´, wenn MT läuft; CX=Task-Anzahl
(Bei geringer Priorität wird die jeweilige Task 10mal seltener als bei normaler Priorität aufgerufen.)
Neue Task
starten
Aufrufparameter: AX=´MT´, CX=4B00H, DS:DX -> Name und Parameter
(Format von Name und Parameter wie in der MT-Kommandozeile)
Rückgabewerte: AX=´SH´, wenn MT läuft; CX=Task-Anzahl vor der Ausführung

Die Tastaturabfrage darf nicht durch direktes Abfragen des Tasten-Controllers erfolgen, sondern über DOS- oder BIOS-Funktionen. Ebenso sollte man für die Bildschirmausgabe entweder DOS- oder BIOS-Funktionen verwenden oder andernfalls darauf achten, dass sich die Ausgaben der Tasks nicht gegenseitig stören.

Ein Programm, das nicht als letztes in der Liste gestartet wird, muss sofort nach dem Start (noch vor der ersten Tastenabfrage) seinen eigenen Speicherbedarf auf das wirklich Notwendige begrenzen, da andernfalls keine weiteren Programme mehr geladen werden könnten. Manche Programmiersprachen (z.B. Borland-C, Quickbasic) sorgen dafür automatisch, in Turbo-Pascal kann man dafür die Compiler-Option $M verwenden. Bei anderen (z.B. Assembler) muss man dies über die DOS-Funktion "set block" [AH=4AH, BX=(Bytes/16)+1, INT 21H] explizit selbst tun.

Programme sollten sich nicht darauf verlassen, dass sie in einem bestimmten Verzeichnis laufen: Andere Prozesse oder der Benutzer eines im Vordergrund laufenden Kommandointerpreters könnten das Verzeichnis oder das aktuelle Laufwerk eventuell wechseln. Deshalb sollten alle Programme Dateizugriffe stets mit dem vollen Pfadnamen durchführen.

Ein Programm kann selbst ermitteln, aus welchem Verzeichnis es gestartet wurde, z.B. mit der C-Funktion argv[0], wenn es selbst hinter MT mit seinem kompletten Pfadnamen gestartet wurde; andernfalls liefert argv[0] nur den reinen Programm-Dateinamen ohne Pfad.

Da MT ein kooperatives Multitasking durchführt und jedes Programm sofort wieder Rechenzeit freigibt, wenn es auf Tastendrücke wartet, ist die Task-Umschaltzeit deutlich geringer als bei preemptiven Systemen, die z.B. auf dem 55-ms-Timer-Interrupt beruhen. Dabei wird natürlich ein kooperatives Verhalten der Programme vorausgesetzt, z.B. in C-Programmen durch ein regelmäßiges kbhit(). Die Taskwechselzeiten sind naturgemäß von der CPU-Geschwindigkeit und von der Art der laufenden Applikationen abhängig. Sie liegen bei einem älteren 10-MHz-286-System bei etwa 1 ms und bei moderneren System deutlich darunter.

Lizenzvertrag

MT ist Freeware. Shamrock garantiert deshalb nicht die Benutzbarkeit für bestimmte Einsatzfälle. MT und die zugehörigen Dateien dürfen an Dritte weitergegeben werden, die Änderung von Urheberrechtsvermerken oder Textmeldungen der Software ist jedoch nicht zulässig.

Das Kopieren der Software auf andere Web-Seiten als die von Shamrock oder auf CDROMs ist nur mit ausdrücklicher schriftlicher Genehmigung gestattet.

Shamrock bietet für Freeware-Produkte grundsätzlich keine telefonische Hotline-Unterstützung. Anfragen per E-Mail (siehe Web-Formular) werden jedoch gern beantwortet.

© Shamrock Software GmbH