-
Nun denn, da hat ja IBM am Speichermodell massiv geändert.
Aus MI-Sicht gibt es eben 2 Speicher, Static und Auto.
Bei der Deklaration von Variablen gibt man per INZ die Initialisierung beim Start an.
Beim Verlassen eines Programmes wurde die MI-Anweisung "Deaktivere Programm" vor dem Return ausgeführt.
Damit wurde das Programm aus dem Speicher entfernt, so dass beim nächsten Aufruf die Initialisierungen durch das MI wieder erfolgten.
Mit dem ILE hat sich das wohl geändert, so dass globale und statische Variablen nicht mehr per INZ sondern per Code initialisiert werden, anders lässt sich das nämlich nicht erklären.
Ein ILE-Programmobjekt wird wohl jetzt erst entfernt, wenn die ACTGRP beendet wird.
Innerhalb der DFTACTGRP reicht dann ein RCLRSC.
Damit erklärt sich nun auch der z.T. erhebliche Speicherverbrauch bei ILE.
Im Lebenszyklus eines Dialogjobs werden ja mitunter 1000de Programme aufgerufen.
Auch wenn also jedes Programm mit *INLR = *ON verlassen wird, so verbleibt es wohl doch im Speicher bzw. alle statischen Variablen bleiben aktiv.
Das ist schon eine ganze Menge.
Ein weiterer Effekt ist nun, dass eine benannte ACTGRP nun nicht mehr beendet wird, wenn das oberste Programm mit LR = *ON endet, siw wird nur als inaktiv aufgeführt!
Das funktioniert nun nur bei ACTGRP(*NEW).
Wenn ich also meinen Job sauber aufräumen will muss ich also tatsächlich bei benannten ACTGRP's einen RCLACTGRP anfordern damit der Speicher aufgeräumt wird, *INLR reicht nicht mehr.
Jetzt frage ich mich allerdings, wie man denn tatsächlich ein Programm gezielt aus einer ACTGRP entfernen kann. Unter OPM gab es dafür die Anweisung "FREE", die in ILE nicht mehr erlaubt ist.
-
... das einzige, was sich da geändert hat, ist das Handling von LR!
bei OPM: Programm wird aus dem Speicher gelöscht
bei ILE: Programm wird nicht gelöscht, sondern global (static) Vars initialisiert (bei SRVPGM keine Auswirkung)
Das war aber bei ILE von Beginn an so!
ACTGRP *NEW für Programme ist keineswegs ein Allheilmittel, das führt nämlich dazu, dass alles, was untendrunter mit *CALLER läuft neu aktiviert wird, auch wenn es bereits anderweitig im Speicher ist.
Irgendwo in der Mitte bewegt man sich, wenn man bei Programmen ACTGRP = Programmname verwendet, dann kann man wenigstens gezielt deaktivieren, wenn man RCLACTGRP Programmname macht. Bei klarem ILE Design, wo man in einem Job nur 1 Programm aktiv hat und alle Subfunktionen in SRVPGMs sind, ist dies auch meine Empfehlung.
Speicherverbrauch ist auf einer AS/400 eigentlich eher unkritisch (->Single level store), die Aktivierung ist da meist dominierend, sprich große Speichermengen zu holen ist teuer, da das einpagen in kleinen Dosen erfolgt und nicht sehr effizient ist. Meist ist drinlassen und verdrängen lassen die bessere Wahl.
Noch eine Anmerkung zu ACTGRP und SRVPGM: Für Zustandsbehaftete SRVPGMs ist *CALLER am Besten, Zustandslose ACTGRP = SRVPGMName oder gleich fester Wert (bei mir NORECLAIM)
D*B
-
"Bei klarem ILE Design, wo man in einem Job nur 1 Programm aktiv hat..." ist ja in Dialogjobs nicht durchführbar. Aus einem Menü heraus kann ich zig Programme aufrufen, die nun ja nach ILE alle im Speicher bleiben.
-
... natürlich ist das durchführbar, pro Anwendung reicht ein main, der Rest sind SRVPGMs. Wenn allerdings im Callstack mehrere Programme übereinander liegen, die dann wieder gemeinsam dieselben SRVPGMs nutzen, spätestens dann kann von klarem ILE Design keine Rede mehr sein.
D*B
-
Das klingt aber mehr nach einem nachprogrammierten DFU als nach einer feinen 5250-Anwendung.
Aus der Auftragserfassung im Matchcode einen Fehler bei einem Kunden entdecken und in der Kundenstammwartung beheben - ich kenne mehrere Pakete, in denen so etwas möglich ist, ohne wieder ins Menü zurückzusteigen.
Wäre dann nur das Menü das Programm und alles andere in Serviceprogrammen, um als echte ILE-Anwendung durchzugehen?
-
... das hat mit "durchgehen" nix zu tun und mit DFU erst recht nicht. Um bei Deinem Beispiel zu bleiben, wäre der Aufruf aus dem Kundenstamm in der Tat ein procedure call mit einer Verzweigung in ein SRVPGM der Kundenstammwartung. Ob man nun einen einzigen Einstieg (= Programm), oder mehrere hat, hängt dann von der Paketierung der Module ab.
Implementiert man das über programm calls, kriegt man die Probleme, die manche Anwendung damit hat, Vermeidung von Rekursion, Verlust von Informationen bei Rücksprüngen aus tieferer Verschachtelung etc.; das ist mit ILE einfacher zu kontrollieren, da man da flexibler einen gemeinsamen Informationshaushalt abbilden kann, der den Status des gesamtem Prozesses beinhaltet.
D*B
Similar Threads
-
By hartmuth in forum NEWSboard Programmierung
Antworten: 3
Letzter Beitrag: 18-09-14, 09:57
-
By SourceCoder in forum NEWSboard Programmierung
Antworten: 1
Letzter Beitrag: 03-04-14, 11:22
-
By danielfeurstein in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 22-07-02, 15:19
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks