mpcntl(3X) mpcntl(3X)
NAME
mpcntl - Standardschnittstelle für Multiprozessor-Verarbeitung
SYNTAX
cc [option ...] datei ... -lmproc
#include <sys/types.h>
#include <sys/mpcntl.h>
mpcntl(int req, void *arg);
BESCHREIBUNG
mpcntl() stellt dem Programmierer verschiedene Dienste zur Implemen-
tierung seiner Anwendungen in einer Multiprozessor-Umgebung zur Verfü-
gung.
Bindung: Ein Prozeß kann eine Bindung an eine bestimmte CPU (Zentral-
einheit) explizit aufbauen. Dabei kann es sich um eine exklusive Bin-
dung handeln, bei der mehrere Prozesse eine Bindung zu einer CPU ein-
gehen und alle nicht explizit gebundenen Prozesse keinen Zugriff auf
diese CPU haben. Im anderen Fall, dem Standardfall, teilen sich meh-
rere Prozesse eine CPU (ohne Ausschluß anderer Prozesse).
Prozeßsteuerung: Deaktiviert oder aktiviert das Standardverhalten des
Kernel zur Prozeßbearbeitung, das zum Ziel hat, den jeweiligen Cache-
Status zu erhalten. Bei deaktiviertem Standardverhalten steht ein Pro-
zeß jedem Prozessor zur Bearbeitung zur Verfügung.
Eingeschränkte Bearbeitungssteuerung: Ein Prozeß kann ein Vorrecht
anderer Prozesse auf Ablauf vorübergehend aussetzen, bis er Prozeß
blockiert oder dieses Vorrecht wieder aktiviert. Gleichzeitig reagiert
der Prozeß auf keine Signale mehr (außer auf SIGKILL). Der Prozeß kann
die CPU auch freigeben, so daß andere Prozesse bearbeitet werden kön-
nen. Wenn der Prozeß eine hohe Priorität hat, wird er nicht unterbro-
chen.
CPU-Status: Es wird die angeforderte Information über die Anzahl der
CPUs im Rechner und über spezielle CPUs ausgegeben. Es kann auch die
Status-Information einer CPU geändert werden.
req gibt die gewünschte Anforderung an.
arg ist ein Zeiger, der in bestimmten Fällen ein Nullzeiger ist. Übli-
cherweise wird arg als Zeiger auf eine mpcntl-Struktur interpretiert.
Sie wird in der Datei mpcntl.h folgendermaßen definiert:
typedef uintt cpumaskt;
typedef struct mpcreq {
cpumaskt mpccpu; /* CPU-Bezeichner */
pidt mpcpid; /* gültige PID */
} mpcreqt;
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
mpcntl(3X) mpcntl(3X)
Das Feld mpccpu ist eine cpumaskt-Struktur (int), bei der jedes Bit
eine logische CPU darstellt (Bit 0 stellt die CPU 0 dar, Bit 1 die CPU
1 usw.). So ist es möglich, gleichzeitig mehr als eine CPU-Nummer an
das System weiterzugeben. Das Makro CPUNOTOLCPUID wird zur Konver-
tierung von CPU-Nummern und einem Bit in der Maske cpumaskt verwen-
det. Es ist nicht nötig, mehr als eine CPU anzugeben. mcppid ist eine
pidt-Struktur mit einer gültigen Prozeßnummer (dem Rückgabewert eines
Aufrufs von getpid()).
Durch eine unsachgemäße Anwendung einiger mpcntl-Operationen kann der
Systemablauf beeinträchtigt werden, oder es kann unter Umständen sogar
zu einem Deadlock kommen. Zur Vermeidung solcher Situationen sollten
diese mpcntl-Optionen nur vom Systemverwalter (Benutzernummer 0) bzw.
nur von Benutzern mit besonderen mpcntl-Rechten verwendet werden.
Es folgen die möglichen Anforderungen an mpcntl() mit der jeweiligen
arg-Beschreibung:
MPCNTLBIND und MPCNTLBINDXCLU
Eine (exklusive) Bindung zwischen dem angegebenen Prozeß und min-
destens einer angegebenen CPU wird hergestellt. Eine exklusive
Bindung unterscheidet sich von einer regulären Bindung dadurch,
daß bei einer exklusiven Bindung die CPU tatsächlich nur die
gebundenen Prozesse ausführt. Man könnte dies als eine Art "pri-
mitive CPU/Prozeßverwaltung" bezeichnen. arg zeigt auf die Daten-
struktur mpcreqt, die logische Ziel-CPUs und eine gültige Pro-
zeßnummer angibt. Mit MPCNTLBIND und MPCNTLBINDXCLU kann eine
Bindung zwischen einem Prozeß und mehreren CPUs hergestellt wer-
den, wenn in mpccpu mehrere Bit gesetzt sind. Dadurch werden
alle Prozessoren für diese Bindung reserviert und es wird ausge-
schlossen, daß diese CPUs andere, nicht explizit gebundene Pro-
zesse ausführen. Sie sollten daher auf einen gezielten Einsatz
achten.
Bei asymmetrischen Systemen sollten Sie darauf achten, daß Pro-
zesse immer Zugriff auf die notwendigen Ressourcen haben (zum
Beispiel auf das Gleitpunktregister). Sollte ein Prozeß nicht auf
eine notwendige Ressource zugreifen können, versucht das System
diesen Fehler zu beseitigen, indem die Bindung geändert oder
gelöscht wird. Nach erfolgreicher Ausführung des Aufrufs läuft
der Prozeß auf einer der Ziel-CPUs (z. B. bei bereits vorliegen-
der Bindung).
Die Attribute der Bindung werden auch mit den Systemaufrufen
fork(2) und exec(2) vererbt. Die Ausführung ist unter Umständen
nicht erfolgreich, wenn durch MPCNTLCPUINFOSET eine Änderung an
einer Ziel-CPU vorgenommen wurde, um die angeforderte Operation
auszuschließen (z. B. wenn die CPU als nicht verfügbar gekenn-
zeichnet wurde (CPIFSNAVAIL) oder mit CPIFSBINDOFF oder
CPIFSXBINDOFF dieser Bindungstyp ausgeschlossen wurde).
MPCNTLBINDXCLU kann nur vom Systemverwalter benutzt werden.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
mpcntl(3X) mpcntl(3X)
MPCNTLUNBIND
Die Bindung des angegebenen Prozesses an mindestens eine CPU wird
gelöst. Es wird also das Gegenteil von MPCNTLBIND bzw.
MPCNTLBINDXCLU bewirkt. Bei der Lösung einer exklusiven Bindung
eines Prozesses wird der entsprechende Prozessor wieder für alle
Prozesse verfügbar, wenn die gelöste Bindung die letzte exklusive
Bindung dieser CPU war. arg zeigt auf die Datenstruktur mpcreqt,
die die Ziel-Prozeßnummer angibt. Bestehende Bindungen können mit
aufeinander folgenden MPCNTLBIND- bzw. MPCNTLBINDXCLU-Aufrufen
geändert werden. So können alte Bindungen gelöscht und neue ein-
gerichtet werden, ohne MPCNTLUNBIND aufzurufen.
MPCNTLAFFINOFF und MPCNTLAFFINON
Deaktiviert bzw. aktiviert das Standardverhalten, das eine schwa-
che Bindung zwischen einem Prozeß und der CPU, auf der der Prozeß
zuletzt lief, bewirkt. Wenn dieses Verhalten deaktiviert ist,
läuft der Prozeß auf der CPU, die als nächste frei wird (wobei
die üblichen Prioritäten berücksichtigt werden). arg zeigt auf
die Datenstruktur mpcreqt, die die Ziel-Prozeßnummer angibt.
Nach einem Aufruf von exec(2) wird die Standardeinstellung
MPCNTLAFFINON wiederhergestellt. Andererseits wird eine Deakti-
vierung des Standardverhaltens vom Systemaufruf fork(2) vererbt.
Diese Aufrufe bleiben wirkungslos, wenn das Standardverhalten
durch eine Systemeinstellung deaktiviert ist.
MPCNTLNOPRMPT und MPCNTLPRMPT
Das Vorrecht des aktuellen Prozesses wird deaktiviert bzw. akti-
viert und der Prozeß reagiert nicht mehr auf Signale (optional).
Mit dieser Option ist es möglich, einen Prozeß in einem kriti-
schen Bereich ablaufen zu lassen, ohne daß er unterbrochen werden
kann. Ein Anwendungsfall wäre zum Beispiel beim Vorliegen einer
"spinlock"-Situation. Dieses Verhalten kann mit argp modifiziert
werden. Folgende Werte sind möglich:
MPCNTLNOPRMPTSIGS
Der Vorrecht-Status des Prozesses beeinflußt die Signalbe-
handlung nicht (so werden zum Beispiel gehaltene/ignorierte
Signale weiterhin gehalten/ignoriert, abgefangene Signale
werden bearbeitet, und ignorierte Signale werden ignoriert).
Wenn ein Prozeß läuft, kann er nicht unterbrochen werden.
Dieses Verhalten bleibt sowohl bei einem beabsichtigten (zum
Beispiel einem Systemaufruf), als auch bei einem unbeabsich-
tigten (zum Beispiel einem Paging-Fehler) Blockieren des
Prozesses erhalten. Wenn ein nicht unterbrechbarer Prozess
die CPU freigibt, konkurriert er anschließend mit den ande-
ren Prozessen um einen Zugriff auf eine CPU. Der Prozeß ist
dann wieder nicht unterbrechbar, bis bis er erneut blok-
kiert.
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
mpcntl(3X) mpcntl(3X)
MPCNTLNOPRMPTNOSIGS
Maskierte, ignorierte oder abgefangene Signale beeinflussen
die Signalbehandlung für den Prozeß. Ein Verhalten, bei dem
der Prozeß nicht unterbrochen werden kann, gilt nur so
lange, bis der Kernel involviert ist (durch einen Systemauf-
ruf oder eine Ausnahme). Ein Interrupt beeinträchtigt das
Vorrecht eines Prozesses nicht direkt und wird auch nicht
als Kernel-Aktion interpretiert. Der erste MPCNTLNOPRMPT-
Aufruf aktiviert diesen Mechanismus. Weitere Aufrufe von
MPCNTLPRMPT und MPCNTLNOPRMPT führen zu bibliotheks-
spezifischen Operationen (so aktualisiert die Bibliothek zum
Beispiel den Wert dieser Adresse im Benutzerbereich, ohne
daß die Betriebssystem-Ebene aufgerufen wird). Diese Opti-
mierung soll das Vorrecht-Verhalten beschleunigen. Bei
Erfolg wird der vorherige Vorrecht-Status des Prozesses
zurückgegeben (> 0 wenn nicht unterbrechbar, 0 wenn unter-
brechbar). Andernfalls wird -1 zurückgegeben.
Für diese Option sind zusätzliche Rechte erforderlich. Sie
wird mit fork() oder exec() nicht vererbt.
MPCNTLGETFLAG
Die mpcntl-Optionen und Bindungsinformation des Zielprozesses
werden zurückgegeben. arg zeigt sowohl auf die Datenstruktur
mpcreqt, die die Ziel-Prozeßnummer angibt, als auch auf die
Datenstruktur cpumaskt, mit der die Bindungsinformation des
Zielprozesses zurückgegeben wird. Bei Erfolg gibt MPCNTLGETFLAG
die Optionen zurück, und das Feld mpccpu der Struktur, auf die
arg zeigt, enthält die Bindungsinformation. Andernfalls wird -1
zurückgegeben.
Eine Interpretation der Optionen ist mit Hilfe der #define-Anwei-
sungen in der Datei sys/proc.h möglich. Relevant sind PBIND,
PBINDXCLU, PAFFINOFF sowie PNOPRMPT (unterteilt in PNOPRMPTSIG
und PNOPRMPTNSIG).
MPCNTLRDTIMER
Der "high resolution-Timer" (ein Zeitgeber mit hoher Genauigkeit)
des Systems wird gelesen, und der abgelesene Wert wird zurückge-
geben. Die Einheit für den Timer ist etwa eine Mikrosekunde. Der
Benutzer muß mit einer "wrap-around condition" rechnen, da der
Wertebereich begrenzt sein kann. Die Werte für den Timer haben
keinen Bezug zur Uhrzeit und haben nur als Angabe der Dauer eines
Intervalls einen Sinn. Bei Implementationen, bei denen die Hard-
ware diese Option nicht unterstützt, wird unter Umständen -1
zurückgegeben. Der Parameter arg wird ignoriert. Diese Option
kann ohne besondere Rechte verwendet werden.
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98
mpcntl(3X) mpcntl(3X)
MPCNTLYIELD
Der aufrufende Prozeß gibt die CPU frei. Der Systemaufruf kehrt
erst zurück, wenn der Prozeß entsprechend neu eingereiht wurde.
Wenn dies der einzige Prozeß oder der Prozeß mit der höchsten
Priorität ist, kehrt der Aufruf sofort zurück.
MPCNTLCPUCNT
Die Anzahl der CPUs im System wird zurückgegeben. arg zeigt auf
die Datenstruktur cpumaskt im Benutzerbereich, die die CPUs
anzeigt, die aktiv und nicht als gesperrt gekennzeichnet sind.
Der Rückgabewert des mpcntl-Aufrufs gibt die Gesamtzahl der kon-
figurierten CPUs an.
Das Spektrum der logischen CPUs reicht lückenlos von 0 bis
(cpucnt-1). Alle CPUs werden beim Laden des Systems konfiguriert
und gestartet. Wenn arg null ist, wird nur die Anzahl zurückgege-
ben.
MPCNTLCPUINFOGET
Es wird eine Datenstruktur cpuinfot zurückgegeben, die weitere
Informationen zu einer bestimmten CPU enthält. Die Datenstruktur
cpuinfot ist folgendermaßen definiert:
typedef struct cpuinfo {
cpuidt cpicpuid; /* logische CPU-Nummer */
int cpicpustatus; /* var. CPU-Statusoptionen */
int cpicpuattr; /* CPU-Attribute */
enum cputype cpicputype; /* Prozessortyp */
int cpicpurev; /* Revision der CPU */
enum fputype cpifptype; /* Gleitpunkt-Coprozessor */
int cpifprev; /* Revision des Gleitpunkt-Coproz. */
enum fputype cpifptype2; /* Gleitpunkt-Coprozessor [2] */
int cpifprev2; /* Revision des Gleitpunkt-Coproz. [2] */
int cpicachsize; /* Größe (in Byte) d. sek. Cache */
int cpicpuclock; /* Geschwind. der CPU in MHz */
int cpibind; /* # Prozesse explizit gebunden */
int cpixbind; /* # Prozesse exklusiv gebunden */
int cpidrvbind; /* # Treiber an CPU gebunden */
int cpiphyscpuid; /* physikal. CPU-Nummer */
int cpiphysintbind; /* physikal. Geräte-Int. an
CPU gebunden */
int cpipad[8]; /* reserviert */
} cpui nfot;
MPCNTLCPUINFOSET
Diese Option wird zum Setzen der cpicpustatus-Optionen (z. B.
Lösen einer Bindung oder Deaktivieren einer CPU) verwendet. Der
Rest der Struktur cpuinfot wird ignoriert. Typische Aktionen
sind die Ausführung von MPCNTLCPUINFOGET, eine Änderung von
Optionen nach Bedarf sowie der Aufruf von MPCNTLCPUINFOSET. Fol-
gende Optionen stehen zur Verfügung:
Seite 5 Reliant UNIX 5.44 Gedruckt 11/98
mpcntl(3X) mpcntl(3X)
CPIFSINSVC
Die CPU ist aktiv. Mit dem Löschen der Option wird die CPU
inaktiv. Nicht alle Hardware-Umgebungen unterstützen diese
Option. Im Standardfall ist diese Option gesetzt. Wenn eine
CPU inaktiv wird, werden Bindungen an diese CPU gelöst.
CPIFSNAVAIL
Die CPU steht für eine Prozeßausführung nicht zur Verfügung.
Es wird allerdings nichts darüber ausgesagt, ob die CPU
aktiv ist. Im Standardfall ist diese Option nicht gesetzt.
Wenn der Status einer CPU so verändert wird, daß sie nicht
mehr zur Verfügung steht, werden die Bindungen an diese CPU
gelöst.
CPIFSBINDOFF
Die CPU steht für normale Bindungsoperationen (MPCNTLBIND)
nicht zur Verfügung, aber existierende Bindungen werden
nicht verändert. Im Standardfall ist diese Option nicht
gesetzt. Vererbte Bindungsattribute werden (bei den System-
aufrufen fork() bzw. exec()) dahingehend beeinflußt, daß sie
ignoriert werden, bis die CPU Bindungen wieder zuläßt.
CPIFSXBINDOFF
Die CPU steht für exklusive Bindungsoperationen
(MPCNTLBINDXCLU) nicht zur Verfügung, aber existierende
Bindungen werden nicht verändert. Im Standardfall ist diese
Option nicht gesetzt. Vererbte Bindungsattribute werden (bei
den Systemaufrufen fork() bzw. exec()) ignoriert, bis die
CPU Bindungen wieder zuläßt.
CPIFSCACHEOFF
Die angegebene CPU-Cache wird ausgeschaltet. Diese Option
wird nicht von allen Hardware-Umgebungen unterstützt. Im
Standardfall ist diese Option nicht gesetzt.
CPIFSIOINTROFF
Die angegebene CPU empfängt keine E/A-Interrupt-Ereignisse.
Diese Option wird nicht von allen Hardware-Umgebungen unter-
stützt. Im Standardfall ist diese Option nicht gesetzt. Für
diese Option sind Systemverwalter-Rechte erforderlich.
Seite 6 Reliant UNIX 5.44 Gedruckt 11/98
mpcntl(3X) mpcntl(3X)
ERGEBNIS
Bei Erfolg gibt mpcntl() Null bzw. den Rückgabewert aus (z. B. bei
MPCNTLRDTIMER). Andernfalls gibt mpcntl() -1 zurück. In diesem Fall
gibt die Fehlernummer einen Hinweis auf die Fehlerursache.
Die folgenden Beschreibungen der Fehlercodes sind funktionsspezifisch.
Eine allgemeingültige Beschreibung finden Sie in introprm2(2) bzw. in
errno(5).
EINVAL Mindestens eines der Argumente für mpcntl() ist ungültig.
Der Grund kann zum Beispiel eine ungültige Prozeßnummer oder
Option sein.
EPERM Die Benutzernummer ist nicht die des Systemverwalters (0),
oder es fehlen die notwendigen Rechte. Dieser Fehler kann
auch auftreten, wenn für einen Zielprozeß, den der Benutzer
nicht verändern darf, neue Optionen angegeben werden.
ENXIO Die Hardware-Umgebung unterstützt die Option nicht, es liegt
eine Bereichsüberschreitung für die CPU-Nummer vor, oder der
Status der CPU läßt die Operation nicht zu.
EFAULT Es wurde ein ungültiger Zeiger auf ein Argument (z. B. arg)
übergeben.
EBUSY Die CPU hat einen Bindungstyp, den die Optionen ausdrücklich
nicht zulassen, bzw. eine exklusive Operation versucht,
einen nicht exklusiven Status herzustellen.
SIEHE AUCH
getpid(2), signal(2), types(5).
Seite 7 Reliant UNIX 5.44 Gedruckt 11/98