Sheduling von PThreads

  • 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

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Use <fn>...</fn> to insert automatically numbered footnotes.
  • You can use the <go> tags just like the <a> for nicer urls.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>. Beside the tag style "<foo>" it is also possible to use "[foo]".
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.

More information about formatting options

CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.
Image CAPTCHA
Copy the characters (respecting upper/lower case) from the image.