Sheduling von PThreads
Submitted by rac on 13 January, 2008 - 16:58.
- Scheduling bestimmt, welche Aktivität wie lange laufen soll
- Posix Realtime Erweiterung ermöglicht garantierte Zeiten
- Scheduling nur unterstützt, wenn _POSIX_THREAD_PRIORITY_SCHEDULING definiert ist
- Auswahl des nächsten Threads geschieht aufgrund von
- Priorität
- Policy (wie werden Threads mit gleicher Priorität abgearbeitet)
Sheduling Prioritäten und Domänen
- Domäne: eine Gruppierung von CPUs
- Scope: Stufe auf welcher Scheduling von Threads stattfindet
- je nach Fähigkeiten des OS, beinhaltet Scheduling Scope von Threads
- nur ProcessScope (Userspace Implementationen – green threads)
- nur SystemScope (1:1 Implementationen – red threads)
- oder beides (N:M Implementationen)
- Gruppierung von CPUs in Domänen, denen Threads zugewiesen werden können
- Domänen werden in Pthreads berücksichtigt, Konfigurationsmöglichkeiten jedoch systemspezifisch
- Process scope = Standard
- Bei Scheduling in nur einem Bereich (Domain) auf ProzessEbene (Scope) können Threads mit niedriger Priorität innerhalb eines Prozesses vom Scheduling ausgeschlossen werden; POSIX ist erfüllt, wenn Threads mit höchster Priorität läuft bis er beendet ist...
- Kann ebenfalls bei mehreren Prozessoren passieren (nicht verwendete CPU)
- Wenn Process Scope Thread blockiert -> System kann ganzen Prozess als blockiert ansehen -> kein Scheduling innerhalb dieses Prozesses mehr.
- System Scope bei Realtime Applikationen besser.
- unter Umständen kann das System besser ausgenutzt werden, wenn weniger Allocation Domains verwendet werden
- wenn auf vorhergehender Seite B und D gestrichen werden, dann ist A und E's Verhalten besser vorhersehbar, da nicht von höherer Priorität preempted
- E hat in dem Falle mehrere CPUs zur Verfügung
- wenn alle Threads in einer Domain geblockt sind (C), dann ist die entsprechende Domain unbenutzt
pthread_attr_t custom_sched_attr; ... pthread_attr_init( &custom_sched_attr ); pthread_attr_setscope( &custom_sched_attr , PTHREAD_SCOPE_SYSTEM); pthread_create( &thread, &custom_sched_attr , ...); ... pthread_attr_getscope( &custom_sched_attr , &attr)
Laufbereite und Blockierte Threads
- Auswahl für's Scheduling der auszuführenden Threads
- runnable, blocked?
- genügend freie CPUs?
- Policy & Priorität?
- Warteschlangen für Threads der gleichen Priorität
- Warteschlangen werden nach Prioritäten abgearbeitet
- sobald ein Thread wieder lauffähig wird, "preemptet" er einen Thread niedrigerer Priorität
Sheduling Policy
SCHED_FIFO
- solange abarbeiten bis blockiert oder beendet. Ein blockierter Thread steht wieder hinten an.
SCHED_RR
- jeder Thread kann während eines "Quantums" an Zeit laufen, dann kommt der nächste dran
SCHED_OTHER
- Default. Übernimmt das System Scheduling. Üblicherweise wie SCHED_RR aber mit Prioritätsanpassung. Ein Thread, der blockiert, bevor er sein Quantum ausgenutz hat wird bevorzugt -> Interaktive Threads werden CPUintensiven Threads bevorzugt.
- Nur wenn _POSIX_THREAD_PRIORITY_SCHEDULING definiert ist. Bei Linux in unistd.h.
Benutzung von Policies und Prioritäten
- Realtime Anwendungen
- SCHED_FIFO
- hohe Priorität
- soll immer ausgeführt werden, wenn möglich
- funktionieren wie EventHandler - sobald was passiert wird's bearbeitet und abgeschlossen
- andere Anwendungen SCHED_RR bzw. SCHED_OTHER
- Posix verlang mindestens 32 PrioritätsStufen
- dynamisch Prioritäten ändern
pthread_setschedparam( &thread, &sched_param);
- Achtung damit kann man sich selbst preempten ;-)
- Es ist möglich Scheduling Eigenschaften an erstellte Threads weiterzuvererben
Sheduling bei Mutexen
Problem: Prioritäts-Umkehrung (Priority inversion)
- Sheduling bei Mutexen wird komplex und kann das Problem noch verschlimmern
Priority Ceiling
- Mutex besitzt eigene Priorität
- sobald ein Thread die Mutex lockt, wird seine Priorität auf diejenige der Mutex gehoben
- Priority Ceiling nur möglich, wenn _POSIX_THREAD_PRIO_PROTECT definiert ist
- PTHREAD_PRIO_NONE kein Priority Ceiling
- PTHREAD_PRIO_PROTECT Priority Ceiling
- PTHREAD_PRIO_INHERIT Prioritätsvererbung
Prioritätsvererbung
- Mutex bekommt die Priorität des höchsten wartenden Threads
- bei unserem Beispiel würde der Statistik Thread nur eine höhere Priorität bekommen, wenn der Kontroll Thread am warten ist
- Priority Inheritance nur möglich, wenn _POSIX_THREAD_PRIO_INHERIT definiert ist
»
- Printer-friendly version
- Download PDF
- 1414 reads

Post new comment