Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

ENAMP - Memory Pool eröffnen

&pagelevel(3)&pagelevel

Allgemeines

Anwendungsgebiet:

Memory Pool Technik; siehe "Gemeinsamer Speicherbereich für mehrere Anwender (Memory Pool)"

Makrotyp:

S-Typ, MF-Format 1: Standardform/L-/E-Form;

siehe "S-Typ-Makroaufrufe"


Ein Memory Pool (MP) ist ein Speicherbereich im Klasse-6-Speicher, der von mehreren Anwendern gemeinsam benutzt werden kann. Seine Größe (Lage), Bezeichnung (Name) und Speicherattribute werden von dem Anwender festgelegt, der den Memory Pool einrichtet.

Es können sowohl Memory Pools aus 64KB-Einheiten als auch aus 1MB-Einheiten angelegt werden. Memory Pools aus 64KB-Einheiten werden immer unterhalb der 16MB-Grenze angelegt und langfristig nicht unterstützt. Aus diesem Grund und wegen möglicher Performanceeinbußen sollten Memory Pools aus 64KB-Einheiten nicht mehr angelegt werden. Die Größe des Memory Pools und die Belegung der Speicherseiten können mit dem Makro MINF abgefragt werden.

Makrobeschreibung

Mit dem Makro ENAMP kann ein Anwender einen Memory Pool einrichten oder seine Teilnahme an einem existierenden Memory Pool erklären. Dem Aufrufer wird vom System eine Kurzkennung für den Memory Pool zurückgegeben. Die Kurzkennung kann zur Beschleunigung der Verarbeitung in weiteren Pool-Aufrufen (CSTMP, REQMP, RELMP, DISMP) verwendet werden; sie kann für verschiedene Pool-Teilnehmer verschieden sein.
Für einen neu einzurichtenden Memory Pool legt der Aufrufer mit ENAMP folgende Poolattribute unveränderlich fest:

  • Name des Memory Pools

  • Geltungsbereich (Teilnehmerkreis: nur der Aufrufer, alle Tasks unter der Benutzerkennung des Aufrufers, alle Tasks aus der Benutzergruppe des Aufrufers, alle Tasks im System)

  • Größe

  • Anfangsadresse (einheitlich oder beliebig für alle Pool-Teilnehmer)

  • Lage (unterhalb der 16 MB-Grenze oder beliebig für alle Pool-Teilnehmer)

  • Seitenverwaltung (resident oder pageable (seitenwechselbar))

Mit ENAMP wird der angegebene Speicherplatz im Adressraum des Aufrufers reserviert. Die Anforderung der Seiten erfolgt mit REQMP.

Für die Teilnahme an einem existierenden Memory Pool gilt:

  • Ein Memory Pool kann nur über seinen Namen in Verbindung mit dem Geltungsbereich (Operand SCOPE) eindeutig identifiziert werden (in nachfolgenden Aufrufen genügt die Kurzkennung).

  • Der Teilnehmer darf keine abweichenden Poolattribute (siehe oben) spezifizieren (am besten ist es, die Voreinstellung zu benutzen).

  • Jeder Teilnehmer kann mit REQMP Speicherplatz (innerhalb des Memory Pools) anfordern und mit RELMP Speicherplatz freigeben.

  • Jeder Teilnehmer mit der Berechtigung CSTMP-MACRO-ALLOWED=*YES im Benutzerkatalog kann für die Speicherseiten einen Zugriffsschutz vereinbaren oder aufheben (CSTMP).

  • Jeder Teilnehmer kann mit DISMP seine Teilnahme an einem Memory Pool beenden.

Hinweise

  • WRCPT-Makro, Kommandos HOLD-TASK und RESTART-PROGRAM werden abgewiesen, wenn eine Task Teilnehmer an einem Memory-Pool ist.

  • dynamisch versorgte Datenbereiche und Ein-/Ausgabebereiche sollten nicht in Memory Pools abgelegt werden (sonst ist unübersichtliche Synchronisation erforderlich).

Makroaufrufformat und Operandenbeschreibung

ENAMP

{ MPNAME=name / MPNAMAD={adr / (r)} [,MPNAMLN={länge / (r)}] }

,SCOPE=LOCAL / GROUP / USER_GROUP / GLOBAL

[,MPIDRET=adr / (r)]

,MODE=ANY / NEW / OLD

[, { BSIZE={größe / (r)} / PSIZE={größe / (r)} }]

[,LOC=BELOW]

[,PAGE=adr / (r)]

[,FIXED=YES]

,RES=NO / YES

,INHERIT=YES / NO

[,PARMOD=24 / 31]

[,MF=L / (E,..)]

MPNAME=
bezeichnet den Namen des Memory Pools (Verbindung mit Operand SCOPE beachten).

name

Name des Memory Pools; 1 <= Namenslänge <= 54 Zeichen


Namensbildung:
1. Zeichen:     Buchstabe oder Sonderzeichen #,@.
2.-54. Zeichen: beliebige Kombination aus der Zeichenmenge
                (A,...,Z,0,...,9,$,#,@).
Das erste Blank (X'40') beendet den Namen.


MPNAMAD=
beschreibt die Adresse des Feldes mit name (Verbindung mit Operand SCOPE beachten).

adr
symbolische Adresse (Name) des Feldes

(r)
r = Register mit dem Adresswert des Feldes

MPNAMLN=
beschreibt die Länge des unter MPNAMAD angegebenen Namens. Wenn nicht spezifiziert: Längenattribut des Feldes adr bzw. 54 Byte, falls MPNAMAD=(r) angegeben wurde.

länge
Länge in Byte

(r)
r = Register, das länge enthält

SCOPE=
beschreibt den Geltungsbereich (Teilnehmerkreis) des Memory Pools.
Die Angabe dient der eindeutigen Bezeichnung des Memory Pools und muss in Verbindung mit den Operanden MPNAME und MPNAMAD spezifiziert werden. Voreinstellung beachten!

LOCAL
Der Memory Pool wird nur von dem einrichtenden Teilnehmer benutzt.

GROUP
Teilnehmer können alle Tasks mit der Benutzerkennung des einrichtenden Teilnehmers sein.

USER_GROUP
Teilnehmer können alle Tasks sein, deren Benutzerkennungen der gleichen Benutzergruppe angehören wie die Benutzerkennung des einrichtenden Teilnehmers. Der Operandenwert setzt die Existenz von Benutzergruppen voraus und kann daher nur angegeben werden, wenn die Funktionseinheit SRPM des Software-Produkts SE-COS im System vorhanden ist. Vor einem Makroaufruf mit SCOPE=USER_GROUP muss deshalb mit dem Makro GETUGR (siehe Handbuch „SECOS“ [14]) geprüft werden, ob SRPM zur Verfügung steht; abhängig vom Ergebnis (Returncode) ist im Programm zu reagieren.

GLOBAL

Teilnehmer können alle im System laufenden Tasks sein.

MPIDRET=
bezeichnet eine Kurzkennung für den Memory Pool. Die Kurzkennung wird dem Anwender vom System nach der Makroausführung zurückgegeben und kann in nachfolgenden Aufrufen (REQMP, RELMP, DISMP, CSTMP) zur eindeutigen Bezeichnung des Memory Pools verwendet werden. Die Verwendung der Kurzkennung beschleunigt die Verarbeitung. Jeder Memory Pool-Teilnehmer erhält durch ENAMP eine eigene Kurzkennung. Eine Ausnahme sind sog. vererbbare Memory Pools, bei denen die „Sohntask“ dieselbe Kurzkennung nutzen kann wie die „Vatertask“.

adr
symbolische Adresse des 4 Byte-Feldes für die Kurzkennung.

(r)
r = Register mit dem Adresswert des Feldes.

MODE=
gibt an, ob der Aufrufer einen Memory Pool neu einrichten oder sich an einen schon bestehenden anschließen will. Im letzteren Fall ist zu beachten, dass ein Memory Pool nur über den Namen und seinen Geltungsbereich (Operand SCOPE) eindeutig identifiziert werden kann.

ANY
Der Aufrufer will sich dem genannten Memory Pool anschließen, falls dieser existiert; wenn nicht, wird ein Memory Pool mit den spezifizierten Attributen für den Aufrufer eingerichtet.

NEW
Der Aufrufer will einen neuen Memory Pool mit den spezifizierten Attributen einrichten. Der Aufruf wird abgewiesen, wenn bereits ein Memory Pool mit dem genannten Namen und Geltungsbereich (SCOPE) existiert.

OLD
Der Aufrufer will sich einem schon bestehenden Memory Pool anschließen. Der Aufruf wird abgewiesen, wenn

  • der Memory Pool nicht existiert,

  • die spezifizierten Poolattribute nicht mit denen übereinstimmen, die beim Einrichten des Pools verbindlich festgelegt wurden,

  • SCOPE=LOCAL angegeben wurde.

BSIZE=
beschreibt die Größe des Memory Pools in 4KB-Einheiten (=Speicherseiten). Der Bereich wird zusammenhängend und je nach Angabe für PAGE bzw. LOC und in Abhängigkeit vom Adressierungsmodus unterhalb bzw. oberhalb der 16MB-Grenze angelegt.
BSIZE kann nicht angegeben werden, wenn beim Einrichten des Memory Pools der Operand PSIZE spezifiziert wurde.

größe

Anzahl der Speicherseiten (4KB); größe = 0 ist unzulässig; der Aufruf wird abgewiesen. Aus Performance-Gründen kann die Größe des Memory Pools vom Betriebssystem aufgerundet werden (s. Hinweis).

(r)
r = Register mit der Anzahl der Speicherseiten Voreinstellung:

  • Ein (neuer) Memory Pool wird aus Kompatibilitätsgründen mit der Voreinstellung für den Operanden PSIZE eingerichtet, wenn weder BSIZE noch PSIZE (explizit) spezifiziert werden.

  • aktueller Wert für bestehenden Memory Pool.

Hinweise

  • Aus Performance-Gründen kann die Größe eines MP wie folgt aufgerundet werden: Der Memory Pool wird in 1MB-Einheiten angelegt und auf 1MB-Grenze ausgerichtet. Die Aufrundung erfolgt aktuell so, dass ein Vielfaches (n) von 1MB-Einheiten erreicht wird (Größe MP = n * 1MB >= größe * 4KB).

  • Diese Art der Aufrundung ist nicht garantiert und kann HSI-abhängig werden. 

PSIZE=
beschreibt die Größe des Memory Pools in 64KB-Einheiten. Der Bereich wird unterhalb der 16MB-Grenze zusammenhängend angelegt und auf 64KB-Grenze ausgerichtet.
PSIZE kann nicht angegeben werden, wenn beim Einrichten des Memory Pools der Operand BSIZE spezifiziert wurde.

größe
Anzahl der Speichereinheiten mit je 64 KB; größe = 0 ist unzulässig; der Aufruf wird abgewiesen.

(r)
r = Register mit dem Wert für größe
Voreinstellung (nur, wenn beim Einrichten des MP der Operand BSIZE nicht spezifiziert wurde):

  • größe = 1 für neu einzurichtenden Memory Pool,

  • aktueller Wert für bestehenden Memory Pool.

Hinweis

Der Operand PSIZE und Memory Pools mit 64KB-Einheiten sollten nur genutzt werden, wenn der Memory Pool auch im 24-Bit-Adressierungsmodus betrieben werden muss. In allen anderen Fällen wird der Parameter BSIZE zur Festlegung der Größe empfohlen.

LOC=
bezeichnet den Teil des Adressraums, in den der Memory Pool platziert werden soll. Die Angabe ist nur sinnvoll bei 31-Bit-Adressierung und in Verbindung mit dem Operanden BSIZE.

BELOW
Der Memory Pool wird unterhalb der 16MB-Grenze im Adressraum des Aufrufers platziert.

Hinweis

Ein Memory Pool, der mit LOC=BELOW und nicht verbindlicher Anfangsadresse eingerichtet wurde, kann für einen anderen MP-Teilnehmer auch in den Bereich oberhalb der 16MB-Grenze seines Adressraums platziert werden.

PAGE=
gibt die Anfangsadresse des Memory Pools im Adressraum des Aufrufers an. Die Anfangsadresse ist wie folgt auszurichten:

  • Ausrichtung auf 64KB-Grenze, wenn der Memory Pool aus 64KB-Einheiten besteht (Operand PSIZE) bzw.

  • Ausrichtung auf 1MB-Grenze, wenn der Memory Pool aus 1MB-Einheiten besteht (Operand BSIZE).

Voreinstellung:
Der erste ausreichend große und zusammenhängende Bereich, auf 64KB- bzw. 1MB-Grenze beginnend, wird ausgewählt.
Im 31-Bit-Adressierungsmodus wird der MP oberhalb der 16MB-Grenze platziert, wenn nicht LOC=BELOW angegeben wurde. Wurde der Memory Pool mit FIXED=YES eingerichtet, gilt für alle weiteren Teilnehmer die verbindlich festgelegte Anfangsadresse. Voreinstellung in diesem Fall: die Anfangsadresse wird übernommen (der Memory Pool wird im Adressraum des Aufrufers so platziert, wie im Adressraum des Aufrufers, der den Memory Pool eingerichtet hat). Die Anfangsadresse wird dem Aufrufer im Register R1 übergeben.

adr

Anfangsadresse.

(r)
r = Register mit dem Adresswert adr

Hinweis

Der Operand PAGE sollte nach Möglichkeit nicht benutzt werden. Ist seine Verwendung jedoch erforderlich, sollte vorher Größe und Lage des Klasse-6-Speichers mit dem Makro MINF abgefragt werden.

FIXED=YES

Der Memory Pool hat für alle Teilnehmer dieselbe virtuelle Anfangsadresse (wird ab dieser Adresse im Adressraum des Aufrufers platziert).

Hinweise

  • Wenn FIXED=YES nicht angegeben wird (vom ersten Aufrufer), dann darf jeder weitere Teilnehmer eine andere Anfangsadresse in seinem Adressraum angeben.

  • Ein Aufrufer, der sich einem Memory Pool anschließen will, kann die Angabe FI-XED=YES nicht rückgängig machen.

  • Die Angabe des Operanden ist nur für den Aufrufer sinnvoll, der den Memory Pool einrichtet. Bei einem Pool-Teilnehmer wird FIXED=YES zurückgewiesen, wenn der Operand nicht schon beim Einrichten des Memory Pools spezifiziert wurde.

RES=
gibt an, ob die Speicherseiten des Pools seitenwechselbar oder resident sein sollen. Diese Eigenschaft wird von dem einrichtenden Aufrufer bestimmt (die maximale Anzahl residenter Speicherseiten ist im Benutzerkatalog festgelegt).

NO
die Speicherseiten sollen seitenwechselbar sein.

YES
die Speicherseiten sollen resident sein.

Hinweis

Bei RES=YES wird die Angabe für den Operanden PSIZE oder BSIZE nicht gegen die Angabe für den Operanden RESIDENT-PAGES im START-PROGRAM- oder LOAD-PROGRAM-Kommando geprüft. Die Prüfung erfolgt erst, wenn mit REQMP Speicherplatz belegt wird.

INHERIT=
spezifiziert die Vererbbarkeit eines Memory Pools, wenn die teilnehmende Anwendertask („Vatertask“) eine neue Task („Sohntask“) erzeugt: „fork()“. Dieser Operand wird nicht unterstützt, wenn ein lokaler und residenter Klasse-6-Memory Pool angegeben oder PARMOD=24 gesetzt wurde. Siehe auch Hinweise auf "ENAMP - Memory Pool eröffnen".

YES
Der Memory Pool soll vererbbar sein, d.h. im Fall eines „fork()“ ist die „Sohntask“ implizit an einen nicht-lokalen Memory Pool der „Vatertask“ angeschlossen.

Für einen lokalen (nicht-residenten) Memory Pool wird der Speicherplatz von der „Vatertask“ in die „Sohntask“ kopiert. Das bedeutet, dass der Speicherplatz für jede Task lokal zur Verfügung steht und die Task über den Inhalt des Memory Pools und die auszuführenden Funktionen frei entscheiden kann.

NO
Im Fall eines „fork()“ ist die „Sohntask“ nicht an den Memory Pool der „Vatertask“ angeschlossen. Der Speicherbereich ist in der „Sohntask“ nicht zugewiesen.

MF=

Zur allgemeinen Beschreibung des Operanden MF, der dazugehörenden Operandenwerte und der evtl. nachfolgenden Operanden (z.B. für einen Präfix) siehe Abschnitt „S-Typ-Makroaufrufe“. Die gültigen MF-Werte sind zu Beginn der Makrobeschreibung bei „Makrotyp“ angegeben und aus dem Aufrufformat ersichtlich.

PARMOD=
steuert die Makroauflösung. Es wird entweder die 24-Bit- oder die 31-Bit-Schnittstelle generiert.
Wenn PARMOD nicht spezifiziert wird, erfolgt die Makroauflösung entsprechend der Angabe für den Makro GPARMOD oder der Voreinstellung für den Assembler (= 24-Bit-Schnittstelle).

24
Die 24-Bit-Schnittstelle wird generiert. Datenlisten benutzen 24-Bit-Adressen (Adressraum <= 16 MB).

31
Die 31-Bit-Schnittstelle wird generiert. Datenlisten benutzen 31-Bit-Adressen (Adressraum <= 2 GB) und beginnen mit dem Standardheader.

Hinweise zur Vererbbarkeit von Memory Pools

  • Für vererbbare, lokale Memory Pools wird für die „Sohntask“ (nach der Taskerzeugung durch die „Vatertask“: „fork()“) implizit ein neuer Memory Pool angelegt. Er hat die gleichen Eigenschaften (Name, Zugriffsrechte, usw.) und den gleichen Inhalt wie der Memory Pool der „Vatertask“ zum Zeitpunkt der Taskerzeugung der „Sohntask“ (realisiert durch den Copy-On-Write-Mechanismus). Das ermöglicht, dass sowohl „Vater-“ als auch „Sohntask“ auf einer gemeinsamen Basis auf den Inhalt des Memory Pools zugreifen können, ihre jeweils eingebrachten Änderungen aber nur lokal im „eigenen“ Memory Pool gelten.

  • Für vererbbare, nicht-lokale Memory Pools geschieht die Vererbung durch einen impliziten ENAMP-Aufruf zum bestehenden Memory Pool während des „fork()“. Das bedeutet, dass „Vater-“ und „Sohntask“ im selben Speicherbereich arbeiten.

  • Die Kurzkennung des Memory Pools (Operand MPIDRET) wird von der „Vatertask“ auf die „Sohntask“ vererbt.

  • Nicht vererbbar dagegen sind das Kontingent zur Anforderung von residenten Speicherseiten und - im Falle eines lokalen Memory Pools - die mit CSTAT PAGE=NO priorisierten, residenten Speicherseiten.

Rückinformation und Fehleranzeigen

Nach Funktionsausführung wird die virtuelle Anfangsadresse des Memory Pools im Register R1 abgespeichert.

R15:

+---------------+
|   |   |   |   |
|b|b|0|0|0|0|a|a|
+---------------+

Über die Ausführung des Makros ENAMP wird ein gegliederter Returncode (aa=primärer RC, bb=sekundärer RC) im Register R15 übergeben.

X'bb'

X'aa'

Erläuterung

X'04'

X'00'

Normale Ausführung. Ein neuer Memory Pool wurde eingerichtet (MO-
DE=NEW/ANY).

X'08'

X'00'

Normale Ausführung. Aufrufer ist neuer Teilnehmer des angegebenen Memory
Pools (MODE=OLD/ANY).

X'04'

X'04'

Funktion nicht ausgeführt. Memory Pool nicht vorhanden (MODE=OLD).

X'08'

X'04'

Funktion nicht ausgeführt. Aufruf bezieht sich auf einen existierenden Memory
Pool.

  • Aufrufer ist schon Teilnehmer des Memory Pools (MODE=OLD/ANY). Register
    R1 enthält die Anfangsadresse und MPIDRET die ID des MPs.

  • Memory Pool existiert schon (MODE=NEW).

  • abweichende Poolattribute angegeben (MODE=OLD/ANY):

    • PSIZE/BSIZE

    • PAGE (bei „fixed“ MP: die Anfangsadresse des MPs wird in Register R1
      zurückgegeben)

    • LOC (bei „fixed“ MP)

    • FIXED

    • RES

X'14'

X'04'

Funktion nicht ausgeführt. Nicht ausreichend freier Platz

  • im Adressraum des Aufrufers

  • im Adressraum unterhalb der 16MB-Grenze (in Verbindung mit LOC=BELOW
    oder PSIZE=....).

X'18'

X'04'

Funktion nicht ausgeführt. Ungültige Speicheradresse:

  • Anfangsadresse oder eine Adresse des angegebenen Bereichs liegt außerhalb
    des Adressraums des Aufrufers.

  • Anfangsadresse oder eine Adresse des angegebenen Bereichs zeigt auf die
    16MB-Grenze oder darüber und LOC=BELOW oder PSIZE=... wurde angegeben.

  • Anfangsadresse nicht auf 64KB/1MB-Grenze ausgerichtet.

  • der angegebene Adressraum ist nicht durchgehend frei.

X'1C'

X'04'

Funktion nicht ausgeführt. Operandenfehler:

  • unzulässige Adresse des Datenbereichs

  • fehlerhafter Aufbau des Datenbereichs

  • unzulässige Adressen für MPNAMAD oder MPIDRET im Datenbereich

  • Benennung des Memory Pools:

    • Name enthält unzulässige Zeichen

    • ungültige Längenangabe (MPNAMLN)

    • Name nicht angegeben (MPNAME, MPNAMAD nicht spezifiziert)

    • MPNAME und MPNAMAD spezifiziert

    • MPNAMLN angegeben, aber MPNAMAD nicht spezifiziert

    • SCOPE angegeben, aber MPNAME/MPNAMAD nicht spezifiziert.

  • ungültige Angaben bei SCOPE/MODE/BSIZE/PSIZE/LOC/FIXED/RES

  • der MP-Name und das Feld, in das die Kurzkennung übergeben wird, überlappen
    sich.

  • ungültiges Register (R1) angegeben.

  • PARMOD=24 in Verbindung mit 31-Bit-Adressierungsmodus (AMODE 31)
    angegeben.

  • SCOPE=USER_GROUP wurde angegeben, obwohl SRPM nicht im System
    vorhanden ist.

  • Bei einem ENAMP-Aufruf für einen bereits existierenden Memory-Pool stimmt
    der aktuelle Zugriffsschlüssel nicht mit dem überein, der bei der Einrichtung
    des Pools gültig war, weil eine der beteiligten Benutzerkennungen immer noch
    das obsolete Privileg SECURE-OLTP besitzt.

  • Es wurde INHERIT=YES angegeben, obwohl der betroffene Memory Pool
    lokal und resident ist oder PARMOD=24 angegeben wurde.

X'20'

X'04'

Funktion nicht ausgeführt. Aufruf kann infolge Speichersättigung momentan nicht
ausgeführt werden. Ein späterer Aufruf kann erfolgreich sein.

31-Bit-Schnittstelle:

  • Bei fehlerhafter Ausrichtung oder Initialisierung des Standardheaders werden im Register R15 zusätzlich die Returncodes X'0001FFFF' / X'0003FFFF' / X'0004FFFF' übergeben; siehe Tabelle „Standard-Returncodes“ (Standardheader).

  • Im Standardheader wird kein Returncode übergeben.