Lerninhalte finden
Features
Entdecke
© StudySmarter 2024, all rights reserved.
Ein Job soll erstellt werden, der in drei Schritten eine große Textdatei verarbeitet. Zuerst soll die Datei sortiert werden, dann gefiltert und schlussendlich in eine neue Datei geschrieben werden. Dazu sollen JCL-Statements verwendet werden, um diesen Workflow auf einem Mainframe automatisch auszuführen.
Erstelle ein JCL-Job, der die Datei INPUT.TXT sortiert und die Ergebnisse in SORTED.TXT schreibt. Nutze die relevanten JCL-Statements und Parameter, die in der Vorlesung behandelt wurden.
Lösung:
Hier ist ein Beispiel für einen JCL-Job, der die Datei INPUT.TXT sortiert und die sortierten Ergebnisse in SORTED.TXT schreibt:
//JOBNAME JOB (ACCOUNT),'SORT FILE',CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID //STEP1 EXEC PGM=SORT //SORTIN DD DSN=INPUT.TXT,DISP=SHR //SORTOUT DD DSN=SORTED.TXT, // DISP=(NEW,CATLG,DELETE), // SPACE=(CYL,(5,1)), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=8000) //SYSIN DD * SORT FIELDS=(1,80,CH,A) /* //SYSOUT DD SYSOUT=* //SYSPRINT DD SYSOUT=*
Erweitere das obige JCL-Script, um einen zweiten Schritt hinzuzufügen, der die sortierte Datei SORTED.TXT anhand eines vorgegebenen Musters filtert. Speichere die Ergebnisse in FILTERED.TXT. Implementiere diesen Schritt und achte darauf, den entsprechenden //EXEC
und //DD
Statements zu verwenden.
Lösung:
Hier ist ein aktualisiertes JCL-Script, das zusätzlich zu der Sortierfunktion eine Filterfunktion hinzufügt:
//JOBNAME JOB (ACCOUNT),'SORT AND FILTER FILE',CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID //STEP1 EXEC PGM=SORT //SORTIN DD DSN=INPUT.TXT,DISP=SHR //SORTOUT DD DSN=SORTED.TXT, // DISP=(NEW,CATLG,DELETE), // SPACE=(CYL,(5,1)), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=8000) //SYSIN DD * SORT FIELDS=(1,80,CH,A) /* //SYSOUT DD SYSOUT=* //SYSPRINT DD SYSOUT=* //STEP2 EXEC PGM=ICETOOL //TOOLIN DD * COPY FROM(SORTED.TXT) TO(FILTERED.TXT) USING(RPT1) /* //SORTED DD DSN=SORTED.TXT,DISP=SHR //FILTERED DD DSN=FILTERED.TXT, // DISP=(NEW,CATLG,DELETE), // SPACE=(CYL,(5,1)), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=8000) //TOOLMSG DD SYSOUT=* //DFSMSG DD SYSOUT=*
Zum Abschluss erweitere den Job um einen letzten Schritt, der die gefilterte Datei FILTERED.TXT in eine neue Datei FINAL.TXT kopiert. Implementiere diesen Schritt und stelle sicher, dass alle Job-Abhängigkeiten richtig definiert sind. Nutze den COND
-Parameter, um den gesamten Job bedingt auf den Erfolg der vorherigen Schritte auszuführen.
Lösung:
Hier ist das vollständige JCL-Script, das die Datei INPUT.TXT sortiert, filtert und schließlich die gefilterte Datei in eine neue Datei FINAL.TXT kopiert:
//JOBNAME JOB (ACCOUNT),'SORT, FILTER, COPY FILE',CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID //STEP1 EXEC PGM=SORT,COND=(0,NE) //SORTIN DD DSN=INPUT.TXT,DISP=SHR //SORTOUT DD DSN=SORTED.TXT, // DISP=(NEW,CATLG,DELETE), // SPACE=(CYL,(5,1)), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=8000) //SYSIN DD * SORT FIELDS=(1,80,CH,A) /* //SYSOUT DD SYSOUT=* //SYSPRINT DD SYSOUT=* //STEP2 EXEC PGM=ICETOOL,COND=(0,NE) //TOOLIN DD * COPY FROM(SORTED.TXT) TO(FILTERED.TXT) USING(RPT1) /* //SORTED DD DSN=SORTED.TXT,DISP=SHR //FILTERED DD DSN=FILTERED.TXT, // DISP=(NEW,CATLG,DELETE), // SPACE=(CYL,(5,1)), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=8000) //TOOLMSG DD SYSOUT=* //DFSMSG DD SYSOUT=* //STEP3 EXEC PGM=IEBGENER,COND=(0,NE) //SYSPRINT DD SYSOUT=* //SYSUT1 DD DSN=FILTERED.TXT,DISP=SHR //SYSUT2 DD DSN=FINAL.TXT, // DISP=(NEW,CATLG,DELETE), // SPACE=(CYL,(5,1)), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=8000) //SYSIN DD DUMMY
Du arbeitest als Systemadministrator für einen Großrechner, der auf dem IBM Mainframe-Betriebssystem z/OS läuft. Dein Aufgabenbereich umfasst die Verwaltung von Jobs, die Sicherheitskontrolle, das Dateisystemmanagement und die Überwachung des Systems. Überlege Dir, wie Du auf Grundlage der Funktionen und Architekturen von z/OS, wie in den Notizen beschrieben, spezifische Aufgaben bewältigen kannst.
a) Erkläre die Rolle von JCL (Job Control Language) in der Verwaltung von Jobs und Prozessen in einem z/OS-System. Gib ein Beispiel für ein JCL-Skript, das einen einfachen Batch-Job startet und erläutere die wichtigsten Bestandteile des Skripts.
Lösung:
Auf einem z/OS-System ist die Job Control Language (JCL) essenziell für die Verwaltung von Jobs und Prozessen. JCL ist eine Scriptsprache, die genutzt wird, um dem Betriebssystem Anweisungen zu geben, wie ein Batch-Job ausgeführt werden soll. Sie dient dazu, Jobs zu definieren, deren Abläufe zu steuern und die benötigten Ressourcen bereitzustellen.
Hier ein Beispiel für ein einfaches JCL-Skript, das einen Batch-Job startet:
//JOB1 JOB (ACCT#),'Job Name',CLASS=A,MSGCLASS=A, // NOTIFY=&SYSUID //STEP1 EXEC PGM=IEFBR14 //DD1 DD DSN=USER.TEST.FILE, // DISP=(NEW,CATLG,DELETE), // SPACE=(TRK,(1,1)), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=800)
b) Beschreibe, wie RACF (Resource Access Control Facility) in einem z/OS-Betriebssystem zur Benutzer- und Ressourcenkontrolle eingesetzt wird. Diskutiere die Schritte, die Du unternehmen würdest, um einem neuen Benutzer Zugriff auf einen bestimmten Datensatz im VSAM-Dateisystem zu gewähren.
Lösung:
RACF (Resource Access Control Facility) ist ein Sicherheitsprodukt von IBM, das im z/OS-Betriebssystem eingesetzt wird, um Zugangskontrollen für Benutzer und Ressourcen zu verwalten. Es sorgt dafür, dass nur autorisierte Benutzer Zugriff auf bestimmte Ressourcen (wie Dateien, Programme und Systeme) haben.
Hier sind die Schritte, die unternommen werden müssen, um einem neuen Benutzer Zugriff auf einen bestimmten Datensatz im VSAM-Dateisystem zu gewähren:
Zunächst wird ein neues Benutzerprofil in RACF erstellt. Dies kann mit dem Befehl ADDUSER gemacht werden.
ADDUSER USERID(NAME('Neuer Benutzer') PASSWORD(password))
Falls der neue Benutzer zu einer vorhandenen oder neuen Gruppe gehören soll, kann eine Gruppe definiert werden.
ADDGROUP GROUPID(DATENZUGRIFF)
Füge den Benutzer zur definierten Gruppe hinzu:
CONNECT USERID(GRUPPE(ID=DATENZUGRIFF))
Zugriffsrechte auf den VSAM-Datensatz werden festgelegt. Der Datensatz muss in RACF definiert und zugänglich gemacht werden.
RDEFINE DATASET('VSAM.DATENSATZ.NAME') UACC(NONE)
Erteile dem neuen Benutzer oder der Gruppe die erforderlichen Zugriffsrechte (z.B. Lesen oder Schreiben).
PERMIT 'VSAM.DATENSATZ.NAME' CLASS(DATASET) ID(USERID ODER GRUPPE) ACCESS(READ/UPDATE)
Stelle sicher, dass die Änderungen aktiviert werden, indem das Kommando SETROPTS verwendet wird.
SETROPTS RACLIST(DATASET) REFRESH
Durch diese Schritte wird der neue Benutzer korrekt in das System integriert und erhält Zugriff auf den spezifischen VSAM-Datensatz, wobei die Sicherheitsrichtlinien von RACF eingehalten werden.
c) Diskutiere die Unterschiede und Anwendungsgebiete der verschiedenen Dateisysteme in z/OS (VSAM, HFS, zFS). Erkläre ein Szenario, in dem Du zFS anstelle von VSAM verwenden würdest und warum.
Lösung:
Im z/OS-System gibt es verschiedene Dateisysteme, von denen jedes für spezifische Anwendungsgebiete geeignet ist. Die gebräuchlichsten Dateisysteme sind VSAM, HFS und zFS. Im Folgenden werde ich die Unterschiede und Anwendungen der jeweiligen Dateisysteme erläutern und ein Szenario beschreiben, in dem zFS anstelle von VSAM verwendet wird.
Szenario für die Verwendung von zFS anstelle von VSAM:
Stelle Dir vor, dass Du eine neue Web-Anwendung auf Deinem z/OS-System deployen möchtest. Diese Web-Anwendung basiert auf einer Reihe von UNIX-basierten Werkzeugen und Bibliotheken und benötigt eine ebensolche Dateistruktur, um reibungslos zu funktionieren. Weiterhin ist geplant, dass mehrere Benutzer gleichzeitig auf die Dateien zugreifen und Änderungen vornehmen können.
In diesem Szenario bietet zFS die notwendigen Funktionen und die Leistung, die für die Anforderungen der Web-Anwendung erforderlich sind, während VSAM primär für transaktionsbasierte Batch-Jobs geeignet wäre und nicht die erweiterte UNIX-Integration und Parallelzugriffe bietet, die zFS zur Verfügung stellt.
Du wirst mit einer COBOL-Programmieraufgabe betraut. Entwickle ein COBOL-Programm, das in der Lage ist, grundlegende finanzielle Berechnungen durchzuführen und die Ergebnisse auf dem Bildschirm auszugeben. Das Programm soll dabei Dateneingaben vom Benutzer entgegennehmen. Die Struktur des Programms muss alle typischen COBOL-Divisionen enthalten: IDENTIFICATION DIVISION, ENVIRONMENT DIVISION, DATA DIVISION und PROCEDURE DIVISION.
Erstelle den Header und die DATA DIVISION deines COBOL-Programms. Definiere in der DATA DIVISION alle Variablen, die Du für die Berechnung und Ausgabe benötigst. Berücksichtige dabei folgende Datentypen: numerisch und alphanumerisch.
Lösung:
Im folgenden Abschnitt erstelle ich den Header und die DATA DIVISION für das COBOL-Programm, das zur Durchführung grundlegender finanzieller Berechnungen dient. Der Header beinhaltet die IDENTIFICATION DIVISION und die ENVIRONMENT DIVISION, während die DATA DIVISION die Variablendeklarationen enthält, die für die Berechnungen und Ausgaben benötigt werden.
Hier ist der Code:
' IDENTIFICATION DIVISION. PROGRAM-ID. FinanzBerechnung. AUTHOR. Dein Name. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. IBM-370. OBJECT-COMPUTER. IBM-370. DATA DIVISION. FILE SECTION. WORKING-STORAGE SECTION. 01 WS-Feld. 05 WS-Betrag1 PIC 9(7)V99. 05 WS-Betrag2 PIC 9(7)V99. 05 WS-Ergebnis PIC 9(7)V99. 05 WS-Operation PIC X(1). 01 WS-AnzeigeFeld. 05 WS-AnzeigeText PIC X(50) VALUE 'Das Ergebnis der Berechnung ist: '. 05 WS-AnzeigeWert PIC 9(7)V99. PROCEDURE DIVISION. '
Dieser Header und die DATA DIVISION decken die grundlegenden Variablen ab, die wir für die finanzielle Berechnung und die entsprechende Ausgabe benötigen. Die numerischen Variablen sind mit PIC 9(7)V99 deklariert, was bedeutet, dass sie bis zu 7 Stellen vor dem Dezimalpunkt und 2 Stellen nach dem Dezimalpunkt haben können. Die alphanumerische Variable WS-Operation ist mit PIC X(1) deklariert, um ein einzelnes Zeichen aufzunehmen, das die durchzuführende Operation darstellt.
Implementiere in der PROCEDURE DIVISION eine Routine, die zwei vom Benutzer eingegebene numerische Werte einliest, diese addiert und das Ergebnis auf dem Bildschirm ausgibt. Zeige den gesamten Code und erkläre die Funktion jeder Anweisung kurz.
Lösung:
Ich werde jetzt die Aufgabe lösen, indem eine Routine in der PROCEDURE DIVISION implementiert wird, die zwei numerische Werte vom Benutzer einliest, diese addiert und das Ergebnis auf dem Bildschirm ausgibt.
Hier ist der vollständige COBOL-Code mit den erforderlichen Divisionen und Anweisungen:
' IDENTIFICATION DIVISION. PROGRAM-ID. FinanzBerechnung. AUTHOR. Dein Name. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. IBM-370. OBJECT-COMPUTER. IBM-370. DATA DIVISION. FILE SECTION. WORKING-STORAGE SECTION. 01 WS-Feld. 05 WS-Betrag1 PIC 9(7)V99. 05 WS-Betrag2 PIC 9(7)V99. 05 WS-Ergebnis PIC 9(7)V99. 05 WS-Operation PIC X(1). 01 WS-AnzeigeFeld. 05 WS-AnzeigeText PIC X(50) VALUE 'Das Ergebnis der Berechnung ist: '. 05 WS-AnzeigeWert PIC 9(7)V99. PROCEDURE DIVISION. Main-Prozedur. DISPLAY 'Bitte geben Sie den ersten Betrag ein: '. ACCEPT WS-Betrag1. DISPLAY 'Bitte geben Sie den zweiten Betrag ein: '. ACCEPT WS-Betrag2. ADD WS-Betrag1 TO WS-Betrag2 GIVING WS-Ergebnis. MOVE WS-Ergebnis TO WS-AnzeigeWert. DISPLAY WS-AnzeigeText WS-Ergebnis. STOP RUN. '
Erklärung der Funktionen jeder Anweisung:
Dieser Code zeigt Schritt-für-Schritt, wie Benutzereingaben gelesen, addiert und die Ergebnisse auf dem Bildschirm angezeigt werden.
Erweitere dein COBOL-Programm um eine Funktion, die eine Gehaltsabrechnung erstellt. Implementiere eine Berechnung, bei der monatliche Abzüge (wie z.B. Steuern und Versicherungen) von einem Bruttogehalt abgezogen werden. Das Ergebnis soll in einer variablen Nettoeinkommen gespeichert und ausgegeben werden. Führe mathematische Berechnungen durch und beschreibe die Schritte detailliert.
Lösung:
Ich werde das bestehende COBOL-Programm erweitern, um eine Gehaltsabrechnungsfunktion zu implementieren. Das Programm soll monatliche Abzüge (z.B. Steuern und Versicherungen) von einem Bruttogehalt abziehen und das Nettoeinkommen berechnen. Anschließend wird das Nettoeinkommen auf dem Bildschirm ausgegeben.
Hier ist der erweiterte COBOL-Code:
' IDENTIFICATION DIVISION. PROGRAM-ID. Gehaltsberechnung. AUTHOR. Dein Name. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. IBM-370. OBJECT-COMPUTER. IBM-370. DATA DIVISION. FILE SECTION. WORKING-STORAGE SECTION. 01 WS-Feld. 05 WS-Bruttogehalt PIC 9(7)V99. 05 WS-Steuern PIC 9(7)V99. 05 WS-Versicherung PIC 9(7)V99. 05 WS-Nettoeinkommen PIC 9(7)V99. 01 WS-AnzeigeFeld. 05 WS-AnzeigeText PIC X(50) VALUE 'Das Nettoeinkommen beträgt: '. 05 WS-AnzeigeWert PIC 9(7)V99. PROCEDURE DIVISION. Main-Prozedur. DISPLAY 'Bitte geben Sie das Bruttogehalt ein: '. ACCEPT WS-Bruttogehalt. DISPLAY 'Bitte geben Sie die monatlichen Steuern ein: '. ACCEPT WS-Steuern. DISPLAY 'Bitte geben Sie die monatlichen Versicherungen ein: '. ACCEPT WS-Versicherung. SUBTRACT WS-Steuern WS-Versicherung FROM WS-Bruttogehalt GIVING WS-Nettoeinkommen. MOVE WS-Nettoeinkommen TO WS-AnzeigeWert. DISPLAY WS-AnzeigeText WS-Nettoeinkommen. STOP RUN. '
Erklärung der Funktionen jeder Anweisung:
Dieser erweiterte COBOL-Code zeigt, wie Bruttogehalt, Steuern und Versicherungen eingelesen und das Nettoeinkommen berechnet und angezeigt werden.
Du arbeitest als Mainframe-Entwickler und Dein Team hat die Aufgabe, die Leistung einer bestehenden COBOL-Anwendung zu optimieren. Die Anwendung verarbeitet täglich eine große Menge an Transaktionsdaten und es gibt Berichte darüber, dass sie zu Spitzenzeiten signifikante Verzögerungen aufweist. Du musst mehrere Schritte unternehmen, um diese Anwendung zu analysieren und zu optimieren. Berücksichtige dabei die nachfolgenden Optimierungstechniken:
a) Beschreibe detailliert, wie Du vorgehen würdest, um die bestehenden Programme zu analysieren und Engpässe zu identifizieren. Verwende dafür konkrete Methoden und Tools, die im Mainframe-Umfeld gängig sind.
Lösung:
Um die Leistung einer bestehenden COBOL-Anwendung zu optimieren, müssen wir systematisch vorgehen, um Engpässe zu identifizieren und zu analysieren. Hier ist ein detaillierter Ansatz:
Zusammengefasst sollte diese herangehensweise eine umfassende und detaillierte Analyse der bestehenden COBOL-Anwendung ermöglichen und die Identifikation von Engpässen unterstützen.
b) Im Anschluss an die Analyse entscheidest Du, die Algorithmen und Datenstrukturen zu optimieren. Nimm an, Du hast eine Funktion gefunden, die sehr oft aufgerufen wird und aktuell eine Zeitkomplexität von \(O(n^2)\) aufweist. Beschreibe einen alternativen Ansatz zur Optimierung dieser Funktion und berechne die neue Zeitkomplexität. Gehe dabei etwa auf eine Optimierung von \(O(n)\) ein und erkläre Deine Lösung Schritt für Schritt. Wenn es sinnvoll ist, kannst Du dazu auch Pseudocode oder COBOL-Code-Snippets verwenden.
Lösung:
Um eine Funktion mit einer aktuellen Zeitkomplexität von O(n²) auf O(n) zu optimieren, müssen wir einen alternativen Algorithmus finden, der die gleiche Aufgabe effizienter erledigen kann. Hier ist ein Beispiel, wie dies durchgeführt werden kann.
Nehmen wir an, die Funktion durchsucht ein Array, um Paare von Elementen zu finden, die eine bestimmte Bedingung erfüllen (z.B. eine Zielsumme). Der ursprüngliche Algorithmus hat eine doppelte Schleife, die zu einer Zeitkomplexität von O(n²) führt.
Perform varying i from 1 by 1 until i > MAX-INDEX Perform varying j from i+1 by 1 until j > MAX-INDEX If (ARRAY(i) + ARRAY(j) = TARGET-SUM) DISPLAY 'Pair found: ' ARRAY(i) ' and ' ARRAY(j) End-if End-performEnd-perform
Dieser Algorithmus prüft jedes Paar von Elementen und hat deshalb eine Zeitkomplexität von O(n²).
Eine effizientere Lösung würde ein Hash-Set verwenden, um die Zeitkomplexität auf O(n) zu reduzieren. Dabei gehen wir die Liste nur einmal durch und überprüfen, ob das Komplement eines Elements (d.h. TARGET-SUM - aktuelles Element) bereits im Hash-Set vorhanden ist. So kann jedes Element in konstanter Zeit geprüft und eingefügt werden.
Initialize an empty SetPerform varying i from 1 by 1 until i > MAX-INDEX Compute complement = TARGET-SUM - ARRAY(i) If Set contains complement DISPLAY 'Pair found: ' complement ' and ' ARRAY(i) Else Add ARRAY(i) to Set End-ifEnd-perform
In diesem Pseudocode wird jedes Element nur einmal untersucht und entweder das Komplement gefunden oder das Element zum Set hinzugefügt. Die Zeitkomplexität für das Durchsuchen und Einfügen in das Set ist O(1), was zu einer Gesamtzeitkomplexität von O(n) führt.
Ein entsprechender COBOL-Code, der diesen Ansatz umsetzt, könnte wie folgt aussehen:
WORKING-STORAGE SECTION.01 SUB-VALUE PIC 9(5).01 SET-TABLE OCCURS 100 INDEXED BY S-INDEX.01 SET-COUNT PIC 9(5) VALUE 0.PROCEDURE DIVISION. Perform varying i from 1 by 1 until i > MAX-INDEX Compute SUB-VALUE = TARGET-SUM - ARRAY(i) Search SET-TABLE When SET-TABLE (S-INDEX) = SUB-VALUE DISPLAY 'Pair found: ' SUB-VALUE ' and ' ARRAY(i) End-Search If S-INDEX > SET-COUNT Add 1 to SET-COUNT Move ARRAY(i) to SET-TABLE (SET-COUNT) End-if End-Perform
Das obige COBOL-Code-Snippet implementiert den optimierten Algorithmus mit einer Zeitkomplexität von O(n). Dabei werden die Elemente und ihre Komplement überprüft und im Set gespeichert, um die weitere Suche zu erleichtern.
Mit unserer kostenlosen Lernplattform erhältst du Zugang zu Millionen von Dokumenten, Karteikarten und Unterlagen.
Kostenloses Konto erstellenDu hast bereits ein Konto? Anmelden