.; Set for 12 char/inch pitch .ifnot LN03 .require "LB:[5,101]LA120P12" .; LA120 margins and tabs set-up .require "LB:[5,101]LA50" .page size 60,75,0,0,1 .; Set form for header .;.page size 60,110,10,0,1 .else LN03 .require "LB:[5,101]LN03P12" .; LN03 margins and tabs set-up .require "LB:[5,101]LN03" .; LN03 escape sequence definitions .page size 60,75,0,0,1 .; Set form for header .flags substitute .br;$Elite .; Select character_set .no headers .page .number page 1 .headers .endif LN03 .display number "- ", D, " -" .display chapter "Hoofdstuk ", D, "" .display appendix "Bijlage ", RU, "" .style chapter 8,1,3,-1,-1 .; tm,ln>ch,ln>text,ch ind.,text ind. .style headers 3,0,6,7,7,2,0,7,2,6 .;Lowercase HL 1, 2lf,text,0lf .layout 3,1 .; Title flush left, number bottom center .set paragraph 5,1,2,2 .; hor.ind., vert.ind., tp, tp-bottom lines .underline spaces .autoparagraph .no period .underline spaces .flags overstrike .flags substitute .tab stops +8,+8,+8,+8,+8,+8,+8,+8,+8,+8,+8,+8,+8 .title Batch Systeem voor RSX-11M .; REV.DATE: .;.subtitle JHB, BATCHPAPR, Rev.: $$DATE .;.subtitle JHB, BATCHPAPR, 11 Apr 89 .fig 20 .center text Een Batch Systeem voor RSX-11M .b 5;Jan Belgraver .b;Organon International B.V. .b;Oss .end center .b 15 .center text DECUS Holland Symposium .b;Ede .b;6 april 1989 .end center .page .;.pfn .;.b 2 .nf .;RSX SIG DECUS Holland Symposium 1989 .;.b 2 .;.end footnote .hl 1 Inleiding Het nu te bespreken batch systeem ontstond ruim acht jaar geleden in een periode dat we binnen onze groep net overgegaan waren van een 18-bits PDP-15/35 met het single-user DOS operating systeem naar een PDP-11/60 met multi-user RSX-11M. De machine werd, en wordt nog steeds, gebruikt voor de analyse van langdurige slaap/waak EEG registraties bij proefdieren. Deze 24 uur of langer durende registraties werden toentertijd eerst op een analoge band opgenamen en vervolgens gedigitaliseerd. Daarna volgden de Fourier Transformaties en power spectra berekeningen en tenslotte de grafische representatie van de resultaten. De hiervoor benodigde programma's waren uiteraard allen interactief, iedere test vereiste immers een andere instelling van de verwerkings condities. Bij de dataverwerking moesten er dus diverse programma's achtereenvolgens gedraaid worden. De verleiding was daarom groot om voor zulke langlopende programma's een middel te bedenken ze in de nachtelijke uren te laten draaien. Via een voorbereidende stap kwamen we eind 1981 tot het batchverwerkings systeem dat het onderwerp is van deze voordracht. Alle programma's die ervoor geschikt gemaakt werden waren geschreven in Fortran IV-Plus. .hl 1 Eerste benadering Het was welhaast vanzelfsprekend dat voor de sequentiele verwerking van een aantal programma's de Indirect Commandfile Processor gebruikt werd. Verder moesten de reeds bestaande programma's onderscheid kunnen gaan maken tussen normaal interactief gebruik en wat we verder batch-mode zullen noemen. Het probleem was dus iets te bedenken om naast het interactief intikken van de gegevens ze ook op een elegante manier uit een file te kunnen laten lezen. De in eerste instantie gekozen methode bestond uit het inbouwen van de GETMCR directive call. Wanneer het programma dan geinstalleerd werd in de _...tsk vorm dan kon met de commandline de naam van een antwoorden file meegegeven worden. Aan de hand van de resultaten van de call GETMCR bepaalde het programma dan de mode waarin het moest werken. In het geval van Batch-mode werd vervolgens LUN 5, die normaal aan de eigen terminal (TI:) is gekoppeld, geassigneerd aan de antwoorden file. Verder was het natuurlijk nodig terminal input en output van elkaar te scheiden; voor terminal output werd LUN 6 (normaal CO:) gekozen. Het onderscheid tussen de verschillende antwoorden files gebeurde in eerste instantie op programma basis, d.w.z. dat de eerste drie letters van de zogenaamde .CTL-file naam gelijk waren aan die van de als ...tsk geinstalleerde versie van het programma. De resterende zes tekens waren job specifiek. Op deze manier zagen we kans om vier jobs per nacht uit te laten voeren, twee aan twee parallel. De benodigde command files waren tamelijk complex. De antwoorden files werden m.b.v. de EDT of KED editor aangemaakt. Dikwijls werd de eerste van zo'n set als model gebruikt voor de rest omdat ze tocht slechts in enkele details van elkaar verschilden; dit bespaarde de moeite van het alles weer opnieuw intikken. Toch was deze truc ook een bron van fouten omdat er gemakkelijk vergissingen werden gemaakt, maar iedere keer dezelfde dingen opnieuw invullen leidde ook snel tot vergissingen en was bovendien stomvervelend. Na een paar maanden kwamen we dan ook tot de conclusie dat het eenvoudiger en veiliger moest wilde het voor algemeen gebruik geschikt zijn. De nadelen waren dus vooral het gebrek aan validatie van de gegenereerde antwoorden files, de noodzaak van geinstalleerde programma's en de te ingewikkelde command files en antwoorden filenamen. .hl 1 Gekozen oplossing Evaluatie van de eerste methode leidde tot de volgende uitgangspunten voor een nieuwe versie: .ls .le;Eenvoudiger in gebruik .le;Eenvoudig te implementeren .le;Controle op invoerfouten .le;Geen speciale versie van de programma's .le;Gebruik van command files voor de samenstelling van een job .els 0 .hl 2 Implementatie op Programma Niveau Controle op invoer fouten kan worden bereikt door dit te laten doen door het programma zelf. Ofwel laat het programma om input vragen en het controleren zoals bij interactief gebruik en sla deze antwoorden vervolgens op in een file. Dit vereiste de reeds ingevoerde methode van aparte LUNs voor terminal input en output. Omdat LUN 6 echter ook diende voor foutmeldingen etc. werd een aparte LUN (meestal 7) gekozen voor het invullen van de antwoorden file. In de rest van de beschrijving zal verder voor het gemak van Logical Unit nummer 7 gebruik gemaakt worden. Voor het vragen om en ophalen van input via gescheiden LUNs wordt de 'read-after-prompt' methode gebruikt, d.w.z. dat in de eerste WRITE het dollar 'vertical format control character' gebruikt wordt, de pointer blijft dus staan aan het einde van de regel met de vraag. Voor het opslaan van het antwoord in een file wordt hetzelfde format gebruikt als die voor het READ statement. Omdat door de invoering van batch-mode drie verschillende toestanden voor kunnen komen in een programma werden een tweetal standaard vlaggen ingevoerd om de flow te regelen. Voor het onderscheid tussen Batch- en No-Batch Mode werd de logical PRCFLG (processing-mode vlag) ingevoerd en voor het verschil tussen Create Mode (antwoorden file vullen) en Use Mode (lezen van de antwoorden file) de logical BATFLG. Tenslotte was er in het programma nog een mechanisme nodig om de initialisatie uit te voeren zonder gebruik te maken van de GETMCR routine en een geinstalleerd programma. Voor dit doel werd de GETMCR routine vervangen door een eigengemaakte (BATCH) routine die aan de 'buitenwereld' vraagt in welke vorm het programma moet werken en aan de hand daarvan de vlaggen en de terminal I/O en antwoorden file LUNs instelt. Figuur 1 geeft de drie mogelijke instellingen. .text deferred .fig 2 .c;Figuur 1 .lm+8 .b 2 .lit Mode BAT PRC LUN Assignments FLG FLG 5 6 7 No F T TI: TI: NL: Create T F TI: TI: BATCHTTxx.CTL Use T T BATCHTTxx.CTL TI:/NL: TI:/NL: .eli .lm-8 .b 2 De keuze tussen TI: of NL: is een ingebouwde mogelijkheid voor het al dan niet weergeven van de antwoorden in Use Mode. De gekozen optie wordt door BATCH tijdens de Create Mode in een record van de antwoorden file opgeslagen. .b .c;Batch-mode versus Terminal en Batch Logicals Instellingen .b 2 .end text Samengevat zijn er dus minimaal de volgende programma aanpassingen nodig voor Batch-mode: .ls .le;de definitie van de logicals BATFLG en PRCFLG .le;een call naar BATCH .le;een write naar de antwoorden file na elke vraag om input .le;het testen op PRCFLG om het programma te stoppen na het vullen van de antwoorden file. .els 0 .b;Figuur#2 geeft een voorbeeld van eenvoudig test programma. .text deferred .fig 2 .c;Figuur 2 .lm+8 .b 2 .lit PROGRAM EXAMPL : LOGICAL BATFLG, PRCFLG : CALL BATCH (7, PRCFLG,BATFLG, IER) IF (IER .LT. 1) STOP : WRITE (6, 100) ! Vraag om input READ (5, 101) GETAL WRITE (7, 101) GETAL ! en sla op in .CTL file : WRITE (6, 110) ! Vraag om input READ (5, 111) TEKST WRITE (7, 111) TEKST ! en sla op in .CTL file : 100 FORMAT (/'$Geef een getal in', T20, ': ') 101 FORMAT (F5.2) 110 FORMAT (/'$Geef tekst', T20, ': ') 111 FORMAT (40A1) : IF (.NOT. PRCFLG) STOP : : STOP END .eli .lm-8 .b 2 .c;Batch implementatie Voorbeeld .b 2 .end text .hl 2 Implementatie op Commandfile Niveau In de eerste methode werden een of meer jobs vanaf dezelfde terminal gestart. Dit bleek te ingewikkeld en leverde tegelijkertijd een beperking op van slechts vier jobs per terminal. We kwamen tot de conclusie dat het beter en overzichtelijker zou zijn als met een en hetzelfde systeem vanaf elke terminal een job gestart zou kunnen worden, echter beperkt tot een job per keer per terminal. De identificatie van de antwoorden files werd daarmee dus 'opgehangen' aan de gebruikte terminal. Aangezien batch programma's te weten moeten zien te komen in welke mode ze moeten werken, batch-mode alleen vanuit een commandfile mag en beperkt moet blijven tot een job per keer per terminal was er dus nog een mechanisme nodig om dat in een besturingslaag boven het programma niveau te regelen. Bovendien wilden we voor de indentificatie van de antwoorden file gebruik maken van het terminal nummer. De oplossing die hiervoor bedacht werd was om een speciale driver te maken die intern de drie verschillende batch toestanden van alle terminals bijhoudt. Deze batch driver is de spil waar het gehele systeem om draait. Het manipuleren van de instellingen gebeurt met behulp van enkele speciale programma's, terwijl de BATCH subroutine de instelling alleen maar kan uitlezen. Een belangrijk uitgangspunt is dat wanneer er geen batch-mode commandfile voor een terminal geactiveerd is de driver in de No-Batch mode staat. Bovenbeschreven methode levert in principe een bijzonder simpele batch commandfile op (Fig.#3), terwijl een samenvatting van de functies van de verschillende onderdelen wordt gegeven in Figuur#4. In het laatste gedeelte zal wat dieper op de functies van INIBAT en BATCH worden ingegaan. Het belangrijkste programma in deze reeks is INIBAT. INIBAT stelt aan de hand van een vraag aan de gebruiker de batch-mode voor de gebruikte terminal in de driver data-base in, met de restrictie dat dit alleen maar kan wanneer het programma vanuit een commandfile gestart wordt. De functie van twee andere programma's, EXB en CLRBAT, is de driver terug te zetten in de No-Batch stand; EXB, gestart door INIBAT, doet dit automatisch wanneer de commandfile klaar is, terwijl CLRBAT met de hand gestart moet worden en alleen dient om mogelijke storingen te herstellen zonder de driver opnieuw te laden. Onderdeel van de gekozen oplossing is dat de tijdens Create Mode aangemaakte antwoorden files in Use Mode weer worden opgeruimd. Omdat het wel eens handig zou kunnen zijn zo'n antwoorden file opnieuw te gebruiken bij een herbewerking van bv. dezelfde data-set worden ze door de BATCH subroutine tevens gecopieerd naar een antwoorden verzamelfile, de zogenaamde .SAV file. De weg terug ofwel het weer in de juiste volgorde herstellen van de afzonderlijke antwoorden files wordt verzorgd door het programma RESCTL. .text deferred .fig 2 .c;Figuur 3 .lm+8 .b 2 .lit RUN $INIBAT ! Initialiseer BA: RUN AAP RUN NOOT : : RUN MIES .EXIT .eli .lm-8 .b 2 .c;Batch Commandfile Voorbeeld .b 2 .end text .; .text deferred .fig 2 .c;Figuur 4 .lm+8 .b .ls 'o' .le;Batch Driver BA: .br;Onthoudt de terminal status .le;Subroutine BATCH .br;Verzorgt de programma instelling .le;INIBAT .ls 0 .le;Initialiseert BA: voor gebruikte terminal in .ls 0 '-' .le;Create Mode .le;Use Mode .le;No-Batch Mode .els 0 .le;Opent de antwoorden files verzamelfile .le;Start EXB .els 0 .le;CLRBAR resp. EXB .br;Zetten BA: terug in No-Batch Mode .le;RESCTL .br;Haalt de antwoorden files weer uit de verzamel file .els 0 .lm-8 .b 2 .c;Batch Programma's en hun Functies .b 2 .end text .hl 2 Batch Programma's In het nu volgende zal wat dieper ingegaan worden op enkele batch hulp-programma's en de batch subroutine. Aan de orde zullen komen de driver BADRV, de programma's INIBAT, CLRBAT, EXB en subroutine BATCH. .hl 3 BADRV De batch driver BADRV is een zeer simpele driver met een interne tabel van negen woorden voor de maximaal negen terminals die op onze PDP-11/60 aangesloten kunnen worden inclusief de console terminal, alhoewel de laatste nooit voor dit doel gebruikt wordt. Met twee speciaal gekozen functiecodes, IO.CON en IO.DIS worden de batch vlaggen in de tabel gezet (IO.CON) en terug gezet (IO.DIS). Door gebruik te maken van de modifier-bit optie in het functiecode woord werd het onderscheid gerealiseerd tussen Create Mode en Use Mode. Een IO.CON zonder modifier-bit (Create Mode) resulteert in de waarde 1 en een met een modifier-bit (Use Mode) in de waarde -1. .br;Het uitlezen van de vlag gebeurt met een IO.RLB functiecode. Tevens wordt dan het terminal nummer van de aanvrager vermeld in het twee woorden grote user-buffer; het eerste woordt bevat de waarde van de vlag en het tweede het terminal nummer. BADRV kent slechts twee I/O status codes, nl. Success en Device-Not-Ready. .hl 3 INIBAT INIBAT heeft twee functionele onderdelen, een eerste algemeen gedeelte en het gedeelte dat de acties uitvoert behorende bij de drie verschillende batch-mode instellingen. .br;De activiteiten van het eerste gedeelte zijn: .ls .le;Zoek uit of de Indirect Commandfile Processor actief is voor de terminal die INIBAT startte. .le;Haal de bacth-mode op bij BA: met behulp van een Read-Logical-Block QIO call. INIBAT verwacht daarbij een status No-Batch terug te krijgen. .le;Start het programma EXB. .br;EXB gaat vervolgens staan wachten tot de commandfile klaar is en zet dan BA: terug in No-Batch mode. .le;Vraag de gebruiker om de gewenste mode. .br;[C]reate, [U]se of [N]o-Batch mode. .le;Voer de code uit behorende bij de gekozen mode. .els 0 No-Batch Mode Als _...AT. of AT.Txx niet geactiveerd is door de betreffende terminal stopt INIBAT met de mededeling niet gestart te zijn vanuit een commandfile. Create Mode Indien Create Mode werd gekozen: .ls .le;Wordt er een BATCHTTxx.SAV file gecreeerd t.b.v. het naderhand opslaan van de antwoorden files tijdens Use Mode. .le;Wordt er een identificatie record, bevattende de terminal naam en de creatie datum en tijd, in de .SAV file geschreven. .le;Worden alle mogelijk nog aanwezige .CTL files van vorige jobs opgeruimd. Dit is zeer essentieel omdat subroutine BATCH een .CTL file met een zo laag mogelijk versie nummer probeert te gaan lezen. .le;Zet de Create Mode vlag in BA: m.b.v. een IO.CON QIO functie code zonder modifier-bit. .els 0 Use Mode In Use Mode wordt: .ls .le;De eerder gecreeerde .SAV file geopend. .le;Het identificatie record gelezen en de gebruiker om bevestiging gevraagde of dit de gewenste job is, en indien dit zo is .le;Wordt de Use Mode vlag is BA: gezet m.b.v. de IO.CON QIO functie code, maar nu wel met een modifier bit. .els 0 .hl 3 EXB EXB doet niets anders dan: .ls .le;Het terminal nummer ophalen bij BA: m.b.v. een IO.RLB QIO functie code. .le;Uitzoeken wie de actieve commandfile processor is voor deze terminal. .le;Een call CNCT doen naar deze image. .le;Wachten tot deze niet meer actief is. .le;De terminal status terug zetten in No-batch mode in BA: m.b.v. een IO.DIS QIO functie code. .els 0 CLRBAT doet precies hetzelfde, echter met uitzondering van de connect fase. .hl 2 Subroutine BATCH BATCH haalt om te beginnen de status op in de driver m.b.v. een IO.RLB QIO functie code en bepaalt aan de hand van de terug gekregen waarde (1, -1 of 0) of het programma in Create Mode, Use Mode of No-batch Mode zal draaien en welke terminal in gebruik is. No-Batch Mode In dit geval worden de logicals BATFLG en PRCFLG op False resp. True gezet, terwijl LUN 5 en 6 aan TI: worden gekoppeld en de antwoorden file LUN aan NL: (zie Fig.#1). Create Mode Create Mode resulteert in de volgende stappen: .ls .le;Hang TI: aan LUNs 5 en 6. .le;Open een antwoorden file op LUN 7. .le;Bepaal de run-time programma naam en vervang elke punt die daarin voorkomt door de letter D. .le;Noteer de run-time programma naam in het eerste record van de antwoorden file. .le;Vraag de gebruiker of deze naderhand de vragen en antwoorden op de terminal wil zien. .br;Schrijf een record met N of Y in de antwoorden file. .le;Zet de logicals BATFLG en PRCFLG op True resp. False. .els 0 Use Mode Na de selectie Use Mode gebeurt het volgende: .ls .le;Zoek de antwoorden file met het laagste versie nummer op. .le;Bepaal de run-time taskname. .le;Rename de BATCHTTxx.CTL antwoorden file in _Txx.CTL. .le;Append _Txx.CTL aan de BATCHTTxx.SAV verzamelfile. .le;Open de antwoorden file op LUN 5 met als keyword DISPOSE=DELETE. .le;Koppel LUNs 6 en 7 aan .br;TI: indien vragen en antwoorden getoond moeten worden en aan .br;NL: indien niet. .le;Zet de logicals BATFLG en PRCFLG beiden op True. .els 0 De rename operatie dient om ervoor te zorgen dat onder alle omstandigheden het erop volgende programma niet geconfronteerd wordt met de antwoorden file van zijn voorganger. Het volgende voorbeeld (Fig.#5) toont, aan de hand van Fig.#3, de aanwezige antwoorden files voor, tijdens en na afloop van het draaien van het eerste programma. .text .fig 2 .c;Figuur 5 .lm+8 .b 2 .ls 'o' .le;Voor RUN AAP .b;BATCHTT07.CTL;1 .BR;BATCHTT07.CTL;2 .BR;BATCHTT07.CTL;3 .br;######: .BR;BATCHTT07.CTL;n .le;Tijdens RUN AAP .b;TT7T07.CTL;1 .BR;BATCHTT07.CTL;2 .BR;BATCHTT07.CTL;3 .br;######: .BR;BATCHTT07.CTL;n .le;Na RUN AAP .B;BATCHTT07.CTL;2 .BR;BATCHTT07.CTL;3 .br;######: .BR;BATCHTT07.CTL;n .els 0 .lm-8 .b 2 .c;Antwoorden Files in Use Mode .b 2 .end text .hl 1 Conclusie Het besproken batch systeem voor RSX-11M is nu al bijna acht jaar dagelijks in gebruik. In deze periode heeft het geen wijzigingen meer ondergaan, is betrouwbaar en voldoet nog steeds erg goed. De extra benodigde code in een programma is zeer eenvoudig aan te brengen en vraagt weinig extra geheugen ruimte, terwijl voor batch verwerking een commandfile alleen maar behoeft te worden voorzien van een RUN _$INIBAT. Het leuke van dit systeem is dat voor de gebruiker Create Mode en No-Batch Mode precies hetzelfde 'gezicht' hebben, alles gaat exact hetzelfde. De eigenlijke 'submit' fase van de batchjob wordt geactiveerd door het opnieuw laten uitvoeren van de commandfile en het intikken van de letter U voor Use Mode op de door INIBAT gestelde mode vraag. Daarna verloopt alles vanzelf. De dataverwerking waarvoor het oorsponkelijk werd ontwikkeld doen we sinds jaren niet meer, daarvoor in de plaats kwamen andere programma's die nog meer data te verwerken kregen en nog langer lopen. Deze laatstgenoemde programma's werken met schermformulieren voor het opgeven van de verwerkings condities. Deze TFR subroutine bibliotheek, onderdeel van het in de Program Library aanwezige TRAMP pakket en waarover op de RSX Najaarsbijeenkomst in 1985 een voordracht werd gehouden, werd met veel succes aangepast voor onze vorm van batch verwerking. In huidige situatie worden de ingevulde schermen als een antwoorden file opgeslagen. .;- - - - - - W A R N I N G - - - - - - - .; Keep these last lines always at the end of the file .; The next line must never be deleted ! ! ! ! ! ! .ifnot LN03 .require "lb:[5,101]LA120DEF" .; Esc. seq. definitions to reset LA120 .endif LN03