home *** CD-ROM | disk | FTP | other *** search
Modula Definition | 1993-03-02 | 5.3 KB | 149 lines |
- (*========================================================*)
- (* PORTSIG.DEF *)
- (* (C) 1993 Marc Bode & DMV-Verlag *)
- (* Compiler: TopSpeed Modula 2 *)
- (*========================================================*)
-
- DEFINITION MODULE PortSig;
-
- (*
- AUSGANGSPUNKT:
- In einem System mit Prozessen, die unter anderem wegen
- Durchsatzerhöhung auf mehreren DOS-Rechnern innerhalb
- eines Netzwerks ablaufen, geschieht die Auftragsübergabe
- an einen weiterverarbeitenden Prozeß über das
- Dateisystem (Server).
- Aufgrund unterschiedlich zu installierender Systemgrößen
- sollen Minimallösungen nur mit einem Rechner (OS/2)
- ausgestattet werden.
- Da die umfangreichen DOS-Prozesse in Turbo Pascal
- geschrieben sind, ist eine sofortige Portierung nach
- OS/2 jedoch nicht möglich.
-
- HINTERGRUND:
- Die Anforderung, mehrere Prozesse auf einem OS/2-Rechner
- in Dos-Boxen parallel ablaufen zu lassen, führt zu
- häufigen unnötigen Plattenzugriffen, wenn die
- Kommunikation zwischen den Prozessen als Auftrag über
- das Dateiensystem geregelt wird.
- Erhöhung der Wartezeiten zwischen den Plattenzugriffen
- kann zu Durchsatzminderung führen.
- Warum also nicht erst dann auf der Platte nach Aufträgen
- suchen, wenn für den entsprechenden Prozeß Dateien
- abgelegt sind?
- Bisher habe ich trotz des Multitasking-Betriebssystems
- OS/2 2.0 noch keine dokumentierte Signalisierungs-
- möglichkeit zwischen DOS-Boxen gefunden. (Den DOS-
- Programmen wird jeweils ein eigener Rechner vorge-
- gaukelt.)
- Gemeinsamer Zugriff ist jedoch auf Portadressen möglich,
- solange nicht ein OS/2-Treiber (z.B. COM.SYS) die
- Kontrolle über die Portadressen ausübt und sie den
- DOS-Boxen nur per virtuellem Treiber zur Verfügung
- stellt. (Dann hat nur eine DOS-Box Zugang zur
- Portadresse.)
-
- LÖSUNGSANSATZ:
- Die Prozesse teilen einander über die Bits einer
- Portadresse mit, ob Aufträge abzuarbeiten sind. Jedem
- Prozeß ist ein Bit zugeordnet.
- Hat ein Prozeß seinen Aufgabenteil erledigt, legt
- dieser den Auftrag als Datei ab und setzt das zugehörige
- Bit des Folgeprozesses.
- Der weiterverarbeitende Prozeß muß nun nicht mehr
- ständig das Dateisystem nach dem Auftrag absuchen,
- sondern pollt lediglich auf der Portadresse. Andauernde
- Plattenzugriffe werden somit vermieden.
-
- Nach Erkennen des eigenen Bits muß dieses natürlich
- zurückgesetzt werden, damit der Prozeß wieder in den
- Wartezustand gelangt.
-
- VORTEIL:
- Unnötiges Absuchen auf Platte wird verhindert.
- Praktisch keine Verzögerungszeiten bei der Durchreichung
- vom ersten bis zum letzten Prozeß.
-
- ZU BEACHTEN:
- Alle Prozesse müssen natürlich mit der gleichen
- Portadresse arbeiten.
-
- VORSCHLAG für »portadr«:
- Serial-Port COM2 LineControlRegister = 2F8 hex + 3
-
- BEMERKUNGEN:
- Sollte eigentlich mit allen Compilerschalter-
- Kombinationen richtig laufen. Deshalb hier keine
- Angaben.
- *)
-
- (* ================= Beispiel für Prozeß-1 =================
- VAR
- SigPortAdr : WORD; (* z. B. aus Konfig *)
- sig : PortSignal;
-
- BEGIN
- SignalInit( sig, SigPortAdr, f_P1);
-
- REPEAT (* Auftragsbearbeitung *)
- ...
-
- (* wenn Auftrag bearbeitet, Signal an Folgeprozeß P2 *)
- SendSignalTo( sig, f_P2);
-
- (* Warten auf neuen Auftrag *)
- WaitForSignalAndClear( sig);
-
- ...
-
- UNTIL exit;
- ...
- ========================================================= *)
-
- CONST
- Version = '1.0.00';
-
- TYPE
- PortFLAG = (f_P0, f_P1, f_P2, f_P3, f_P4, f_P5,
- f_P6, f_P7);
-
- TYPE
- PortSIGNAL; (* opaquer Datentyp *)
-
- PROCEDURE SignalInit(portadr: CARDINAL;
- owner: PortFLAG): PortSIGNAL;
- (* portadr : z.B. COM-Port + 3 *)
- (* owner : eigenes Flag *)
-
- PROCEDURE SignalReceived(sig: PortSIGNAL): BOOLEAN;
- (* TRUE : Signal ist gesetzt *)
- (* Wenn portadr mit 0 initialisiert, *)
- (* dann hier Default: TRUE *)
-
- PROCEDURE ClearOwnSignal(sig: PortSIGNAL);
- (* Erhalt des eigenen Signals wird hierdurch *)
- (* bestätigt *) *)
-
- PROCEDURE WaitForSignalAndClear(sig: PortSIGNAL);
- (* Wartet, bis Signal erhalten; löscht *)
- (* gleichzeitig. Der Einsatz macht *)
- (* ClearOwnSignal und SignalReceived *)
- (* überflüssig. *)
-
- PROCEDURE SendSignalTo(sig: PortSIGNAL; process: PortFLAG);
- (* Sendet ein Signal an den Prozeß mit dem Flag *)
- (* process *)
-
- PROCEDURE SignalIsSet(sig: PortSIGNAL;
- process: PortFLAG): BOOLEAN;
- (* Ermittelt, ob das Signal des Prozesses mit *)
- (* dem Flag process gesetzt ist. *)
-
- PROCEDURE SignalDone( VAR sig : PortSIGNAL);
-
-
- END PortSig.
-
- (*========================================================*)
- (* Ende von PORTSIG.DEF *)
-