Comment Windows sait-il qu'un programme ne répond pas? T-il constamment interroger toutes les applications en cours d'exécution?
Comment Windows sait-il qu'un programme ne répond pas? T-il constamment interroger toutes les applications en cours d'exécution?
Réponses:
Une application obtient les événements d'une file d'attente fournie par Windows.
Si l'application n'interroge pas la file d'événements pendant un certain temps (5 secondes), par exemple lors d'un calcul long, Windows considère alors que l'application est bloquée et en avertit l'utilisateur.
Pour éviter cela, les applications devraient imposer des calculs coûteux aux threads de production ou diviser le traitement et s'assurer que la file d'attente est interrogée régulièrement.
GetMessage
(ou similaire) et DispatchMessage
.
IsHungAppWindow
correctement, indique qu’un programme en phase de démarrage n’a pas à appeler GetMessage
.
GetMessage
? Cette fonctionnalité permet aux applications simples en ligne de commande de fonctionner sans être considérées comme bloquées, car elles n'ont pas besoin d'interroger la file d'attente.
Sans le code source de Windows, nous ne pouvons pas être sûr de ce qu'il fait en interne.
Il existe une fonction Windows du SDK IsHungAppWindow
pouvant être utilisée.
Une application est considérée comme ne répondant pas si elle n’attend pas l’entrée, si elle n’est pas en cours de traitement et si PeekMessage n’a pas appelé PeekMessage dans le délai de temporisation interne de 5 secondes.
Fonction source IsHungAppWindow
Si une fenêtre de niveau supérieur cesse de répondre aux messages pendant plus de plusieurs secondes, le système considère que la fenêtre ne répond pas. Dans ce cas, le système masque la fenêtre et la remplace par une fenêtre fantôme présentant le même ordre Z, le même emplacement, la même taille et les mêmes attributs visuels. Cela permet à l'utilisateur de le déplacer, de le redimensionner ou même de fermer l'application. Cependant, ce sont les seules actions disponibles car l'application ne répond pas.
Source à propos des messages et des files de messages
Non, les applications ne sont pas interrogées, mais leur temps de traitement est long.
Windows dispose d'un système de planification qui alloue du temps processeur aux threads d'application.
L'algorithme de planification est complexe et est décrit en détail dans Windows Internals, Part 1 (6th Edition) (Référence du développeur) .
PeekMessage
. Ainsi, lorsque Windows envoie un message à l'application et ne reçoit pas de signal dans les cinq secondes, il marque l'application comme ne répondant pas. Et en fait, sur les fenêtres plus récentes, la fenêtre est seulement marquée "ne répond pas" si elle ne répond pas à la saisie de l' utilisateur à temps - jusqu'à ce que j'essaie de cliquer ou d'appuyer sur une touche ou quelque chose, l'application peut facilement rester "bloquée" pendant minutes sans "paraître" non réactif.
En réalité, Windows ne sait pas toujours qu'une application ne répond pas. L'application doit être une application interactive avec une fenêtre et la fenêtre doit recevoir des messages que l'application ne parvient pas à traiter, avant que Windows conclue que l'application ne répond pas.
Par exemple, Windows n'a aucun moyen de savoir si une application de traitement des chiffres sans interface utilisateur exécutée à partir de la ligne de commande fait son travail, ou peut-être bloquée dans une boucle infinie.
Les applications graphiques interactives sous Windows reçoivent les événements en interrogeant en permanence une file de messages. Windows remplit cette file de messages avec des événements de type clavier, souris, minuterie, etc. Si une application ne parvient pas à interroger la file de messages pendant un certain temps (5 secondes correspond au délai mentionné dans la documentation de la fonction IsHungAppWindow ()), Windows considère l'application "bloquée", ce qu'elle peut indiquer en modifiant le titre de la fenêtre (ajout du texte " (Ne répond pas) "ou un texte équivalent dans les versions localisées) et grise le contenu de la fenêtre si l'utilisateur tente d'interagir avec la fenêtre.
Les applications peuvent se bloquer d'une manière non reconnue par Windows. Par exemple, une application peut continuer à interroger des messages dans sa file d'attente sans y donner suite correctement. Ainsi, à toutes fins pratiques, elle semblerait "bloquée" sans que Windows se rende compte qu'elle ne répond pas.
Windows est un système d'exploitation, il supervise tous les programmes en cours d'exécution.
Windows communique avec des applications basées sur une fenêtre à l'aide d'événements. Chaque programme a un fil qui écoute en permanence les événements entrants et les traite. Par exemple, lorsque vous cliquez sur un bouton ou une icône de zone de notification, Windows génère un événement et le transmet au processus approprié. Le processus peut alors décider comment le gérer.
Toutes les interactions avec les programmes sont basées sur des événements dans Windows. Par conséquent, si le programme ne traite pas les événements entrants trop longtemps, cela signifie qu'il ne répond pas. Comme @DavidPostill a constaté et noté dans sa réponse , le délai d'attente est de 5 secondes. PeekMessage
est la fonction qui obtient un événement de la file d'attente d'événements.
La réponse à votre question est oui / non.
Alors que le système d’exploitation Windows peut et doit interroger des applications avec des événements dans la file d’attente Windows, les programmes n’ont absolument aucune obligation de se lier à WinAPI ou de gérer / répondre à la file d’attente Windows. Même répondre à un message dans la file d'attente n'indique pas à Windows si le programme est "bloqué" ou non. C'est un indicateur, mais c'est tout. La vraie réponse est un peu plus compliquée.
La vraie réponse
Les gens se concentrent sur la réponse réelle ici. Déterminer si un programme "ne répond pas" est une variante du " problème stoppant ", qui est formellement indécidable en informatique. En résumé, le processeur ne peut pas agir en tant que tiers s’observant lui-même pour déterminer si un sous-programme est bloqué dans une boucle infinie, sans rien faire ni incrémenter un compteur qui se terminera à un certain nombre fixe et normal. Ces deux peuvent être considérés comme des boucles étroitement fermées. L'un s'arrête, l'autre ne se terminera jamais. Même vous, en tant que personne, ne savez pas si un programme réagit réellement ou non, surtout s'il est dans une boucle bien fermée - vous savez seulement si pensez-le qu'il devrait (répondre).
Du point de vue de Windows, ces deux boucles "ne répondent pas" . C'est pourquoi Windows vous donne le choix d'attendre ou de terminer, car elle ne peut pas dire.
Ainsi , le corollaire est « pourquoi ne fenêtres savent qu'un processus est répond? » La réponse est plutôt intelligente. Lorsqu'un processus est compilé dans un système d'exploitation multi-thread et multi-processus, parfois même dans des boucles étroitement fermées, le compilateur peut ajouter une commande yield () , qui indique au processeur qu'il peut basculer vers d'autres processus en cours d'exécution. . Il « donne » le processeur et un « changement de contexte » (comme on l'appelle) arrive qui permet au système d' exploitation (Windows inclus) pour répondre à d' autres événements dans la pile, dont certaines comprennent le suivi que le processus a réagi.
** Cela ne signifie pas qu'un processus de réponse va se terminer . ** Un processus à l'intérieur d'une boucle infinie peut produire le processeur, permettant à Windows de traiter d'autres événements.
Dans certains programmes Windows, le programme gère les signaux du système d'exploitation Windows, ce qui peut indiquer au système d'exploitation qu'il "répond", mais aucun programme n'est obligé de le faire. Vous pouvez écrire des programmes très simples, monopolisant le processeur et ne se terminant pas dans les langages de niveau supérieur de Windows tels que perl, php, python et Windows, peuvent ne pas détecter qu'il ne se termine pas et ne répond pas. À ce stade, Windows dépend d'heuristiques - charge du processeur, mémoire, nombre d'interruptions traitées par le processeur pendant l'exécution du programme pour "deviner". Encore une fois, à ce stade, Windows doit vous demander de mettre fin à la procédure, car il ne sait vraiment pas s’il le faut.
Voir aussi la réponse (correcte) de Viktor. Ignorez les commentaires indiquant si "ne pas répondre" n'est pas la même chose qu'une boucle infinie. Il existe toutes sortes de messages, interruptions, boucles qu'une application peut gérer ou non sans informer la file de messages Windows. La gestion de la file de messages n’est qu’un des nombreux types d’événements sur lesquels le système d’exploitation conserve les compteurs pour essayer de deviner si un processus est suspendu.