Makro | Kurzbeschreibung |
CONTXT | liest oder schreibt u.a. in den Registern des von ihm unterbrochenen Prozesses oder des Basisprozesses |
EXIT | beendet einen STXIT-Prozess |
LEVCO | ändert die Verarbeitungsebene (Priorität) des aufrufenden STXIT-Prozesses während des Ablaufs |
SETIC | setzt Zeitgeberintervalle (CPU-Zeit/Realzeit) |
STXIT | legt benutzereigene STXIT-Prozesse fest, mit denen das System die Verarbeitung fortsetzt, wenn eine Programmunterbrechung auftritt |
Allgemeines
Während eines Programmlaufs auftretende Ereignisse, wie z.B.
ungültiger SVC, ungültiger Operationscode
Datenfehler, Überlauf
Ende Programmlaufzeit, Break-/Escape-Unterbrechungen, INFORM-PROGRAM-Kommando
Adressfehler
beeinflussen in der Regel den weiteren Programmablauf.
Das STXIT-Verfahren bietet dem Anwender die Möglichkeit, auf derartige Ereignisse mit eigenen (STXIT-) Routinen zu reagieren: bei Eintritt einer Programmunterbrechung wird die STXIT-Routine zum Ablauf gebracht und anschließend (im Normalfall) der unterbrochene Basisprozess fortgesetzt. Der Basisprozess ist das ablaufende Programm, das mit dem Kommando START-EXECUTABLE-PROGRAM gestartet wurde. Die STXIT-Routinen sind Bestandteil des Programmes, laufen aber als selbstständige Prozesse ab.
Beispiele
Ein Programmfehler (ungültiger SVC, ungültiger Operationscode, Datenfehler, Überlauf, ...) führt in der Regel zum Programmabbruch. Mit einer STXIT-Routine kann die Beendigung des Programmes abgefangen werden.
Ein Break (K2-Taste) führt in der Regel zur Unterbrechung des Programmes (das Betriebssystem erwartet jetzt BS2000-Kommandos). Mit einer STXIT-Routine kann der Programmierer im Programm auf dieses Unterbrechungsereignis vorbeugend reagieren.
Beschreibung des STXIT-Verfahrens
STXIT-Verwaltung
Die mit dem STXIT-Verfahren zu behandelnden Unterbrechungsereignisse sind in STXIT-Ereignisklassen zusammengefasst (siehe Tabelle 9). Der Anwender kann mit einem Aufruf des Makros STXIT jeder Ereignisklasse eine STXIT-Routine zuordnen. Die angegebenen Zuordnungen werden systemintern in einen STXIT-Verwaltungsblock eingetragen. In weiteren STXIT-Aufrufen kann der Anwender unter Bezugnahme auf den angelegten STXIT-Verwaltungsblock die eingetragenen Zuordnungen modifizieren oder ergänzen - oder einen neuen STXIT-Verwaltungsblock mit weiteren Zuordnungen anlegen lassen. Die STXIT-Verwaltungsblöcke werden untereinander verkettet.
Mit dem STXIT-Verfahren können in einem Programm(-system) bis zu 100 STXIT-Verwaltungsblöcke angelegt werden. Damit ist die Koexistenz mehrerer STXIT-Routinen für dieselbe Ereignisklasse möglich. Diese Erweiterung ist für die Anwendung in Programmsystemen vorteilhaft: bei Eintritt eines Ereignisses kann jedes Unterprogramm die für dieses Ereignis erforderliche Kontrolle erhalten.
STXIT-Routine
Eine STXIT-Routine ist ein Programmabschnitt in einem Programm. In dem Programmabschnitt reagiert der Programmierer auf das Unterbrechungsereignis. Die Routine endet mit dem Makro EXIT. Bei Eintritt des Unterbrechungsereignisses wird die STXIT-Routine zum Ablauf gebracht.
Das konkrete Unterbrechungsereignis wird mit einem Ereigniscode beschrieben und dem Programm im Register R3 übergeben, siehe Tabelle 9.Wenn das Unterbrechungsereignis eintritt, läuft die STXIT-Routine in einem eigenen Prozess ab (STXIT-Prozess). Das Betriebssystem verwendet dabei die Register R1, R3 und R4 zur Verständigung mit der Routine. Die Register enthalten folgende Informationen:
R1: STXIT-Meldung, falls bei STXIT-Operand STXMSG angegeben wurde
R3: im rechten Byte: Ereigniscode des Unterbrechungsereignisses (siehe Tabelle 9)
R4: im rechten Byte: SVC-Nummer bei Ereignisklasse SVC oder Funktionstastencode bei Ereignisklasse ESCPBRK. Funktionstastencodes können dem Handbuch „TIAM“ [16] oder der „Tabelle der normierten Funktionstastencodes“ entnommen werden. Diese Funktionalität wird nur zur Verfügung gestellt, wenn der TIAM-Partner ein Terminal ist und keine Applikation (z.B. OMNIS).STXIT-Prozess
die Definition eines STXIT-Prozesses
STXIT-Prozesse sind Contingency-Prozesse (das bedeutet: eigener Process Control Block (PCB) und damit eigener Registersatz; eigene Verarbeitungsebene).
Die Startadresse des STXIT-Prozesses ist die Adresse der STXIT-Routine, die im STXIT-Aufruf angegeben wurde. Der STXIT-Prozess erhält standardmäßig die höchstmögliche Verarbeitungsebene 127.der Ablauf von STXIT-Prozessen
Ein STXIT-Prozess wird im Normalfall sofort bei Eintritt des entsprechenden Unterbrechungsereignisses gestartet. Treten während des Ablaufs weitere Unterbrechungsereignisse ein, entsteht eine Prozesswarteschlange. Verarbeitungsebene und Einreihungsprinzip (LIFO/FIFO) eines STXIT-Prozesses bestimmen seinen Platz in der Prozesswarteschlange.
LIFO (Last In First Out) bedeutet: Der Prozess wird nach seiner Aktivierung an der Spitze der Prozesse mit seiner Verarbeitungsebene eingereiht. Vor ihm können nur Prozesse mit höherer Verarbeitungsebene eingeordnet sein. STXIT-Prozesse für die Ereignisklassen mit zeitunabhängigen Ereignissen (wie Programmüberprüfung, nicht behebbarer Programmfehler, ...., Programmbeendigung) werden nach dem LIFO-Prinzip eingeordnet (Tabelle 9).
FIFO (First In First Out) bedeutet: Der Prozess wird nach seiner Aktivierung am Ende der Prozesse mit seiner Verarbeitungsebene eingereiht. Vor ihm können aufsteigend früher aktivierte Prozesse seiner Verarbeitungsebene und Prozesse mit höherer Verarbeitungsebene eingeordnet sein. STXIT-Prozesse für die Ereignisklassen mit zeitabhängigen Ereignissen (Zeitgeber Realzeit, Zeitgeber CPU-Zeit, Ende Programmlaufzeit) werden nach dem FIFO-Prinzip eingeordnet (Tabelle 9).
Ausgehend vom laufenden Basisprozess soll im Folgenden das Zusammenspiel mehrerer STXIT-Prozesse erläutert werden. Es sei vereinfachend angenommen: alle STXIT-Prozesse haben dieselbe Verarbeitungsebene und nach Beendigung der STXIT-Prozesse wird der Basisprozess fortgesetzt.
Für das Beispiel sei angenommen:
in dem Programm oder Programmsystem ist einer Ereignisklasse immer nur eine STXIT-Routine zugeordnet,
in dem Programm oder Programmsystem sind den Ereignisklassen jeweils mehrere STXIT-Routinen zugeordnet (STXIT-Parallelität).
zu 1.:
Bei Eintritt eines Unterbrechungsereignisses wird der Basisprozess (Verarbeitungsebene 0) unterbrochen und der entsprechende STXIT-Prozess (Verarbeitungsebene 127) gestartet. Nach Beendigung des STXIT-Prozesses wird der Basisprozess fortgesetzt, wenn zwischenzeitlich kein weiteres Unterbrechungsereignis aufgetreten ist. Tritt während des STXIT-Prozesses ein weiteres Unterbrechungsereignis ein, gilt entsprechend dem Einreihungsprinzip:
der aktuelle STXIT-Prozess wird durch einen neuen STXIT-Prozess unterbrochen, wenn dieser nach dem Prinzip LIFO eingereiht wird (geschachtelter Ablauf). Nach Beendigung des neuen STXIT-Prozesses wird der unterbrochene STXIT-Prozess fortgesetzt und nach dessen Beendigung der Basisprozess, wenn während dieser Abläufe kein neues Unterbrechungsereignis aufgetreten ist. An der Schachtelung können auch mehr als 2 STXIT-Prozesse beteiligt sein. Das gilt auch, wenn das Unterbrechungsereignis immer wieder derselben Ereignisklasse angehört. Ein neuer STXIT-Prozess derselben STXIT-Routine wird dann gestartet. In diesem Fall ist aber die Anzahl der Schachtelungen begrenzt (Angabe im Makroaufruf STXIT und max. Schachtelungstiefe in der Tabelle 9).
Der laufende STXIT-Prozess wird beendet und anschließend der neue STXIT-Prozess gestartet, wenn der neue STXIT-Prozess nach dem FIFO-Prinzip eingereiht wird. Die Anzahl der nacheinander ablaufenden Prozesse ist begrenzt, wenn das Unterbrechungsereignis immer wieder derselben Ereignisklasse angehört (max. Schachtelungstiefe in Tabelle 9). Der Basisprozess wird fortgesetzt, wenn während dieser Abläufe keine neuen Unterbrechungsereignisse aufgetreten sind.
zu 2.:
Bei Eintritt eines Unterbrechungsereignisses werden für alle STXIT-Routinen dieser Ereignisklasse STXIT-Prozesse erzeugt. Diese werden - beginnend beim zuerst angelegten STXIT-Verwaltungsblock mit dieser Ereignisklasse - entsprechend ihrem Einreihungsprinzip in die Prozesswarteschlange eingeordnet. Das bedeutet für den Ablauf:
STXIT-Routinen einer Ereignisklasse mit dem LIFO-Prinzip:
der Basisprozess wird unterbrochen und die im zuletzt angelegten STXIT-Verwaltungsblock eingetragene STXIT-Routine kommt zum Ablauf, anschließend die im zuvor angelegten STXIT-Verwaltungsblock eingetragene STXIT-Routine, usw.STXIT-Routinen einer Ereignisklasse mit dem FIFO-Prinzip:
der Basisprozess wird unterbrochen und die im zuerst angelegten STXIT-Verwaltungsblock eingetragene STXIT-Routine kommt zum Ablauf, anschließend die im danach angelegten STXIT-Verwaltungsblock eingetragene STXIT-Routine, usw.In jeder STXIT-Routine kann im Makro EXIT angegeben werden, ob die Prozessfolge für dieselbe Ereignisklasse abgebrochen oder fortgesetzt werden soll.
Tritt während eines STXIT-Prozesses ein neues Unterbrechungsereignis ein, werden (wiederum) für alle STXIT-Routinen der betreffenden Ereignisklasse STXIT-Prozesse erzeugt und entsprechend ihrem Einreihungsprinzip in die Prozesswarteschlange eingereiht. Das ist auch so, wenn das Unterbrechungsereignis immer wieder derselben Ereignisklasse angehört. Für eine unterbrochene STXIT-Routine wird aber nur dann ein neuer STXIT-Prozess erzeugt, wenn die spezifizierte Schachtelungstiefe noch nicht erreicht ist. Dieser Ablauf ist für das LIFO-Prinzip im Bild unten dargestellt.
Bild 21: Beispiel eines Ablaufs
Steuerung von STXIT-Prozessen
Ändern der Verarbeitungsebene (Prozesspriorität):Wie angeführt, werden STXIT-Prozesse standardmäßig auf der Verarbeitungsebene 127 gestartet und bei gleicher Verarbeitungsebene nach einem vorgegebenen Einreihungsprinzip (LIFO/FIFO) in die Prozesswarteschlange eingereiht. Für den Wertebereich gilt:
Basisprozess: Verarbeitungsebene 0 - 127 Standardwert 0
STXIT-Prozess: Verarbeitungsebene 1 - 127 Standardwert 127Der Basisprozess (der mit dem Kommando START-EXECUTABLE-PROGRAM gestartet wurde) hat die Verarbeitungsebene 0 und wird stets von einem STXIT-Prozess unterbrochen. Während des Ablaufs der STXIT-Routine kann mit dem Makro LEVCO die Verarbeitungsebene des STXIT-Prozesses im angegebenen Bereich geändert werden. Der Anwender kann somit die Reihenfolge der ablaufenden STXIT-Prozesse beeinflussen. Es ist aber zu beachten, dass ein laufender Prozess seine Verarbeitungsebene nicht unter die eines schon gestarteten und unterbrochenen Prozesses senken kann.
Zugriff auf den PCB des unterbrochenen Prozesses:
Mit dem Makro CONTXT kann auf den PCB des aktuell unterbrochenen Prozesses oder auf den PCB des Basisprozesses lesend und schreibend zugegriffen werden. Der Aufrufer hat Zugriff zu den allgemeinen Registern, den Gleitpunktregistern und zum Befehlszähler; außerdem wird ihm über den Returncode mitgeteilt, ob im aktuellen Unterbrechungszustand der PCB bereits durch einen CONTXT-Aufruf modifiziert wurde.
Einschränkungen
Der Ereignisklasse „SVC“ kann in einem Programm-(system) nur eine STXIT-Routine zugeordnet werden. Die Zuordnung muss im ersten STXIT-Aufruf erfolgen oder sich auf den zuerst angelegten STXIT-Verwaltungsblock beziehen.
Für die Ereignisklassen „Zeitgeber Realzeit“ und „Zeitgeber CPU-Zeit“ ist zu beachten, dass zu einem Zeitpunkt immer nur ein Zeitintervall für Realzeit und für CPU-Zeit gesetzt ist (Makro SETIC).
Der Aufruf des Makros TERM in dem Programm(-system) führt zur Aktivierung aller der Ereignisklasse „TERM“ zugeordneten STXIT-Routinen - wenn die jeweils vorhergehende mit EXIT CONTINU=YES beendet wurde. Ein erneuter TERM-Aufruf (auch in einer STXIT-Routine) führt wunschgemäß zur sofortigen Programmbeendigung.
Bei Überschreiten der spezifizierten Schachtelungstiefe wird das Programm mit einem Userdump beendet und das Unterbrechungsgewicht im PCB des Basisprozesses mit X'06' überschrieben. (X'06' ist kein Ereignis, auf das der Anwender mit einer STXIT-Routine reagieren kann).
Folgende Tabelle zeigt die STXIT-Ereignisklassen und die zugehörigen Unterbrechungsereignisse:
STXIT-Ereignisklasse | Unterbrechungsereignis | Ereigniscode | Warteschlangen- | max. |
Programmfehler | unzulässiger SVC | X'04' | LIFO | 127 |
unzulässiger Operationscode | X'58' | |||
Datenfehler | X'60' | |||
Exponentenüberlauf | X'64' | |||
Divisionsfehler oder negative | X'68' | |||
Mantisse = 0 | X'6C' | |||
Exponentenunterlauf | X'70' | |||
Dezimalüberlauf | X'74' | |||
Festpunktüberlauf | X'78' | |||
Intervallzeitgeber | „SETIC-Intervall“ abgelaufen | X'20' | ||
Intervallzeitgeber | „SETIC-Intervall“ abgelaufen | X'A0' | FIFO | 127 |
Sommer-/Winterzeitumstellung | X'C0' | |||
Ende Programmlaufzeit | CPU-Zeitgrenze für die Task | X'80' | FIFO | 0 |
Tabelle 9: STXIT-Ereignisklassen und zugehörige Unterbrechungsereignisse
STXIT-Ereignisklasse | Unterbrechungsereignis | Ereigniscode | Warteschlangen- | max. |
nicht behebbarer | privilegierter SVC | X'08' | LIFO | 127 |
Zugriff auf eine nicht vorhandene | X'48' | |||
privilegierte Operation | X'54' | |||
Adressenfehler (z.B. | X'5C' | |||
XA-Fehler bei SVC-Aufruf (im | X'9C' | |||
Realtimer (Condition Error) | X'A4' | |||
Ausrichtungsfehler des | X'AC' | |||
Validierungsfehler | X'B0' | |||
Ungültige UNIT-Nr. im | X'C4' |
Tabelle 9: STXIT-Ereignisklassen und zugehörige Unterbrechungsereignisse
STXIT-Ereignisklasse | Unterbrechungsereignis | Ereigniscode | Warteschlangen- | max. |
Mitteilung an das | INFORM-PROGRAM-Kommando | X'44' | LIFO | 127 |
ESCPBRK | BREAK/ESCAPE | X'84' | LIFO | 127 |
Programmbeendigung | vom System erkannter Fehler, | X'88' | LIFO | 0 |
START-/LOAD-EXECUTABLE- | X'8C' | |||
Adress-Übersetzungsfehler | X'94' | |||
Hardwarefehler(CPU) | X'A8' | |||
Erzwungenes Entladen eines | X'B8' | |||
nicht behebbarer DMS-Fehler | X'BC' | |||
Programmbeendigung | TERM-SVC aus | X'90' | LIFO | 0 |
Programmbeendigung durch | X'98' | |||
SVC-Unterbrechung | SVC-Aufruf eines angegebenen | X'50' | LIFO | 127 |
Hardwarefehler | Ein-/Ausgabefehler bei Data- | X'28' | LIFO | 0 |
Live Migration | Live Migration | X'D0' | FIFO | 127 |
Tabelle 9: STXIT-Ereignisklassen und zugehörige Unterbrechungsereignisse
Beispiel zur Programmstruktur mit STXIT-Routinen in einem Programmsystem.
Das Programmsystem besteht aus einem Hauptprogramm und mehreren Subprogrammen. Durch das Hauptprogramm wird ein STXIT-Verwaltungsblock angelegt und die der Ereignisklasse „Programmbeendigung“ zugeordnete STXIT-Routine „TERMR1“ eingetragen. Durch das Subprogramm A wird ein weiterer STXIT-Verwaltungsblock angelegt und ebenfalls für die Ereignisklasse „Programmbeendigung“ eine STXIT-Routine „TERMR2“ eingetragen. Bei Eintritt eines Ereignisses aus dieser Ereignisklasse laufen zu diesem Zeitpunkt die STXIT-Routinen „TERMR2“ und „TERMR1“ nacheinander ab.
Zu einem späteren Zeitpunkt wird durch das Subprogramm A der zuletzt angelegte STXIT-Verwaltungsblock (unter Bezugnahme auf seine ID) modifiziert; die Zuordnung für die Ereignisklasse „Programmbeendigung“ wird gelöscht und die der Ereignisklasse „ABEND“ zugeordnete STXIT-Routine „ABNDR“ eingetragen. Ab diesem Zeitpunkt wird bei Eintritt eines Ereignisses aus der Ereignisklasse „Programmbeendigung“ nur noch die STXIT-Routine „TERMR1“ aktiviert.
Programmstruktur
BEISP START * HAUPTPROGRAMM BALR ... USING ... *** * 1. STXIT-Aufruf in dem Hauptprogramm STXIT STXDNEW=STXDIDF1,TERM=(TERMR1) : TERMR1 EQU * * STXIT-Routine für "Programmbeendigung" BALR ... USING ... : EXIT : STXIDF1 DC F * 4-Byte-Feld für die ID des STXIT- END * Verwaltungsblockes : * UNTERPROGRAMM A LA 6,STXDIDF2 *** * 2. STXIT-Aufruf (Unterprogramm A) STXIT STXDNEW=(6),TERM=(TERMR2) : *** * Update des 2. STXIT-Verwaltungsblockes. *** * Der Unterbrechungsausgang für TERM wird *** * geschlossen und für die Ereignisklasse *** * ABEND wird eine STXIT-Routine spezifiziert. STXIT STXDID=STXIDF2,TERM=(CLOSE),ABEND=(ABNDR) : TERMR2 EQU * * STXIT-Routine für "Programmbeendigung" BALR ... * (Unterprogramm A) USING ... : EXIT : ABNDR EQU * * STXIT-Routine für "ABEND" (Unterprogramm A) BALR ... USING ... : EXIT : STXDIDF2 DC F * 4-Byte-Feld für die ID des zweiten STXIT- END * Verwaltungsblockes