spinlock(3X) spinlock(3X)
NAME
spinlock, initspin, spinunlock, cspinlock, yield - Benutzersynchroni-
sation
SYNTAX
cc [option ...] datei ... -lmproc
#include <ulocks.h>
void initspin(spinlockt *lck, long spincnt);
void spinlock(spinlockt *lck);
void spinunlock(spinlockt *lck);
int cspinlock(spinlockt *lck);
void yield();
BESCHREIBUNG
Die einfachste Synchronisationsmethode für eine Multiprozessor-Umge-
bung ist die sogenannte "spinlock"-Methode, die auch anderen Synchro-
nisationsmethoden zugrundeliegt. Diese Methode ist abhängig von einer
unteilbaren Lesen-Modifizieren-Schreiben-Operation, die vom System zur
Verfügung gestellt wird. Die Methode wird auf unterschiedlichen CPU-
Architekturen unterschiedlich implementiert; unterschiedliche System-
architekturen unterstützen sie auch auf unterschiedliche Art und
Weise. Normalerweise werden diese systemnahen Operationen in Maschi-
nensprache codiert. Es werden einige Grundmethoden zur Verfügung
gestellt, um nicht auf die einzelnen Implementationsformen auf den
unterschiedlichen Rechnern eingehen zu müssen.
Eine Anwendung erfolgt in der Regel durch kooperierende Prozesse, die
bestimmte Adreßbereiche (wie gemeinsame Speicherbereiche) gemeinsam
nutzen. Hierdurch wird der Zugriff auf gemeinsame Ressourcen und
Datenstrukturen gesteuert. Die Ziel-Datenstruktur sieht folgendermaßen
aus:
typedef struct spinlock {
volatile int sllock;
long slscount;
} spinlockt;
initspin() initialisiert eine Zielsperre, die von diesen Methoden ver-
wendet wird. initspin() hat zwei Argumente: lck ist ein Zeiger auf die
Ziel-Datenstruktur spinlockt, spincnt ist die Anzahl der Wartezyklen,
die auf ein gesperrtes Ziel angewandt werden, bevor der aufrufende
Prozeß die CPU freigibt. Der Wert -1 für spincnt bedeutet eine unend-
liche Anzahl an Wartezyklen (der Prozeß gibt die CPU nicht freiwillig
frei).
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
spinlock(3X) spinlock(3X)
spinlock() versucht, die durch lck angegebene Sperre zu erzielen. Ent-
weder diese Funktion wird eine bestimmte Anzahl an Wartezyklen ausfüh-
ren (festgelegt durch den Initialisierungsparameter spincnt), bevor
die CPU schließlich freigegeben wird, oder sie wird unendlich oft wie-
derholt (wenn spincnt den Wert -1 hat), bis die Sperre erzielt worden
ist. Das Betriebssystem kann die zur Verfügung stehende Zeit aller-
dings jederzeit beenden.
spinunlock() gibt die Sperre, die durch lck angegeben ist, frei.
spinunlock() bewirkt das Gegenteil von spinlock().
Die bedingte spinlock-Operation cspinlock() versucht, die angegebene
Sperre lck zu erzielen, und gibt den Status der Sperre zurück. Wenn
die Sperre bereits besteht, werden keine Wartezyklen ausgeführt, und
es wird ein Fehler gemeldet (Rückgabewert ungleich Null). Wenn die
Sperre erzielt werden kann, wird Null zurückgegeben.
yield() ermöglicht die Freigabe der CPU ohne Blockieren (implementiert
mit der Option mpcntlyield von mpcntl()). Diese Funktion kehrt sofort
zurück, wenn der aufrufende Prozeß eine ausreichend hohe Priorität
hat, so daß die Ausführung fortgesetzt werden kann.
SIEHE AUCH
mpcntl(3X).
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98