Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ mpcntl(3X) — Reliant UNIX 5.44c4

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

getpid(2)

signal(2)

types(5)

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

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026