Ce tableau était assez facile à trouver sur microsoft.com et d’innombrables autres endroits.
La colonne "Priorité de base" du Gestionnaire des tâches affiche la classe de processus (appelée "classe de priorité de processus" dans certains documents). Notez que le Gestionnaire des tâches (au moins dans Windows 10) attribue à la classe de priorité "Inactif" la valeur "Faible" (probablement pour éviter toute confusion avec le processus d'inactivité, etc.).
La classe de processus sert uniquement à initialiser la priorité des threads créés dans le processus. Chaque thread est créé avec la priorité de thread "normale". Si le processus appartient à la classe de processus "normale", cela signifie que le thread a une priorité de base de 8.
(Bizarrement, l'API CreateProcess utilise un argument pour la classe de processus, mais pas CreateThread. Pour créer un thread avec une priorité de thread autre que la priorité "normale", vous devez créer le thread, puis modifier sa priorité ultérieurement avec SetThreadPriority.)
Les programmes peuvent modifier les priorités de leurs propres threads dans leur classe de processus. Dans un processus "normal", définir un thread sur THREAD_PRIORITY_HIGHEST définit la priorité de base de ce thread sur 10. Si vous modifiez la classe de priorité d'un processus (par exemple avec le gestionnaire de tâches), la priorité de base de chaque thread change en fonction du tableau.
Il y a beaucoup d’anomalies de noms dans ce tableau. "Le plus élevé" n'est pas la priorité la plus élevée du thread, "le plus bas" n'est pas le plus bas, "inactif" ne signifie pas que vous ne faites rien ou ne le ferez pas, et "temps réel" ne garantit pas un comportement de planification adapté au travail en temps réel ( c'est simplement plus prévisible que les classes non temps réel, en partie parce qu'il est au-dessus de toutes, et en partie parce que l'ajustement automatique des priorités est désactivé dans la classe "temps réel").
Pour les processus, il est supposé utiliser les classes de processus pour indiquer l’importance - ou non - de gagner du temps CPU pour chaque processus, par rapport à un processus "normal". Et au sein de chaque processus, le développeur est supposé définir les priorités du thread de la même manière, par rapport à un thread "normal" du processus. En pratique, très peu de développeurs s'embêtent. (Et ils devraient le faire. Par exemple, une tâche liée au calcul, telle que le rendu vidéo, doit être définie sur une priorité inférieure à la normale, afin d'éviter toute interférence avec l'utilisation interactive du système.)
Et la classe de processus "inactive" et la priorité de thread "inactive" au sein d'un processus ne signifient pas que rien ne sera fait par ce processus ou par ce thread. Cela signifie simplement que le thread ou le processus est prêt à vivre avec des cycles de processeur que personne d'autre ne veut.
Vous remarquerez qu'il n'y a pas de "0" sur la table. Les applications ordinaires ne peuvent pas demander à exécuter à la priorité 0 via les API normales. Seuls les threads en mode noyau peuvent être exécutés avec une priorité zéro. Comme vous l'avez constaté, il est réservé au fil de page zéro - ou aux fils de discussion; il peut y en avoir plusieurs sur une machine NUMA.
En ce qui concerne le processus inactif - il et ses threads sont des cas particuliers. Chaque objet de thread a un membre "priority" et est défini sur 0 pour les threads inactifs. Toutefois, les membres de priorité des threads inactifs ne sont jamais réellement utilisés, et il n'y a pas de file d'attente prête pour les threads inactifs. Au lieu de cela, si le planificateur de système d'exploitation ne peut trouver aucun autre thread à exécuter sur un processeur disponible, il sélectionne simplement le thread inactif pour ce processeur. (Chaque unité centrale a son propre thread inactif dédié.) Ainsi, bien qu'il semble avoir la priorité 0, il est planifié comme s'il avait la priorité négative 1. Même un thread de priorité 0 prévaut sur le thread inactif.
Le terme "inactif" a au moins une autre signification commune dans Windows. Un processus peut "s'inscrire pour la détection d'inactivité". Dans ce cas, "inactif" signifie qu’il n’ya eu aucune saisie de l’utilisateur (clavier ou souris) et pas plus de 10% d’utilisation d’un processeur ou d’un disque au cours des quinze dernières minutes. Windows peut lancer diverses tâches de "maintenance" ou de "nettoyage", telles que l'optimisation de l'emplacement des fichiers, lorsque ce type "d'inactivité" est détecté. Le code qui s'exécute en réponse à ceux-ci ne s'exécute pas nécessairement dans la classe de processus inactive ou à la priorité du thread inactif. Vous avez peut-être vu une petite méthode de ligne de commande pour demander l'exécution de "tâches inactives":
C:\> Rundll32.exe advapi32.dll,ProcessIdleTasks
et c'est ce que cela fait référence. Cela n'a rien à voir avec le processus inactif ni avec le processus dit "inactif" ou la priorité du thread.
J'ai écrit une réponse avec plus de détails sur la manière dont le planificateur utilise les priorités de thread pour effectuer ses sélections. ici .
Référence: https://docs.google.com/viewer?url=https%3A%2F%2Fdownload.microsoft.com%2Fdownload%2F1%2F4%2F0%2F1ownloads2fdownload.microsoft.com/fr Ceci est un ensemble d'extraits de Windows Internals 6ème éd. par Salomon, Russinovich, et al . Le matériel souhaité commence à la page 62 du document PDF, numéro de page 408 du livre.