Threads planen
Threads können terminiert werden und die Threadbibliothek stellt mehrere Funktionen zur Verarbeitung und Steuerung der Planung von Threads bereit.
Es stellt außerdem Funktionen zur Steuerung der Planung von Threads während Synchronisationsoperationen, wie z. B. das Sperren eines Mutex, bereit. Jeder Thread hat eine eigene Gruppe von Planungsparametern. Diese Parameter können mit dem Threadattributobjekt festgelegt werden, bevor der Thread erstellt wird. Die Parameter können auch dynamisch während der Ausführung des Threads festgelegt werden.
Die Steuerung der Planung eines Threads kann eine komplizierte Task sein. Da der Scheduler alle Threads systemweit verarbeitet, interagieren die Planungsparameter eines Threads mit denen aller anderen Threads im Prozess und in den anderen Prozessen. Die folgenden Funktionen sind die ersten, die verwendet werden, wenn Sie die Planung eines Threads steuern möchten.
- Durch Festlegen von Terminierungsattributen beim Erstellen eines Threads
- Durch dynamische Änderung der Terminierungsattribute eines erstellten Threads
- Durch Definieren der Auswirkung eines Mutex auf die Zeitplanung des Threads beim Erstellen eines Mutex (bekannt als Synchronisationsplanung)
- Durch dynamisches Ändern der Planung eines Threads während Synchronisationsoperationen (bekannt als Synchronisationsplanung)
Zeitplanungsparameter
Ein Thread hat die folgenden Planungsparameter:
Parameter | Beschreibung |
---|---|
Geltungsbereich | Der Konfliktbereich eines Threads wird durch das Threadmodell definiert, das in der Threadbibliothek verwendet wird. |
Richtlinie | Die Planungsrichtlinie eines Threads definiert, wie der Scheduler den Thread behandelt, wenn er die Steuerung der CPU übernimmt. |
priority | Die Planungspriorität eines Threads definiert den relativen Stellenwert der von den einzelnen Threads ausgeführten Arbeit. |
Die Planungsparameter können vor der Threaderstellung oder während der Threadausführung festgelegt werden. Im Allgemeinen ist die Steuerung der Planungsparameter von Threads nur bei CPU-intensiven Threads von Bedeutung. Daher stellt die Threadbibliothek Standardwerte bereit, die für die meisten Fälle ausreichend sind.
Attribut "inheritsched" verwenden
Das Attribut inheritsched des Threadattributobjekts gibt an, wie die Planungsattribute des Threads definiert werden sollen. Die folgenden Werte sind gültig:
Werte | Beschreibung |
---|---|
PTHREAD_INHERIT_SCHED | Gibt an, dass der neue Thread die Planungsattribute (schedpolicy -und schedparam -Attribute) seines erstellenden Threads erhält. Planungsattribute, die im Attributobjekt definiert sind, werden ignoriert. |
PTHREAD_EXPLICIT_SCHED | Gibt an, dass der neue Thread die Planungsattribute abrufen soll, die in diesem Attributobjekt definiert sind. |
Der Standardwert des Attributs inheritsched ist PTHREAD_INHERIT_SCHED. Das Attribut wird durch Aufrufen der Subroutine pthread_attr_setinheritsched gesetzt. Der aktuelle Wert des Attributs wird durch Aufrufen der Subroutine pthread_attr_getinheritsched zurückgegeben.
Zum Festlegen der Planungsattribute eines Threads im Threadattributobjekt muss das Attribut inheritsched zuerst auf PTHREAD_EXPLICIT_SCHED gesetzt werden. Andernfalls werden die Attribute-Objektterminierungsattribute ignoriert.
Planungsrichtlinie und Priorität
Die Threadbibliothek stellt die folgenden Planungsrichtlinien bereit:
Bibliothek | Beschreibung |
---|---|
SCHED_FIFO | FIFO-Zeitplanung (First In/First Out). Jeder Thread hat eine feste Priorität. Wenn mehrere Threads dieselbe Prioritätsstufe haben, werden sie bis zum Abschluss in FIFO-Reihenfolge ausgeführt. |
SCHED_RR | Zeitplan für Round-Robin (RR). Jeder Thread hat eine feste Priorität. Wenn mehrere Threads dieselbe Prioritätsstufe haben, werden sie für eine feste Zeitscheibe in FIFO-Reihenfolge ausgeführt. |
SCHED_OTHER | AIX®. Jeder Thread hat eine Anfangspriorität, die vom Scheduler dynamisch entsprechend der Threadaktivität geändert wird. Die Threadausführung erfolgt in Zeitscheiben. Auf anderen Systemen kann diese Planungsrichtlinie abweichen. |
In Versionen von AIX vor 5.3ist es nicht zulässig, die Priorität eines Threads zu ändern, wenn seine Planungsrichtlinie auf SCHED_OTHER gesetzt wird. In diesem Fall verwaltet der Kernel direkt die Priorität und der einzige gültige Wert, der an die Subroutine pthread_setschedparam übergeben wird, ist der Wert DEFAULT_PRIO . Der Wert DEFAULT_PRIO ist in der pthread.h -Datei als 1 definiert und alle anderen übergebenen Werte werden ignoriert.
Ab AIX 5.3können Sie die Priorität eines Threads ändern, wenn Sie seine Planungsrichtlinie auf SCHED_OTHERsetzen. Die gültigen Werte, die an die Subroutine pthread_setschedparam übergeben werden können, sind 40 bis 80. Es können jedoch nur privilegierte Benutzer eine Priorität größer als 60 festlegen. Eine Priorität im Bereich von 1 bis 39 hat dieselbe Priorität wie die von 40 und eine Priorität im Bereich von 81 bis 127 hat dieselbe Priorität wie die von 80.
Felder | Beschreibung |
---|---|
sched_priority | Gibt die Priorität an. |
sched_policy | Dieses Feld wird von der Threadbibliothek ignoriert. Nicht verwenden |
Planungsrichtlinie und Priorität zur Erstellungszeit festlegen
Die Planungsrichtlinie kann beim Erstellen eines Threads festgelegt werden, indem das Attribut schedpolicy des Threadattributobjekts festgelegt wird. Die Subroutine pthread_attr_setschedpolicy setzt die Planungsrichtlinie auf eine der zuvor definierten Planungsrichtlinien. Der aktuelle Wert des Attributs schedpolicy eines Threadattributobjekts kann mit der Subroutine pthread_attr_getschedpolicy abgerufen werden.
Die Ausführungspriorität kann zum Zeitpunkt der Erstellung eines Threads festgelegt werden, indem das Attribut schedparam des Threadattributobjekts festgelegt wird. Die Subroutine pthread_attr_setschedparam legt den Wert des Attributs schedparam fest und kopiert den Wert der angegebenen Struktur. Die Subroutine pthread_attr_getschedparam ruft das Attribut schedparam ab.
sched_param schedparam;
schedparam.sched_priority = 3;
pthread_attr_init(&attr);
pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
pthread_attr_setschedpolicy(&attr, SCHED_RR);
pthread_attr_setschedparam(&attr, &schedparam);
pthread_create(&thread, &attr, &start_routine, &args);
pthread_attr_destroy(&attr);
Weitere Informationen zum Attribut inheritsched finden Sie unter Attribut "inheritsched" verwenden.Zeitplanungsattribute zur Ausführungszeit festlegen
Die Subroutine pthread_getschedparam gibt die Attribute schedpolicy und schedparam eines Threads zurück. Diese Attribute können durch Aufrufen der Subroutine pthread_setschedparam festgelegt werden. Wenn der Zielthread derzeit auf einem Prozessor ausgeführt wird, werden die neue Planungsrichtlinie und -priorität bei der nächsten Planung des Threads implementiert. Ist der Zielthread nicht aktiv, kann er sofort am Ende des Subroutinenaufrufs geplant werden.
Angenommen, ein Thread T wird momentan mit einer Umlaufrichtlinie ausgeführt, wenn das Attribut schedpolicy von T in FIFO geändert wird. T wird bis zum Ende der Zeitscheibe ausgeführt, zu dem Zeitpunkt, zu dem die Planungsattribute erneut ausgewertet werden. Wenn keine Threads eine höhere Priorität haben, wird T neu geplant, auch bevor andere Threads dieselbe Priorität haben. Betrachten Sie ein zweites Beispiel, in dem ein Thread mit niedriger Priorität nicht ausgeführt wird. Wenn die Priorität dieses Threads durch einen anderen Thread erhöht wird, der die Subroutine pthread_setschedparam aufruft, wird der Zielthread sofort terminiert, wenn er der ausführbare Thread mit der höchsten Priorität ist.
Planung-Richtlinienaspekte
- Durch die Verwendung der Umlaufrichtlinie wird sichergestellt, dass alle Threads mit derselben Prioritätsstufe unabhängig von ihrer Aktivität gleich geplant werden. Dies kann in Programmen nützlich sein, in denen Threads Sensoren lesen oder Aktoren schreiben müssen.
- Die Verwendung der FIFO-Richtlinie sollte mit großer Vorsicht erfolgen. Ein Thread, der mit der FIFO-Richtlinie ausgeführt wird, wird bis zum Abschluss ausgeführt, es sei denn, er wird durch einige Aufrufe blockiert, wie z. B. die Ausführung von Eingabe-und Ausgabeoperationen. Ein FIFO-Thread mit hoher Priorität wird möglicherweise nicht zurückgestellt und kann sich auf die globale Leistung des Systems auswirken. Beispielsweise sollten Threads, die intensive Berechnungen durchführen (z. B. eine große Matrix invertieren), nie mit der FIFO-Richtlinie ausgeführt werden.
Die Einstellung der Planungsrichtlinie und Priorität wird auch durch den Konfliktbereich von Threads beeinflusst. Die Verwendung der FIFO-oder Umlaufrichtlinie ist möglicherweise nicht immer zulässig.
Subroutine sched_yield
Die Subroutine sched_yield ist das Äquivalent für Threads der Subroutine yield . Die Subroutine sched_yield erzwingt, dass der aufrufende Thread die Verwendung seines Prozessors aufgibt, und gibt anderen Threads die Möglichkeit, terminiert zu werden. Der nächste geplante Thread kann zu demselben Prozess wie der aufrufende Thread oder zu einem anderen Prozess gehören. Verwenden Sie die Subroutine yield nicht in einem Multithread-Programm.
Das Schnittstellenunterprogramm pthread_yield ist in der Single UNIX Specification, Version 2, nicht verfügbar.