Passer au contenu principal
Cette rubrique décrit comment utiliser PIX pour analyser les blocages et les changements de contexte. Un changement de contexte se produit lorsqu’un cœur de processeur cesse d’exécuter le code d’un thread pour exécuter celui d’un autre thread ou passer à l’état inactif. Lorsque le système d’exploitation change le thread qui s’exécute sur un processeur, il doit enregistrer et restaurer l’état du thread sortant et celui du thread entrant. Cet état, ou contexte, inclut des données comme les valeurs actuelles de tous les registres et le compteur de programme. L’enregistrement et la restauration de cet état sont coûteux en termes de performances; réduire le nombre total de changements de contexte est donc souvent essentiel pour obtenir des temps d’image prévisibles et constants. Pour une démonstration vidéo, consultez Thread Dependency for PIX. Les changements de contexte peuvent se produire pour diverses raisons, par exemple lorsqu’un thread attend un objet de synchronisation ou lorsque le planificateur du système d’exploitation détermine que le quantum d’un thread a expiré (et qu’un autre thread est prêt à s’exécuter sur ce cœur). Les Timing Captures de PIX disposent de plusieurs fonctionnalités qui vous aident à déterminer quand se produisent les changements de contexte et à analyser la cause de chacun d’eux.

Collecter des données sur les changements de contexte

Pour analyser les changements de contexte, vous devez collecter les piles d’appels de chaque changement de contexte. Pour cela, assurez-vous que la case Callstacks on context switches est cochée (figure 1) avant de démarrer une capture. Cette case est cochée par défaut. Figure 1. Volet Options de Start Timing Capture. Capture d'écran montrant l'emplacement de la case Callstacks on context switches dans le volet Options de Start Timing Capture Lorsque Callstacks on context switches est sélectionné, vous pouvez aussi choisir de collecter les piles d’appels du thread qui rend prêt (ready thread). Si vous connaissez bien les interactions entre vos threads, vous pourrez peut-être effectuer votre analyse sans les piles d’appels du thread qui rend prêt. Dans ce cas, vous pouvez réduire la surcharge d’exécution d’une Timing Capture en ne collectant pas ces piles d’appels.

Trouver les blocages et les changements de contexte

Par défaut, les changements de contexte sont affichés sous forme de petites lignes verticales rouges dans les lignes Thread et Core de la chronologie. Les périodes pendant lesquelles un thread ne s’exécute pas, appelées temps de thread non planifié ou blocages, sont dessinées par défaut avec un motif hachuré. Chaque blocage est encadré par un changement de contexte sortant au début et un changement de contexte entrant à la fin. La visualisation par défaut des changements de contexte et des blocages est illustrée à la figure 2. Figure 2. Visualisation par défaut des changements de contexte et des blocages. Capture d'écran annotée montrant la visualisation par défaut des changements de contexte et des blocages Si vous examinez une Timing Capture spécifiquement pour trouver et analyser des changements de contexte, vous pouvez modifier la visualisation par défaut pour les rendre plus visibles. Utilisez l’option Bold Context Switches du volet de configuration des lignes pour étendre les lignes verticales rouges qui identifient un changement de contexte sur toute la hauteur de la ligne Thread ou Core (figure 3). Figure 3. Emplacement et effet de l’option Bold Context Switches. Capture d'écran montrant l'emplacement et l'effet de l'option Bold Context Switches Pour identifier rapidement les blocages et les changements de contexte qui se produisent pendant l’exécution d’un événement PIX, sélectionnez l’événement dans la vue Timeline ou Range Details. Les informations de la vue Element Details incluent la liste de tous les blocages dans l’ordre où ils se sont produits. Par exemple, la figure 4 montre une instance d’un événement nommé UpdatePlayerArmor qui a subi huit blocages. Figure 4. Affichage des blocages d’un événement sélectionné. Capture d'écran montrant un événement sélectionné dans la vue Timeline et une liste de blocages dans le volet Element Details Les changements de contexte apparaissent aussi dans la vue Range Details. Pour afficher la liste de tous les changements de contexte d’une période, ouvrez le menu déroulant Items to show, puis sélectionnez Context switches. Pour exclure certains cœurs de la liste des changements de contexte, utilisez le panneau Selector situé à gauche de la vue (figure 5). Figure 5. Changements de contexte dans la vue Range Details. Capture d'écran montrant les détails des changements de contexte dans la vue Range Details

Analyser les blocages et les changements de contexte

La sélection d’un changement de contexte dans la vue Timeline ou Range Details renseigne la vue Element Details avec des informations sur ce changement de contexte. Element Details indique le cœur sur lequel le changement s’est produit, l’heure à laquelle il s’est produit, ainsi que les piles d’appels du thread qui s’exécutait avant le changement et du thread (le cas échéant) qui s’exécutait après. Les données d’affinité et de priorité de chaque thread sont aussi affichées. La figure 6 montre qu’un appel du thread AppMain d’un titre à l’API Win32 ReadFile a provoqué un changement de contexte. Après l’appel, AppMain est passé de l’état en cours d’exécution à l’état Idle. Figure 6. Détails d’un changement de contexte. Capture d'écran montrant les détails d'un changement de contexte Si un thread commence à s’exécuter en raison d’une action effectuée sur un autre thread, les informations du thread qui l’a rendu prêt sont affichées à la fois dans les vues Timeline et Element Details. Le changement de contexte de la figure 7 montre que le cœur 0 passe de l’état Idle à l’exécution du thread AppMain, et que AppMain a été rendu prêt par un thread nommé Worker. La vue Element Details inclut la pile d’appels du thread qui a rendu prêt, l’heure à laquelle il l’a fait et la raison. Dans la chronologie, une flèche relie le thread qui a rendu prêt (Worker) au thread maintenant en cours d’exécution (AppMain). Figure 7. Détails d’un thread qui rend prêt. Capture d'écran montrant des informations sur le thread qui rend prêt pour un changement de contexte Si un changement de contexte implique un processus autre que le titre, PIX affiche le nom et l’ID du processus dans Element Details. La figure 8, issue d’une capture de PIX sur Windows, montre que le cœur 0 est passé de l’exécution du processus devenv.exe, qui n’appartient pas au titre, à l’exécution d’un thread du titre nommé AP1. Dans ce cas, la raison de l’attente indique que ce changement s’est produit en raison du planificateur de threads du système d’exploitation. Figure 8. Détails d’un changement de contexte sortant d’un processus autre que le titre. Capture d'écran montrant un changement de contexte impliquant un autre processus Vous n’êtes pas limité à la sélection de changements de contexte individuels. Vous pouvez sélectionner un blocage entier pour accéder rapidement aux trois piles d’appels associées : la pile d’appels du changement sortant, celle du changement entrant et celle du thread qui a rendu prêt, le cas échéant. Ces piles d’appels sont affichées dans Element Details avec d’autres informations sur le blocage, notamment sa durée (figure 9). Figure 9. Détails d’un blocage sélectionné. Capture d'écran montrant des informations sur un blocage de thread sélectionné

Voir aussi

Timing Captures PIX
Dernière modification le 8 octobre 2026