priocntl(2) priocntl(2)
NAME
priocntl - Zeitscheibenverteilung von Prozessen verwalten
SYNTAX
#include <sys/types.h>
#include <sys/priocntl.h>
#include <sys/procset.h>
#include <sys/rtpriocntl.h>
#include <sys/tspriocntl.h>
#include <sys/fppriocntl.h>
long priocntl(idtypet idtype, idt id, int cmd, ... /* arg */);
BESCHREIBUNG
priocntl() erlaubt die Steuerung der Zeitscheibenverteilung (also der
Zuweisung von Rechenzeit) aktiver Prozesse.
Es gibt verschiedene Klassen von Prozessen mit jeweils unterschiedli-
chen Zielen und Strategien zur Zeitscheibenverteilung, wobei jeder
Prozeß genau einer Klasse angehört. Die drei gegenwärtig unterstützten
Klassen sind die Echtzeit-Klasse, die Time-Sharing-Klasse und die
Fixed-Priority-Klasse. Die Eigenschaften dieser Klassen werden unter
den entsprechend benannten Abschnitten behandelt. Das Klassenattribut
eines Prozesses wird bei den Systemaufrufen fork(2) oder exec(2)
unverändert weitergegeben. Vorausgesetzt, Sie haben ausreichende
Berechtigung, können Sie mit priocntl() die Klasse eines laufenden
Prozesses oder mehrere Prozesse sowie andere Parameter zur Zeitschei-
benverteilung ändern.
In der voreingestellten Konfiguration hat ein ablauffähiger Echtzeit-
Prozeß Vorrang vor jedem anderen Prozeß. Aus diesem Grund kann die
falsche Verwendung von Echtzeit-Prozessen einen ausgesprochen negati-
ven Einfluß auf die Systemleistung haben.
priocntl() erlaubt die Angabe eines einzelnen Prozesses oder mehrere
Prozesse, auf die der Systemaufruf angewendet werden soll. Der System-
aufruf priocntlset(2) bietet dieselben Funktionen wie priocntl(2),
stellt jedoch eine allgemeinere Schnittstelle zur Angabe von Prozeß-
gruppen dar, auf die der Systemaufruf angewendet werden soll.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
priocntl(2) priocntl(2)
Bei priocntl() werden die Argumente idtype und id zur Angabe der Pro-
zesse verwendet. Die Interpretation von id hängt vom Wert idtype ab.
Die möglichen Werte für idtype und entsprechende Interpretationsmög-
lichkeiten von id sind:
PPID id ist eine Prozeßnummer, welche einen einzelnen Prozeß angibt,
auf den der priocntl()-Systemaufruf angewendet werden soll.
PPPID id ist die Prozeßnummer eines Vaterprozesses. Der priocntl()-
Systemaufruf wird auf alle Prozesse angewendet, die über eine
entsprechende Vaterprozeßnummer verfügen.
PPGID id ist eine Prozeßgruppennummer. Der priocntl()-Systemaufruf
wird auf alle Prozesse der angegebenen Prozeßgruppe angewen-
det.
PSID id ist eine Sitzungsnummer. Der priocntl()-Systemaufruf wird
auf alle Prozesse der angegebenen Sitzung angewendet.
PCID id ist eine Klassennummer (zurückgegeben von priocntl
PCGETCID, wie weiter unten erläutert). Der priocntl()-System-
aufruf wird auf alle Prozesse der entsprechenden Klasse ange-
wendet.
PUID id ist eine Benutzernummer. Der priocntl()-Systemaufruf wird
auf alle Prozesse mit dieser effektiven Benutzernummer ange-
wendet.
PGID id ist eine Gruppennummer. Der priocntl()-Systemaufruf wird
auf alle Prozesse mit dieser effektiven Gruppennummer angewen-
det.
PALL Der priocntl()-Systemaufruf wird auf alle existierenden Pro-
zesse angewendet. Der Wert von id wird ignoriert. Die weiter
unten beschriebenen Zugriffsbeschränkungen bleiben dabei gül-
tig.
Der Wert PMYID für id kann in Verbindung mit idtype verwendet werden,
um die Prozeßnummer, die Vaterprozeßnummer, die Prozeßgruppennummer,
die Sitzungsnummer, die Klassennummer, die Benutzernummer oder die
Gruppennummer des aufrufenden Prozesses anzugeben.
Damit Sie für einen bestimmten Prozeß die Parameter für die Zeitschei-
benverteilung mit priocntl() ändern können (mit dem Kommando
PCSETPARMS, wie weiter unten beschrieben), muß Ihre reale oder effek-
tive Benutzernummer gleich der realen oder effektiven Benutzernummer
dieses Prozesses sein, es sei denn, Sie haben als effektive Benutzer-
nummer die des Systemverwalters. Dies sind die Mindestvoraussetzungen,
die für alle Klassen gelten. Für einzelne Klassen können zusätzliche
Beschränkungen gelten, wenn Prozesse auf diese Klasse eingestellt wer-
den, und/oder wenn klassenabhängige Prozeßparameter gesetzt werden.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
priocntl(2) priocntl(2)
Für die Zeitscheibenverteilung bei der Ausführung gewisser Systempro-
zesse gibt es die besondere Klasse sys (der swapper-Prozeß zur Ein-
und Auslagerung auf Platte gehört zum Beispiel dieser Klasse an). Es
ist nicht möglich, die Klasse eines Prozesses auf sys zu setzen.
Außerdem werden alle Prozesse der sys-Klasse, die sich in einer ange-
gebenen Gruppe von Prozessen befinden, von priocntl() ignoriert. Wird
beispielsweise PUID für idtype angegeben und enthält id den Wert
Null, so werden alle Prozesse mit der Benutzernummer Null angegeben,
außer Prozesse der Klasse sys und (wenn die Parameter mit PCSETPARMS
verändert werden) der Prozeß init.
Der Prozeß init ist dabei ein Sonderfall. Will ein priocntl()-Aufruf
die Klasse oder andere Parameter für die Zeitscheibenverteilung des
Prozesses init ändern (Prozeßnummer 1), so muß es sich dabei um den
einzigen Prozeß handeln, der durch idtype und id angegeben wird. Der
init-Prozeß kann jeder Klasse zugewiesen werden, die im System konfi-
guriert ist, meistens ist jedoch die Time-Sharing-Klasse angemessen.
Der Datentyp und der Wert von arg hängen vom Typ des Kommandos cmd ab.
Die folgende Struktur wird von den Kommandos PCGETCID und
PCGETCLINFO verwendet:
typedef struct {
idt pccid; /* Klassennummer */
char pcclname[PCCLNMSZ]; /* Klassenname */
long pcclinfo[PCCLINFOSZ]; /* Klasseninformationen */
} pcinfot;
pccid ist eine Klassennummer, die von priocntl PCGETCID zurückgege-
ben wird. pcclname ist ein Puffer der Länge PCCLNMSZ (definiert in
sys/priocntl.h), in dem sich der Klassenname befindet (RT für die
Echtzeit-Klasse, TS für die Time-Sharing-Klasse oder FP für die
Fixed-Priority-Klasse).
pcclinfo ist ein Puffer der Länge PCCLINFOSZ (definiert in
sys/priocntl.h), in dem Informationen über die Attribute einer
bestimmten Klasse abgelegt werden. Das Format dieser Daten ist klas-
senabhängig und wird unter dem entsprechenden Abschnitt weiter unten
beschrieben.
Die folgende Struktur wird von den Kommandos PCSETPARMS und
PCGETPARMS verwendet:
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
priocntl(2) priocntl(2)
typedef struct {
idt pccid; /* Prozeßklasse */
long pcclparms[PCCLPARMSZ]; /* Klassenabhängige Parameter */
} pcparmst;
pccid ist eine Klassennummer (zurückgegeben von priocntl PCGETCID).
Die spezielle Klassennummer-ID PCCLNULL kann auch pccid zugewiesen
werden, wenn das Kommando PCGETPARMS so verwendet wird, wie es weiter
unten beschrieben wird.
Der Puffer pcclparms dient zur Aufnahme klassenabhängiger Verwal-
tungsparameter. Das Format dieses Parameters für die jeweilige Klasse
wird unter dem entsprechenden Abschnitt weiter unten erklärt.
PCCLPARMSZ ist die Länge des Puffers pcclparms und wird in
sys/priocntl.h definiert.
Kommandos
PCGETCID
Ruft die Klassennummer und Klassenattribute für eine bestimmte
Klasse mit gegebenem Klassennamen ab. Die Argumente idtype und id
werden ignoriert. Wenn arg ungleich NULL ist, wird angenommen,
daß auf eine Struktur des Typs pcinfot verwiesen wird. Der Puf-
fer pcclname enthält den Namen der Klasse, deren Attribute gele-
sen werden.
Bei erfolgreicher Ausführung wird die Klassennummer in pccid
zurückgegeben, die Klassenattribute werden im Puffer pcclinfo
zurückgeliefert, und der priocntl()-Aufruf liefert die Gesamtan-
zahl der im System konfigurierten Klassen zurück (einschließlich
der Klasse sys). Wenn die Klasse aus pcclname ungültig ist oder
momentan nicht konfiguriert ist, liefert der priocntl()-Aufruf -1
zurück und setzt errno auf EINVAL. Das Format der zurückgeliefer-
ten Attributdaten für eine gegebene Klasse ist in
sys/rtpriocntl.h, sys/tspriocntl.h oder sys/fppriocntl.h defi-
niert und wird unter dem entsprechenden Abschnitt weiter unten
beschrieben.
Wenn arg ein Null-Zeiger ist, werden keine Attributdaten zurück-
gegeben; der priocntl()-Aufruf liefert dann lediglich die Anzahl
der konfigurierten Klassen zurück.
PCGETCLINFO
Ruft den Klassennamen und die Klassenattribute für eine gegebene
Klassennummer ab. Die Argumente idtype und id werden ignoriert.
Wenn arg ungleich Null ist, wird angenommen, daß auf eine Struk-
tur des Typs pcinfot verwiesen wird. pccid ist die Klassennum-
mer derjenigen Klasse, deren Attribute gelesen werden sollen.
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98
priocntl(2) priocntl(2)
Bei erfolgreicher Ausführung wird der Klassenname im Puffer
pcclname und die Klassenattribute im Puffer pcclinfo zurückge-
geben; der priocntl()-Aufruf liefert die Gesamtanzahl der im
System konfigurierten Klassen zurück (einschließlich der Klasse
sys). Das Format der zurückgelieferten Attributdaten wird in den
Include-Dateien sys/rtpriocntl.h, sys/tspriocntl.h oder
sys/fppriocntl.h definiert und ist unter den entsprechenden
Abschnitten weiter unten beschrieben.
Wenn arg ein Null-Zeiger ist, werden keine Attributdaten zurück-
gegeben; der priocntl()-Aufruf liefert dann lediglich die Anzahl
der konfigurierten Klassen zurück.
PCSETPARMS
Setzt die Klasse und die klassenabhängigen Verwaltungsparameter
des angegebenen Prozesses bzw. der angegebenen Prozesse. arg
zeigt auf eine Struktur vom Typ pcparmst. pccid gibt die Klasse
an, deren Parameter geändert werden sollen; der Puffer pcclparms
enthält die klassenabhängigen Parameter, die gesetzt werden sol-
len. Das Format der klassenabhängigen Parameter wird in den
Include-Dateien sys/rtpriocntl.h, sys/tspriocntl.h oder
sys/fppriocntl.h definiert und wird unter den entsprechenden
Abschnitten weiter unten erklärt.
Wenn Parameter für eine Gruppe von Prozessen angegeben werden,
behandelt priocntl() die Prozesse in einer implementierungsabhän-
gigen Reihenfolge. Wenn priocntl() einen Fehler bei einem oder
mehreren der Zielprozesse erkennt, wird die Operation abhängig
von der Art des Fehler weitergeführt oder abgebrochen. Ist der
Fehler auf Berechtigungen (EPERM) zurückzuführen, so wird die
Operation mit den weiteren Prozessen der Prozeßgruppe ausgeführt,
wobei die Parameter für alle Zielprozesse entsprechend geändert
werden, für die der aufrufende Prozeß entsprechende Berechtigung
besitzt. priocntl() liefert dann -1 zurück und setzt errno auf
EPERM; dies zeigt an, daß die Operation für einen oder mehrere
der Zielprozesse fehlgeschlagen ist. Wenn priocntl() einen Fehler
erkennt, der nicht auf Berechtigungen basiert, wird dieser Fehler
sofort zurückgeliefert und die Operation wird abgebrochen.
PCGETPARMS
Ruft die Klasse und/oder die klassenabhängigen Parameter für die
Zeitscheibenverteilung eines Prozesses ab. arg zeigt auf eine
Struktur vom Typ pcparmst.
Wenn pccid eine konfigurierte Klasse angibt und von den Werten
idtype und id der procset-Struktur ein Prozeß dieser Klasse ange-
geben wird, dann werden die Parameter für die Zeitscheibenvertei-
lung des Prozesses in dem Puffer pcclparms zurückgegeben. Wenn
der angegebene Prozeß nicht existiert oder nicht zu der angegebe-
nen Klasse gehört, liefert der priocntl()-Aufruf -1 zurück und
setzt errno auf ESRCH.
Seite 5 Reliant UNIX 5.44 Gedruckt 11/98
priocntl(2) priocntl(2)
Gibt pccid eine konfigurierte Klasse und eine Prozeßmenge an, so
werden die Parameter für die Zeitscheibenverteilung eines Prozes-
ses, der zu der angegebenen Gruppe von Prozessen und Klasse
gehört, in pcclparms zurückgegeben, und priocntl() liefert die
Prozeßnummer des ausgewählten Prozesses zurück. Die Kriterien bei
der Auswahl eines Prozesses für diesen Fall ist klassenabhängig.
Wenn keiner der angegebenen Prozesse existiert oder keiner der
Prozesse zu der angegebenen Klasse gehört, liefert priocntl() -1
zurück und setzt errno auf ESRCH.
Wenn pccid gleich PCCLNULL ist und ein einziger Prozeß angege-
ben wird, so wird die Klasse dieses Prozesses in pccid und wer-
den seine Parameter in pcclparms zurückgegeben.
PCADMIN
Dieses Kommando bietet die Funktionalität für die Implementierung
des Kommandos dispadmin(1M). Es ist nicht zum allgemeinen
Gebrauch durch andere Anwendungen gedacht.
ECHTZEIT-KLASSE
In der Klasse Echtzeit erfolgt die Verteilung der Zeitscheiben für die
Zentraleinheit (CPU) nach festen Prioritäten und unter der Maßgabe,
daß ein Prozeß einen anderen von der CPU "verdrängen" kann (preemptive
scheduling). Dies ist für solche Prozesse sinnvoll, die kurze und vor-
hersehbare Antwortzeiten sowie die vollständige Steuerung der Priori-
täten durch den Benutzer bzw. die Anwendung benötigen. Falls die
Klasse Echtzeit auf dem System konfiguriert ist, sollte sie vollstän-
dige Kontrolle über den höchsten Bereich der Prioritäten für die Zeit-
scheibenverteilung haben. Damit wird gewährleistet, daß ein ablauffä-
higer Prozeß der Klasse Echtzeit vor jedem anderen Prozeß jeder ande-
ren Klasse Rechenzeit erhält.
Einem Prozeß der Klasse Echtzeit kann eine Echtzeit-Priorität (real-
time priority, rtpri) zugeordnet werden. Dieser Wert liegt zwischen 0
und einem Maximalwert x, wobei der Wert von x konfiguriert werden
kann. Er kann für eine spezielle Konfiguration mit dem priocntl-
Kommando PCGETCID oder PCGETCLINFO angezeigt werden.
Die Verteilung der Zeitscheiben für Prozesse der Klasse Echtzeit
erfolgt nach festen Prioritäten. Die Priorität eines Echtzeit-Prozes-
ses wird niemals verändert, es sei denn, der Benutzer oder eine Anwen-
dung wollen den Wert rtpri des Prozesses ausdrücklich ändern.
Für einen Prozeß der Klasse Echtzeit ist der Wert rtpri praktisch
gleich der internen Priorität für die Zuteilung von Rechenzeit an die-
sen Prozeß. Dieser Wert bestimmt die Priorität eines Echtzeit-Prozes-
ses im Verhältnis zu anderen Prozessen dieser Klasse. Ein höherer Wert
von rtpri steht für eine höhere Priorität. Da die Klasse Echtzeit den
höchsten Bereich der Prioritäten für die Zuteilung von Rechenzeit
steuert, ist gewährleistet, daß ein ablauffähiger Prozeß mit dem höch-
sten Wert von rtpri vor jedem anderen Prozeß im System Rechenzeit
erhält.
Seite 6 Reliant UNIX 5.44 Gedruckt 11/98
priocntl(2) priocntl(2)
Zusätzlich zur Steuerung der Prioritäten können Sie mit priocntl() die
Länge der Zeitscheiben beeinflussen, die einem Prozeß der Klasse Echt-
zeit zugeteilt werden. Die Länge der Zeitscheibe gibt an, wie lange
ein Prozeß höchstens Rechenzeit erhält, vorausgesetzt, er wartet nicht
auf ein externes Ereignis (sleep). Ein Prozeß kann jedoch vor Ablauf
seiner Zeitscheibe unterbrochen werden, wenn ein anderer Prozeß mit
höherer Priorität ablauffähig wird.
Der Prozeßverwalter des Systems hält die ablauffähigen Echtzeit-Pro-
zesse in einer Gruppe von Verwaltungsschlangen. Es gibt eine eigene
Schlange für jede konfigurierte Echtzeit-Priorität, und alle Echt-
zeit-Prozesse mit einem gegebenen rtpri-Wert werden zusammen in der
entsprechenden Schlange gehalten. Die Prozesse einer gegebenen
Schlange werden in einer FIFO-Reihe angeordnet (dies bedeutet, daß der
Prozeß am Anfang der Schlange am längsten auf Bedienung gewartet hat
und von der CPU als nächstes bedient wird).
Echtzeit-Prozesse, die nach sleep wieder aktiv werden, Prozesse aus
einer anderen Klasse, die in die Echtzeit-Klasse gelangen, Prozesse,
die die volle Länge ihrer Zeitscheibe verbraucht haben, und ablauffä-
hige Prozesse, deren Priorität durch priocntl() neu gesetzt wird, wer-
den an das Ende der entsprechenden Prioritätsschlange geschrieben.
Ein Prozeß, der durch einen Prozeß mit höherer Priorität vorzeitig
angehalten wird, bleibt am Anfang der Schlange (unabhängig davon, wie-
viel Zeit in seiner Zeitscheibe noch verbleibt) und läuft vor jedem
anderen Prozeß gleicher Priorität ab. Wird ein fork(2)-Systemaufruf
von einem Echtzeit-Prozeß ausgeführt, läuft der Vaterprozeß weiter,
während der Sohnprozeß (der den rtpri-Wert des Vaterprozesses über-
nimmt) an das Ende der Schlange gesetzt wird.
Die folgende Struktur (definiert in sys/rtpriocntl.h) definiert das
Format der Attributdaten für die Echtzeit-Klasse:
typedef struct {
short rtmaxpri; /* Maximale Echtzeit-Priorität */
} rtinfot;
Die priocntl-Kommandos PCGETCID und PCGETCLINFO liefern die Attri-
bute der Echtzeit-Klasse im Puffer pcclinfo mit diesem Format zurück.
rtmaxpri gibt den konfigurierten Maximalwert rtpri für die Echt-
zeit-Klasse zurück (wenn rtmaxpri gleich x ist, reichen die gültigen
Echtzeit-Prioritäten von 0 bis x).
Seite 7 Reliant UNIX 5.44 Gedruckt 11/98
priocntl(2) priocntl(2)
Die folgende Struktur (definiert in sys/rtpriocntl.h) definiert das
Format zur Angabe von Parametern der Zeitscheibenverteilung für Pro-
zesse der Echtzeit-Klasse:
typedef struct {
short rtpri; /* Echtzeit-Priorität */
ulong rttqsecs; /* Sekunden in der Zeitscheibe */
long rttqnsecs; /* Nanosekunden in der Zeitscheibe */
} rtparmst;
Bei Verwendung der priocntl-Kommandos PCSETPARMS oder PCGETPARMS
werden die Daten im Puffer pcclparms in diesem Format zurückgegeben,
falls pccid die Echtzeit-Klasse angibt.
Die oben erwähnten Kommandos können verwendet werden, um die Echt-
zeit-Priorität auf den entsprechenden Wert zu setzen oder den aktuel-
len rtpri-Wert zu lesen. Das Einstellen des rtpri-Wertes für einen
momentan ablaufenden oder ablauffähigen (nicht im sleep-Zustand
befindlichen) Prozeß verursacht, daß der Prozeß an das Ende der
Schlange für die entsprechende Priorität gesetzt wird. Der Prozeß wird
an das Ende der entsprechenden Schlange gesetzt, unabhängig davon, ob
die gesetzte Priorität vom vorherigen rtpri-Wert des Prozesses
abweicht. Zu beachten ist, daß ein ablaufender Prozeß die CPU freige-
ben und sich an das Ende der Schlange gleicher Priorität setzen kann,
indem sein vorheriger rtpri-Wert aktualisiert wird. Um die Länge der
Zeitscheibe eines Prozesses zu ändern, ohne daß die Priorität oder die
Position des Prozesses in der Schlange geändert wird, sollte das Feld
rtpri auf den Wert RTNOCHANGE (definiert in sys/rtpriocntl.h)
gesetzt werden. Wird beim Ändern der Klasse eines Prozesses in die
Echtzeit-Klasse RTNOCHANGE angegeben, wird die Echtzeit-Priorität auf
Null gesetzt.
Beim priocntl-Kommando PCGETPARMS werden die Parameter für die Zeit-
scheibenverteilung des Echtzeit-Prozesses mit dem höchsten rtpri-Wert
zurückgegeben, wenn pccid die Echtzeit-Klasse angibt und mehr als ein
Echtzeit-Prozeß angegeben wird; die Prozeßnummer des Prozesses wird
von priocntl() zurückgegeben. Gibt es mehr als einen Prozeß mit der
höchsten Priorität, so ist die zurückgegebene Prozeßnummer implemen-
tierungsabhängig.
Die Felder rttqsecs und rttqnsecs werden verwendet, um die Länge der
Zeitscheibe für einen Prozeß oder eine Prozeßgruppe zu setzen oder
abzurufen. rttqsecs ist die Anzahl der Sekunden und rttqnsecs die
Anzahl der zuzüglichen Nanosekunden in der Zeitscheibe. Wird rttqsecs
zum Beispiel auf den Wert 2 und rttqnsecs auf den Wert 500.000.000
(dezimal) gesetzt, so wäre die Zeitscheibe zweieinhalb Sekunden lang.
Der Wert 1.000.000.000 oder höher für rttqnsecs erzeugt einen Fehler;
dabei wird errno auf EINVAL gesetzt. Obwohl die Auflösung des Feldes
tqnsecs sehr hoch ist, wird die angegebene Zeitscheibe vom System auf
das nächste ganzzahlige Vielfache der Auflösung der Systemuhr gerun-
det. Beispielsweise beträgt die höchste, momentan verfügbare Auflösung
der Anlage 3B2 10 Millisekunden (1 "Zeittakt"). Die Einstellung von
Seite 8 Reliant UNIX 5.44 Gedruckt 11/98
priocntl(2) priocntl(2)
rttqsecs gleich 0 und rttqnsecs gleich 34.000.000 würde eine Zeit-
scheibe von 34 Millisekunden angeben, die auf vier Zeittakte (40 Mil-
lisekunden) aufgerundet wird. Der Maximalwert für die Zeitscheibe ist
implementierungsabhängig und entspricht LONGMAX Zeittakten (definiert
in limits.h). Die Angabe einer Zeitscheibe, die größer als dieser
Maximalwert ist, hat einen Fehler zur Folge; dabei wird errno auf
ERANGE gesetzt (obwohl auch unendliche Zeitscheiben durch einen beson-
deren Wert angefordert werden können; siehe Beschreibung weiter
unten). Bei einer Zeitscheibe von Null (wenn sowohl rttqsecs als auch
rttqnsecs auf 0 gesetzt werden), wird ein Fehler zurückgegeben und
errno enthält EINVAL.
Das Feld rttqnsecs kann auf einen der folgenden Sonderwerte gesetzt
werden (definiert in sys/rtpriocntl.h), bei denen der Wert von
rttqsecs ignoriert wird:
RTTQINF
Stellt eine unendliches Zeitscheibe ein.
RTTQDEF
Setzt die Zeitscheibe auf den voreingestellten Wert für diese
Priorität [siehe rtdptbl(4)].
RTNOCHANGE
Die Zeitscheibe wird nicht gesetzt. Dieser Wert ist nützlich,
wenn die Echtzeit-Priorität eines Prozesses geändert werden, die
Zeitscheibe aber unverändert bleiben soll. Die Angabe dieses Wer-
tes beim Ändern eines Prozesses in einen Echtzeit-Prozeß ent-
spricht der Angabe von RTTQDEF.
Um einem Prozeß einer anderen Klasse die Klasse Echtzeit zu geben, muß
der aufrufende Prozeß über Systemverwalterrechte verfügen. Um die
Priorität oder die Länge der Zeitscheibe eines Echtzeit-Prozesses zu
ändern, muß der Prozeß, der priocntl() aufruft, über Systemverwalter-
rechte verfügen oder muß selbst ein Echtzeit-Prozeß sein, dessen reale
oder effektive Benutzernummer der realen oder effektiven Benutzernum-
mer des Zielprozesses entspricht.
Die Echtzeit-Priorität und die Länge der Zeitscheibe werden bei den
Systemaufrufen fork(2) und exec(2) unverändert weitergegeben.
TIME-SHARING-KLASSE
Die Strategie für die Verteilung der Zeitscheiben in der Klasse Time-
Sharing ist auf eine gleichmäßige und effektive Zuteilung der CPU-
Rechenzeit für Prozesse mit unterschiedlicher CPU-Ausnutzung ausge-
legt. Die Ziele dieser Strategie sind gute Antwortzeiten bei interak-
tiven Prozessen und guter Durchsatz bei rechenintensiven Anwendungen.
Die Verteilung der Zeitscheiben soll zu einem gewissen Maß vom Benut-
zer bzw. der Anwendung beeinflußbar sein.
Seite 9 Reliant UNIX 5.44 Gedruckt 11/98
priocntl(2) priocntl(2)
Die Time-Sharing-Klasse verfügt über einen Bereich von Time-Sharing-
Benutzerprioritäten (siehe tsupri weiter unten), welche den Prozessen
dieser Klasse zugewiesen werden können. Der Wert 0 für tsupri ist als
Basispriorität für die Time-Sharing-Klasse voreingestellt. Benutzer-
prioritäten reichen von -x bis +x, wobei der Wert x konfigurierbar ist
und für eine bestimmte Installation über das priocntl-Kommando
PCGETCID oder PCGETCLINFO abgerufen werden kann.
Mit der vom Benutzer einstellbaren Time-Sharing-Priorität kann die
Zuteilung von Rechenzeit an Prozesse der Klasse Time-Sharing zu einem
gewissen Maß beeinflußt werden. Wird der Wert tsupri für einen Prozeß
der Klasse Time-Sharing erhöht oder vermindert, so wird auch die Prio-
rität dieses Prozesses bei der Zeitscheibenverteilung erhöht oder ver-
mindert. Es ist jedoch nicht gewährleistet, daß ein Prozeß mit einem
höheren tsupri-Wert vor einem Prozeß mit einem niedrigeren tsupri-
Wert ausgeführt wird. Dies liegt daran, daß der tsupri-Wert nur ein
Faktor zur Bestimmung der Priorität eines Time-Sharing-Prozesses ist.
Das System kann die interne Priorität eines Time-Sharing-Prozesses
aufgrund von anderen Faktoren, wie zum Beispiel die bisherige CPU-
Ausnutzung, dynamisch ändern.
Neben den systemweit geltenden Grenzwerten für die Benutzerpriorität
(die von Kommandos PCGETCID und PCGETCLINFO zurückgegeben werden),
gibt es für jeden Prozeß einen Grenzwert für die Benutzerpriorität,
der den maximalen tsupri-Wert angibt, der für diesen Prozeß gesetzt
werden kann (siehe tsuprilim weiter unten). Der Standardwert für
tsuprilim ist Null.
Die folgende Struktur (definiert in sys/tspriocntl.h) definiert das
Format für die Attribute der Time-Sharing-Klasse:
typedef struct {
short tsmaxupri; /* Grenze für den Bereich der Benutzerpriorität */
} tsinfot;
Die priocntl-Kommandos PCGETCID und PCGETCLINFO liefern die Attri-
bute für Prozesse der Time-Sharing-Klasse im Puffer pcclinfo in die-
sem Format zurück.
tsmaxupri gibt den konfigurierten Maximalwert für die Benutzerpriori-
tät der Time-Sharing-Klasse zurück. Wenn tsmaxupri gleich x ist, so
liegt der gültige Bereich sowohl für die Benutzerprioritäten als auch
für die Grenzwerte der Benutzerpriorität zwischen -x und +x.
Seite 10 Reliant UNIX 5.44 Gedruckt 11/98
priocntl(2) priocntl(2)
Die folgende Struktur (definiert in sys/tspriocntl.h) definiert das
Format zur Angabe der klassenabhängigen Parameter für einen Prozeß:
typedef struct {
short tsuprilim; /* Grenze für Time-Sharing-Benutzerpriorität */
short tsupri; /* Time-Sharing-Benutzerpriorität */
short tsflags; /* (siehe unten) */
} tsparmst;
/* tsparmst.tsflags-Werte */
#define TSFIXEDPRI 1
Bei Verwendung des priocntl-Kommandos PCSETPARMS oder PCGETPARMS
werden die Daten im Puffer pcclparms in diesem Format zurückgegeben,
wenn pccid die Time-Sharing-Klasse angibt.
Das priocntl-Kommando PCGETPARMS liefert die Parameter zur Zeitschei-
benverteilung für den Time-Sharing-Prozeß mit dem höchsten tsupri-
Wert sowie die Prozeßnummer des Prozesses zurück, sofern pccid die
Time-Sharing-Klasse angibt und mehr als ein Time-Sharing-Prozeß ange-
geben ist. Gibt es mehrere Prozesse mit gleichen Benutzerprioritäten,
so ist der Rückgabewert implementierungsabhängig.
Jeder Time-Sharing-Prozeß kann seinen eigenen tsuprilim-Wert (oder
den eines anderen Prozesses mit derselben Benutzernummer) verkleinern.
Nur ein Time-Sharing-Prozeß mit Systemverwalterrechten kann tsuprilim
erhöhen. Wird die Klasse eines Prozesses von einer anderen Klasse auf
die Time-Sharing-Klasse geändert, so sind Systemverwalterrechte erfor-
derlich, um tsuprilim auf einen Wert größer als Null zu setzen. Ver-
sucht ein Prozeß, der nicht über Systemverwalterrechte verfügt,
tsuprilim zu erhöhen oder tsuprilim größer Null zu setzen, wird -1
zurückgegeben und errno auf EPERM gesetzt.
Jeder Time-Sharing-Prozeß kann seinen eigenen tsupri-Wert (oder den
eines anderen Prozesses mit derselben Benutzernummer) auf einen Wert
kleiner oder gleich dem Wert tsuprilim des Prozesses setzen. Wird
versucht, für tsupri einen Wert über tsuprilim anzugeben (und/oder
für tsuprilim einen Wert unter tsupri anzugeben), so wird tsupri
gleich tsuprilim gesetzt.
Die Struktur tsparmst hat ferner einen tsflags-Wert, der von einem
Prozeß mit Systemverwalterrechten gesetzt werden kann. Ist für das
Flag das Flag-Bit TSFIXEDPRI angegeben, setzt die Time-Sharing-Klasse
die Priorität des Prozesses nicht herab, wenn die gesamte Zeitscheibe
aufgebraucht ist. Diese Funktion ist vor allem für Prozesse wie
Systemdämonen und Datanbankserver sinnvoll. Die Funktion wurde durch
die Klasse Fixed-Priority ersetzt. Sie wird nur noch aus Kompatibili-
tätsgründen beibehalten und in einem späteren Release entfernt.
Seite 11 Reliant UNIX 5.44 Gedruckt 11/98
priocntl(2) priocntl(2)
Jedes der Felder tsuprilim, tsupri oder tsflags kann auf den Son-
derwert TSNOCHANGE gesetzt werden (definiert in sys/tspriocntl.h), um
einen der Werte anzugeben, ohne daß sich dieser auch auf andere Werte
auswirkt. Die Angabe von TSNOCHANGE für die Benutzerpriorität tsupri
beim Einstellen des Grenzwertes tsuprilim auf einen Wert unter der
aktuellen Benutzerpriorität verursacht, daß die Benutzerpriorität
tsupri auf den eingestellten Grenzwert für die Benutzerpriorität
tsuprilim gesetzt wird. Die Angabe von TSNOCHANGE für einen Parame-
ter beim Ändern der Klasse auf die Time-Sharing-Klasse (von einer
anderen Klasse) verursacht, daß der Parameter auf einen Standardwert
gesetzt wird. Der Standardwert für tsuprilim ist 0, und tsupri wird
standardmäßig auf den eingestellten tsuprilim-Wert gesetzt.
Die Time-Sharing-Benutzerpriorität und der Grenzwert für die Benutzer-
priorität werden bei den Systemaufrufen fork(2) und exec(2) unverän-
dert weitergegeben.
FIXED-PRIORITY-KLASSE
In der Klasse Fixed-Priority erfolgt die Verteilung der Zeitscheiben
für die Zentraleinheit (CPU) ganz ähnlich wie bei der Echtzeit-Klasse
nach festen Prioritäten und unter der Maßgabe, daß ein Prozeß einen
anderen von der CPU "verdrängen" kann (preemptive scheduling). Dies
ist für solche Prozesse sinnvoll, die kurze und vorhersehbare Antwort-
zeiten sowie die vollständige Steuerung der Prioritäten durch den
Benutzer bzw. die Anwendung benötigen. Allerdings hat die Fixed-
Priority-Klasse Prioritäten, die nur geringfügig über die der Time-
Sharing-Klasse hinausgehen. Hierdurch kann ein Prozeß die CPU (Zen-
traleinheit) in hohem Maße ausnutzen, ohne die Ausführung des System-
kerns zu verhindern.
Einem Prozeß der Klasse Fixed-Priority kann eine Fixed-Priority-
Priorität (fpumdpri) zugeordnet werden. Dieser Wert liegt zwischen 0
und einem Maximalwert x, wobei der Wert von x konfiguriert werden
kann. Er kann für eine spezielle Konfiguration mit dem priocntl-
Kommando PCGETCID oder PCGETCLINFO abgerufen werden.
Die Verteilung der Zeitscheiben für Prozesse der Klasse Fixed-Priority
erfolgt nach festen Prioritäten. Die Priorität eines Fixed-Priority-
Prozesses wird niemals verändert, es sei denn, die Ausführung des Pro-
zesses wird im Systemkern unterbrochen (sleep), oder der Wert
fpumdpri wird vom Benutzer oder von der Anwendung explizit geändert.
Für Prozesse der Klasse Fixed-Priority ist der Wert fpumdpri äquiva-
lent mit der Priorität der Zeitscheibenverteilung des Prozesses. Die-
ser Wert bestimmt die Priorität eines Fixed-Priority-Prozesses im Ver-
hältnis zu anderen Prozessen dieser Klasse. Höhere fpumdpri-Werte
stellen höhere Prioritäten dar.
Seite 12 Reliant UNIX 5.44 Gedruckt 11/98
priocntl(2) priocntl(2)
Zusätzlich zur Steuerung der Prioritäten können Sie mit priocntl() die
Länge der Zeitscheiben beeinflussen, die einem Prozeß der Klasse
Fixed-Priority zugeteilt werden. Der Wert für die Zeitscheibe gibt an,
wie lange ein Prozeß höchstens Rechenzeit erhält, vorausgesetzt, er
wird nicht beendet, oder er wartet nicht auf ein externes Ereignis
(sleep). Ein Prozeß kann jedoch vor Ablauf seiner Zeitscheibe unter-
brochen werden, wenn ein anderer Prozeß mit höherer Priorität ablauf-
fähig wird.
Der Prozeßverwalter des Systems hält die ablauffähigen Fixed-
Priority-Prozesse in einer Gruppe von Verwaltungsschlangen. Es gibt
eine eigene Schlange für jede konfigurierte Fixed-Priority-Priorität,
und alle Fixed-Priority-Prozesse mit einem gegebenen fpumdpri-Wert
werden zusammen in der entsprechenden Schlange gehalten. Die Prozesse
einer gegebenen Schlange werden in einer FIFO-Reihe angeordnet (dies
bedeutet, daß der Prozeß am Anfang der Schlange am längsten auf Bedie-
nung gewartet hat und von der CPU als nächstes bedient wird).
Fixed-Priority-Prozesse, die nach sleep wieder aktiv werden, Prozesse
aus einer anderen Klasse, die in die Fixed-Priority-Klasse wechseln,
Prozesse, die die volle Länge ihrer Zeitscheibe verbraucht haben, und
ablauffähige Prozesse, deren Priorität durch priocntl() neu gesetzt
wird, werden an das Ende der entsprechenden Prioritätsschlange
gestellt.
Wird ein Prozeß von einem Prozeß mit höherer Priorität unterbrochen,
wird der Prozeß entsprechend der noch verbleibenden Zeit in der Zeit-
scheibe in die Schlange eingereiht. Nach einem fork(2)-Systemaufruf
durch einen Fixed-Priority-Prozeß überläßt der Vaterprozeß die CPU dem
Sohnprozeß und wird an das Ende der Warteschlange für die Zeitschei-
benverteilung gestellt.
Die folgende Struktur (definiert in sys/fppriocntl.h) definiert das
Format der Attributdaten für die Fixed-Priority-Klasse:
typedef struct {
short fpmaxumdpri; /* konfigurierter Maximalwert für den
Bereich der Benutzerpriorität */
} fpinfot;
Die priocntl-Kommandos PCGETCID und PCGETCLINFO geben die Attribute
der Fixed-Priority-Klasse im Puffer pcclinfo mit diesem Format
zurück.
fpmaxumdpri gibt den konfigurierten Maximalwert fpumdpri für die
Fixed-Priority-Klasse zurück (wenn rtmaxumdpri gleich x ist, reichen
die gültigen Fixed-Priority-Prioritäten von 0 bis x).
Die folgende Struktur (definiert in sys/fppriocntl.h) definiert das
Format zur Angabe von Parametern der Zeitscheibenverteilung für einen
Prozeß der Fixed-Priority-Klasse:
Seite 13 Reliant UNIX 5.44 Gedruckt 11/98
priocntl(2) priocntl(2)
typedef struct {
short fppri; /* Echtzeit-Priorität */
ulong fptqsecs; /* Sekunden in der Zeitscheibe */
long fptqnsecs; /* Nanosekunden in der Zeitscheibe */
} fpparmst;
Bei Verwendung der priocntl-Kommandos PCSETPARMS oder PCGETPARMS
werden die Daten im Puffer pcclparms in diesem Format zurückgegeben,
falls pccid die Fixed-Priority-Klasse angibt.
Die oben erwähnten Kommandos können verwendet werden, um die Fixed-
Priority-Priorität auf den entsprechenden Wert zu setzen oder den
aktuellen fppri-Wert zu lesen. Das Einstellen des fppri-Wertes für
einen momentan ablaufenden oder ablauffähigen (nicht im sleep-Zustand
befindlichen) Prozeß verursacht, daß der Prozeß an das Ende der War-
teschlange für die entsprechende Priorität gesetzt wird. Der Prozeß
wird an das Ende der entsprechenden Warteschlange gesetzt, unabhängig
davon, ob die gesetzte Priorität vom vorherigen fppri-Wert des Pro-
zesses abweicht.
Ein ablaufender Prozeß kann die CPU freigeben und sich an das Ende der
Warteschlange gleicher Priorität setzen, indem sein vorheriger
fppri-Wert aktualisiert wird.
Beim priocntl-Kommando PCGETPARMS werden die Parameter zur Zeitschei-
benverteilung für den Fixed-Priority-Prozeß mit dem höchsten
fpumdpri-Wert aus den angegebenen Prozessen zurückgegeben, wenn
pccid die Fixed-Priority-Klasse angibt und mehr als ein Fixed-
Priority-Prozeß angegeben wird; die Prozeßnummer des Prozesses wird
vom priocntl()-Aufruf zurückgegeben. Gibt es mehr als einen Prozeß mit
der höchsten Priorität, so ist die zurückgegebene Prozeßnummer imple-
metierungsabhängig.
Die Felder fptqsecs und fptqnsecs werden verwendet, um die Länge der
Zeitscheibe für einen Prozeß oder eine Prozeßgruppe zu setzen oder
abzurufen. fptqsecs ist die Anzahl der Sekunden und fptqnsecs die
Anzahl der zuzüglichen Nanosekunden in der Zeitscheibe. Wird fptqsecs
zum Beispiel auf den Wert 2 und fptqnsecs auf den Wert 500.000.000
(dezimal) gesetzt, so wäre die Zeitscheibe zweieinhalb Sekunden lang.
Der Wert 1.000.000.000 oder höher für fptqnsecs erzeugt einen Fehler;
dabei wird errno auf EINVAL gesetzt. Obwohl die Auflösung des Feldes
tqnsecs sehr hoch ist, wird die angegebene Zeitscheibe vom System auf
das nächste ganzzahlige Vielfache der Auflösung der Systemuhr gerun-
det. Beispielsweise beträgt die höchste, momentan verfügbare Auflösung
der Anlage 3B2 10 Millisekunden (1 "Zeittakt"). Die Einstellung von
fptqsecs gleich 0 und fptqnsecs gleich 34.000.000 würde eine Zeit-
scheibe von 34 Millisekunden angeben, die auf vier Zeittakte (40 Mil-
lisekunden) aufgerundet wird. Der Maximalwert für die Zeitscheibe ist
implementierungsabhängig und entspricht LONGMAX Zeittakten (definiert
in limits.h). Die Angabe einer Zeitscheibe, die größer als dieser
Maximalwert ist, hat einen Fehler zur Folge; dabei wird errno auf
ERANGE gesetzt (obwohl auch unendliche Zeitscheiben durch einen
Seite 14 Reliant UNIX 5.44 Gedruckt 11/98
priocntl(2) priocntl(2)
besonderen Wert angefordert werden können; siehe Beschreibung weiter
unten). Bei einer Zeitscheibe von Null (wenn sowohl fptqsecs als auch
fptqnsecs auf 0 gesetzt werden), wird ein Fehler zurückgegeben und
errno enthält EINVAL.
Das Feld fptqnsecs kann auf einen der folgenden Sonderwerte gesetzt
werden (definiert in sys/rtpriocntl.h), bei denen der Wert von
fptqsecs ignoriert wird:
FPTQINF
Stellt eine unendliches Zeitscheibe ein.
FPTQDEF
Setzt die Zeitscheibe auf den voreingestellten Wert für diese
Priorität [siehe fpdptbl(4)].
FPNOCHANGE
Die Zeitscheibe wird nicht gesetzt. Dieser Wert ist nützlich,
wenn die Echtzeit-Priorität eines Prozesses geändert werden, die
Zeitscheibe aber unverändert bleiben soll. Die Angabe dieses Wer-
tes beim Ändern eines Prozesses in einen Echtzeit-Prozeß ent-
spricht der Angabe von FPTQDEF.
Um die Klasse eines Prozesses von einer anderen Klasse in Fixed-
Priority zu ändern, muß der Prozeß, der priocntl() aufruft, über
Systemverwalterrechte verfügen. Um die Priorität für einen Fixed-
Priority-Prozeß zu ändern, muß der Prozeß, der priocntl() aufruft,
über Systemverwalterrechte verfügen oder muß selbst ein Fixed-
Priority-Prozeß sein, dessen reale oder effektive Benutzernummer der
realen oder effektiven Benutzernummer des Zielprozesses entspricht.
Die Fixed-Priority-Priorität wird bei den Systemaufrufen fork(2) und
exec(2) unverändert weitergegeben.
PROZESSORAFFINITÄT UND BINDUNGSBETRACHTUNGEN
Um die Trefferquoten eines Multiprozessor-Systems im Cache-Speicher zu
erhöhen, sollte ein Prozeß im Normalfall auf einem bestimmten Prozes-
sor ablaufen. Diese Affinität zu einem bestimmten Prozessor kann die
erforderliche Speicherbandbreite des Prozesses (und für das System als
Ganzes) verringern. Wenn ein Prozeß nicht erst "vor kurzem" abgelaufen
ist, befinden sich für jeden der Prozessoren mit hoher Wahrscheinlich-
keit nur noch wenige Daten im Cache-Speicher - und dadurch sollte er
seine Affinität für einen bestimmten Prozessor verlieren.
Dieser Affinitätsmechanismus kann vom Systemverwalter prozeßweise
aktiviert und deaktiviert werden [siehe mpcntl(3X)]. Der Affinitätsme-
chanismus ist für die Time-Sharing- und Fixed-Priority-Klasse stan-
dardmäßig auf on, für die Echtzeit-Klasse auf off gestellt.
Seite 15 Reliant UNIX 5.44 Gedruckt 11/98
priocntl(2) priocntl(2)
Ein Prozeß kann auch an zwei oder mehr Prozessoren gebunden werden.
Dies bewirkt, daß der Prozeß ausschließlich auf einem Prozessor aus
dieser Gruppe abläuft. Wenn es einen aktuell verfügbaren Prozessor
gibt, an den der Prozeß jedoch nicht gebunden ist, wartet der Prozeß
so lange, bis auf einem Prozessor aus seiner Gruppe kein Prozeß mit
höherer Priorität mehr läuft.
Die Bindung an einen bestimmten Prozessor bzw. eine bestimmte Prozes-
sorgruppe kann vom Prozeß [siehe mpcntl(3X)] oder vorübergehend vom
Systemkern hergestellt werden (im letzteren Fall muß der Systemkern
gerade einen Treiber-Code ausführen, der auf einer bestimmten CPU
ablaufen muß).
RÜCKGABEWERT
Falls nichts anderes gesagt wurde, gibt priocntl() bei erfolgreicher
Ausführung den Wert 0 zurück. Bei Fehlern liefert priocntl() -1 zurück
und setzt errno, um den Fehler anzuzeigen.
FEHLER
Die folgenden Beschreibungen der Fehlercodes sind funktionsspezifisch.
Eine allgemeingültige Beschreibung finden Sie in introprm2(2) bzw. in
errno(5).
priocntl() schlägt fehl, wenn mindestens eine der folgenden Bedingun-
gen erfüllt ist:
EPERM Der aufrufende Prozeß verfügt nicht über die erforderlichen
Rechte.
EINVAL Das Argument cmd ist ungültig, eine ungültige oder nicht
konfigurierte Klasse wurde angegeben, oder einer der angege-
benen Parameter war ungültig.
EDOM Die Länge der angeforderten Zeitscheibe befand sich außer-
halb des zulässigen Bereichs.
ESRCH Keiner der angegebenen Prozesse existiert.
EFAULT Alle Datenbereiche oder Teile der Datenbereiche, auf die die
Datenzeiger verweisen, befinden sich außerhalb des Adreßbe-
reichs des Prozesses.
ENOMEM Das Ändern der Klasse eines Prozesses schlug fehl, weil zu
wenig Speicher verfügbar war.
EAGAIN Das Ändern der Klasse eines Prozesses schlug fehl, weil
unzureichende Ressourcen (außer Hauptspeicher) verfügbar
waren (beispielsweise klassenspezifische Datenstrukturen im
Systemkern).
Seite 16 Reliant UNIX 5.44 Gedruckt 11/98
priocntl(2) priocntl(2)
SIEHE AUCH
priocntl(1), dispadmin(1M), exec(2), fork(2), nice(2), priocntlset(2),
mpcntl(3X), fpdptbl(4), rtdptbl(4), tsdptbl(4), types(5).
Seite 17 Reliant UNIX 5.44 Gedruckt 11/98