home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9302 / signals / portsig.def
Encoding:
Modula Definition  |  1993-03-02  |  5.3 KB  |  149 lines

  1. (*========================================================*)
  2. (*                      PORTSIG.DEF                       *)
  3. (*          (C) 1993 Marc Bode & DMV-Verlag               *)
  4. (*            Compiler: TopSpeed Modula 2                 *)
  5. (*========================================================*)
  6.  
  7. DEFINITION MODULE PortSig;
  8.  
  9. (*
  10.   AUSGANGSPUNKT:
  11.     In einem System mit Prozessen, die unter anderem wegen
  12.     Durchsatzerhöhung auf mehreren DOS-Rechnern innerhalb
  13.     eines Netzwerks ablaufen, geschieht die Auftragsübergabe
  14.     an einen weiterverarbeitenden Prozeß über das
  15.     Dateisystem (Server).
  16.     Aufgrund unterschiedlich zu installierender Systemgrößen
  17.     sollen Minimallösungen nur mit einem Rechner (OS/2)
  18.     ausgestattet werden.
  19.     Da die umfangreichen DOS-Prozesse in Turbo Pascal
  20.     geschrieben sind, ist eine sofortige Portierung nach
  21.     OS/2 jedoch nicht möglich.
  22.  
  23.   HINTERGRUND:
  24.     Die Anforderung, mehrere Prozesse auf einem OS/2-Rechner
  25.     in Dos-Boxen parallel ablaufen zu lassen, führt zu
  26.     häufigen unnötigen Plattenzugriffen, wenn die
  27.     Kommunikation zwischen den Prozessen als Auftrag über
  28.     das Dateiensystem geregelt wird.
  29.     Erhöhung der Wartezeiten zwischen den Plattenzugriffen
  30.     kann zu Durchsatzminderung führen.
  31.     Warum also nicht erst dann auf der Platte nach Aufträgen
  32.     suchen, wenn für den entsprechenden Prozeß Dateien
  33.     abgelegt sind?
  34.     Bisher habe ich trotz des Multitasking-Betriebssystems
  35.     OS/2 2.0 noch keine dokumentierte Signalisierungs-
  36.     möglichkeit zwischen DOS-Boxen gefunden. (Den DOS-
  37.     Programmen wird jeweils ein eigener Rechner vorge-
  38.     gaukelt.)
  39.     Gemeinsamer Zugriff ist jedoch auf Portadressen möglich,
  40.     solange nicht ein OS/2-Treiber (z.B. COM.SYS) die
  41.     Kontrolle über die Portadressen ausübt und sie den
  42.     DOS-Boxen nur per virtuellem Treiber zur Verfügung
  43.     stellt. (Dann hat nur eine DOS-Box Zugang zur
  44.     Portadresse.)
  45.  
  46.   LÖSUNGSANSATZ:
  47.     Die Prozesse teilen einander über die Bits einer
  48.     Portadresse mit, ob Aufträge abzuarbeiten sind. Jedem
  49.     Prozeß ist ein Bit zugeordnet.
  50.     Hat ein Prozeß seinen Aufgabenteil erledigt, legt
  51.     dieser den Auftrag als Datei ab und setzt das zugehörige
  52.     Bit des Folgeprozesses.
  53.     Der weiterverarbeitende Prozeß muß nun nicht mehr
  54.     ständig das Dateisystem nach dem Auftrag absuchen,
  55.     sondern pollt lediglich auf der Portadresse. Andauernde
  56.     Plattenzugriffe werden somit vermieden.
  57.  
  58.     Nach Erkennen des eigenen Bits muß dieses natürlich
  59.     zurückgesetzt werden, damit der Prozeß wieder in den
  60.     Wartezustand gelangt.
  61.  
  62.   VORTEIL:
  63.     Unnötiges Absuchen auf Platte wird verhindert.
  64.     Praktisch keine Verzögerungszeiten bei der Durchreichung
  65.     vom ersten bis zum letzten Prozeß.
  66.  
  67.   ZU BEACHTEN:
  68.     Alle Prozesse müssen natürlich mit der gleichen
  69.     Portadresse arbeiten.
  70.  
  71.   VORSCHLAG für »portadr«:
  72.     Serial-Port COM2 LineControlRegister =  2F8 hex + 3
  73.  
  74.   BEMERKUNGEN:
  75.     Sollte eigentlich mit allen Compilerschalter-
  76.     Kombinationen richtig laufen.  Deshalb hier keine
  77.     Angaben.
  78. *)
  79.  
  80. (* ================= Beispiel für Prozeß-1 =================
  81. VAR
  82.   SigPortAdr : WORD;                  (* z. B. aus Konfig *)
  83.   sig        : PortSignal;
  84.  
  85. BEGIN
  86.   SignalInit( sig, SigPortAdr, f_P1);
  87.  
  88.   REPEAT        (* Auftragsbearbeitung *)
  89.     ...
  90.  
  91.     (* wenn Auftrag bearbeitet, Signal an Folgeprozeß P2   *)
  92.     SendSignalTo( sig, f_P2);
  93.  
  94.     (* Warten auf neuen Auftrag *)
  95.     WaitForSignalAndClear( sig);
  96.  
  97.     ...
  98.  
  99.   UNTIL exit;
  100. ...
  101. ========================================================= *)
  102.  
  103. CONST
  104.   Version   = '1.0.00';
  105.  
  106. TYPE
  107.   PortFLAG  = (f_P0, f_P1, f_P2, f_P3, f_P4, f_P5,
  108.                f_P6, f_P7);
  109.  
  110. TYPE
  111.   PortSIGNAL;                         (* opaquer Datentyp *)
  112.  
  113. PROCEDURE SignalInit(portadr: CARDINAL;
  114.                      owner: PortFLAG): PortSIGNAL;
  115.           (* portadr : z.B. COM-Port + 3                  *)
  116.           (* owner   : eigenes Flag                       *)
  117.  
  118. PROCEDURE SignalReceived(sig: PortSIGNAL): BOOLEAN;
  119.           (* TRUE : Signal ist gesetzt                    *)
  120.           (* Wenn portadr mit 0 initialisiert,            *)
  121.           (* dann hier Default: TRUE                      *)
  122.  
  123. PROCEDURE ClearOwnSignal(sig: PortSIGNAL);
  124.           (* Erhalt des eigenen Signals wird hierdurch    *)
  125.           (* bestätigt *)                                 *)
  126.  
  127. PROCEDURE WaitForSignalAndClear(sig: PortSIGNAL);
  128.           (* Wartet, bis Signal erhalten; löscht          *)
  129.           (* gleichzeitig. Der Einsatz macht              *)
  130.           (* ClearOwnSignal und SignalReceived            *)
  131.           (* überflüssig.                                 *)
  132.  
  133. PROCEDURE SendSignalTo(sig: PortSIGNAL; process: PortFLAG);
  134.           (* Sendet ein Signal an den Prozeß mit dem Flag *)
  135.           (* process                                      *)
  136.  
  137. PROCEDURE SignalIsSet(sig: PortSIGNAL;
  138.                       process: PortFLAG): BOOLEAN;
  139.           (* Ermittelt, ob das Signal des Prozesses mit   *)
  140.           (* dem Flag process gesetzt ist.                *)
  141.  
  142. PROCEDURE SignalDone( VAR sig : PortSIGNAL);
  143.  
  144.  
  145. END PortSig.
  146.  
  147. (*========================================================*)
  148. (*                   Ende von PORTSIG.DEF                 *)
  149.