Zeitplanungsprioritäten

Die Ausführung von Threads wird basierend auf ihrer Planungspriorität geplant. Jedem Thread wird eine Planungspriorität zugewiesen. Die Prioritätsebenen reichen von 0 (niedrigste Priorität) bis 31 (höchste Priorität). Nur der Nullseitenthread kann eine Priorität von 0 (null) haben. (Der Nullseitenthread ist ein Systemthread, der für das Nullen beliebiger freier Seiten verantwortlich ist, wenn keine anderen Threads ausgeführt werden müssen.)

Das System behandelt alle Threads mit der gleichen Priorität als gleich. Das System weist allen Threads mit der höchsten Priorität Zeitslices in Roundrobin-Weise zu. Wenn keiner dieser Threads ausgeführt werden kann, weist das System allen Threads mit der nächsten höchsten Priorität Roundrobin-Zeitslices zu. Wenn ein Thread mit höherer Priorität für die Ausführung verfügbar ist, beendet das System die Ausführung des Threads mit niedrigerer Priorität (ohne dass er die Verwendung seines Zeitslices beenden kann) und weist dem Thread mit höherer Priorität einen Zeitslice zu. Weitere Informationen finden Sie unter Kontextwechsel.

Die Priorität der einzelnen Threads wird durch die folgenden Kriterien bestimmt:

  • Die Prioritätsklasse des Prozesses
  • Die Prioritätsebene des Threads innerhalb der Prioritätsklasse des Prozesses.

Die Prioritätsklasse und die Prioritätsebene werden kombiniert, um die Basispriorität eines Threads zu bilden. Informationen zur dynamischen Priorität eines Threads finden Sie unter Priority Boosts.

Priority-Klasse

Jeder Prozess gehört zu einer der folgenden Prioritätsklassen:

IDLE _ _ PRIORITY-KLASSE
UNTERHALB _ DER _ NORMAL _ PRIORITY-KLASSE
NORMAL _ _ PRIORITY-KLASSE
ÜBER _ DER NORMAL _ _ PRIORITY-KLASSE
HIGH _ _ PRIORITY-KLASSE
REALTIME _ _ PRIORITY-KLASSE

Standardmäßig ist die Prioritätsklasse eines Prozesses NORMAL _ PRIORITY _ CLASS. Verwenden Sie die CreateProcess-Funktion, um die Prioritätsklasse eines untergeordneten Prozesses anzugeben, wenn Sie ihn erstellen. Wenn der aufrufende Prozess IDLE _ PRIORITY CLASS oder BELOW NORMAL PRIORITY CLASS _ _ _ _ ist, erbt der neue Prozess diese Klasse. Verwenden Sie die GetPriorityClass-Funktion, um die aktuelle Prioritätsklasse eines Prozesses zu bestimmen, und die SetPriorityClass-Funktion, um die Prioritätsklasse eines Prozesses zu ändern.

Prozesse, die das System überwachen, z. B. Bildschirmschoner oder Anwendungen, die eine Anzeige regelmäßig aktualisieren, sollten IDLE _ PRIORITY _ CLASS verwenden. Dadurch wird verhindert, dass threads dieses Prozesses, die keine hohe Priorität haben, Threads mit höherer Priorität stören.

Verwenden Sie HIGH _ PRIORITY _ CLASS mit Vorsicht. Wenn ein Thread für längere Zeiträume mit der höchsten Prioritätsebene ausgeführt wird, erhalten andere Threads im System keine Prozessorzeit. Wenn mehrere Threads gleichzeitig mit hoher Priorität festgelegt werden, verlieren die Threads ihre Effektivität. Die Klasse mit hoher Priorität sollte für Threads reserviert sein, die auf zeitkritische Ereignisse reagieren müssen. Wenn Ihre Anwendung eine Aufgabe ausführt, für die die Klasse mit hoher Priorität erforderlich ist, während die restlichen Aufgaben die normale Priorität haben, verwenden Sie SetPriorityClass, um die Prioritätsklasse der Anwendung vorübergehend zu erhöhen. Reduzieren Sie sie dann, nachdem die zeitkritische Aufgabe abgeschlossen wurde. Eine andere Strategie besteht in der Erstellung eines Prozesses mit hoher Priorität, bei dem alle Threads die meiste Zeit blockiert werden, und Threads nur dann zu erzeugen, wenn kritische Aufgaben benötigt werden. Der wichtigste Punkt ist, dass ein Thread mit hoher Priorität für einen kurzen Zeitraum ausgeführt werden sollte, und nur dann, wenn zeitkritische Aufgaben ausgeführt werden müssen.

Sie sollten fast nie REALTIME PRIORITY CLASS verwenden, da dies Systemthreads unterbricht, die Mauseingaben, Tastatureingaben und Hintergrunddatenträger _ _ leeren. Diese Klasse kann für Anwendungen geeignet sein, die direkt mit der Hardware "sprechen" oder kurze Aufgaben ausführen, die eingeschränkte Unterbrechungen haben sollten.

Prioritätsebene

Im Folgenden finden Sie Prioritätsebenen innerhalb jeder Prioritätsklasse:

_THREADPRIORITÄT IM _ LEERLAUF
_THREADPRIORITÄT _ NIEDRIGSTE
_THREADPRIORITÄT _ UNTER _ NORMAL
_THREADPRIORITÄT _ NORMAL
_THREADPRIORITÄT _ ÜBER _ NORMAL
_THREADPRIORITÄT _ AM HÖCHSTEN
_ _ THREADPRIORITÄTSZEIT _ KRITISCH

Alle Threads werden mit THREAD _ PRIORITY _ NORMAL erstellt. Dies bedeutet, dass die Threadpriorität mit der Prozessprioritätsklasse identisch ist. Nachdem Sie einen Thread erstellt haben, verwenden Sie die SetThreadPriority-Funktion, um die Priorität relativ zu anderen Threads im Prozess anzupassen.

Eine typische Strategie ist die Verwendung von THREAD PRIORITY ABOVE NORMAL oder THREAD PRIORITY HIGHEST für den Eingabethread des Prozesses, um sicherzustellen, dass die Anwendung _ _ auf den Benutzer _ _ _ reagiert. Hintergrundthreads, insbesondere solche, die prozessorintensiv sind, können auf THREADPRIORITÄT UNTER NORMAL oder _ THREADPRIORITÄT NIEDRIGSTE festgelegt werden, um sicherzustellen, dass sie bei Bedarf nicht _ _ mehr verwendet werden _ _ können. Wenn Sie jedoch einen Thread haben, der auf einen anderen Thread mit einer niedrigeren Priorität wartet, um eine Aufgabe auszuführen, stellen Sie sicher, dass Sie die Ausführung des wartenden Threads mit hoher Priorität blockieren. Verwenden Sie hierzu eine Wartefunktion, einenkritischen Abschnitt oder die Sleep-Funktion, SleepExoder SwitchToThread-Funktion. Dies ist dem Ausführen einer Schleife durch den Thread vorzuziehen. Andernfalls kann der Prozess zu einem Deadlock werden, da der Thread mit niedrigerer Priorität nie geplant wird.

Verwenden Sie die GetThreadPriority-Funktion, um die aktuelle Prioritätsebene eines Threads zu bestimmen.

Basispriorität

Die Prozessprioritätsklasse und threadprioritätsebene werden kombiniert, um die Basispriorität jedes Threads zu bilden.

Die folgende Tabelle zeigt die Basispriorität für Kombinationen von Prozessprioritätsklasse und Threadprioritätswert.

Prozessprioritätsklasse Threadprioritätsebene Basispriorität
IDLE_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 2
THREAD_PRIORITY_BELOW_NORMAL 3
THREAD_PRIORITY_NORMAL 4
THREAD_PRIORITY_ABOVE_NORMAL 5
THREAD_PRIORITY_HIGHEST 6
THREAD_PRIORITY_TIME_CRITICAL 15
BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 4
THREAD_PRIORITY_BELOW_NORMAL 5
THREAD_PRIORITY_NORMAL 6
THREAD_PRIORITY_ABOVE_NORMAL 7
THREAD_PRIORITY_HIGHEST 8
THREAD_PRIORITY_TIME_CRITICAL 15
NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 6
THREAD_PRIORITY_BELOW_NORMAL 7
THREAD_PRIORITY_NORMAL 8
THREAD_PRIORITY_ABOVE_NORMAL 9
THREAD_PRIORITY_HIGHEST 10
THREAD_PRIORITY_TIME_CRITICAL 15
ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 8
THREAD_PRIORITY_BELOW_NORMAL 9
THREAD_PRIORITY_NORMAL 10
THREAD_PRIORITY_ABOVE_NORMAL 11
THREAD_PRIORITY_HIGHEST 12
THREAD_PRIORITY_TIME_CRITICAL 15
HIGH_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 11
THREAD_PRIORITY_BELOW_NORMAL 12
THREAD_PRIORITY_NORMAL 13
THREAD_PRIORITY_ABOVE_NORMAL 14
THREAD_PRIORITY_HIGHEST 15
THREAD_PRIORITY_TIME_CRITICAL 15
REALTIME_PRIORITY_CLASS THREAD_PRIORITY_IDLE 16
THREAD_PRIORITY_LOWEST 22
THREAD_PRIORITY_BELOW_NORMAL 23
THREAD_PRIORITY_NORMAL 24
THREAD_PRIORITY_ABOVE_NORMAL 25
THREAD_PRIORITY_HIGHEST 26
THREAD_PRIORITY_TIME_CRITICAL 31