Question Comment Windows sait-il si un programme ne répond pas?


Comment Windows sait-il si un programme ne répond pas? Est-ce qu'il continue à interroger toutes les applications en cours d'exécution?


171
2017-08-24 07:33


origine


hurryupandwait.io/blog/detecting-a-hung-windows-process - magicandre1981
@ magicandre1981 Cette page propose une façon de vérifier qu'un programme est en train de faire quelque chose, mais ce n'est pas la manière dont Windows utilise réellement. - Kevin Panko
Regardez la file d'attente des messages Windows, un candidat est la fonction PeekMessage () - Luciano


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'attente pendant un certain temps (5 secondes), par exemple lors d'un long calcul, Windows suppose que l'application est bloquée et alerte l'utilisateur.

Pour éviter cela, les applications doivent pousser les calculs coûteux vers les threads de travail ou diviser le traitement et s'assurer que la file d'attente est régulièrement interrogée.


149
2017-08-24 10:09



↑ Ceci Rien à voir avec la planification ou tel que suggéré dans la réponse acceptée, seulement si vous appelez régulièrement GetMessage (ou similaire) et DispatchMessage. - Damon
La réponse acceptée, en se référant à IsHungAppWindow note correctement qu'un programme dans la phase de démarrage ne doit pas appeler GetMessage. - MSalters
@MSalters Avec le démarrage étant défini comme le temps avant le premier GetMessage? Cette fonctionnalité permet aux applications en ligne de commande simples de fonctionner sans être considérée comme bloquée car elles n'ont pas besoin d'interroger la file d'attente. - ratchet freak
@ratchetfreak: Vraisemblablement avant le premier appel CreateWindow. Les applications en ligne de commande sont des bêtes complètement différentes; Ils s'exécutent dans ConHost.EXE et interagissent avec le système Windows de l'interface graphique pour eux. - MSalters
de plus, il me semble que dans Windows 7 (et peut-être même avant), Windows le remarquera beaucoup plus tôt si vous essayez de ne pas manipuler la fenêtre d’une manière ou d’une autre. Par exemple, si un programme ne traite pas un message d'agrandissement ou de déplacement, Windows 7 sautera immédiatement sur le fait de ne pas répondre après environ 1 ou 2 secondes. - Dave Cousineau


Comment Windows sait-il si un programme ne répond pas?

Sans le code source de Windows, nous ne pouvons pas être sûrs de ce qu’il fait en interne.

Il y a une fonction Windows SDK IsHungAppWindow qui peut être utilisé.

Une application est considérée comme ne répondant pas si elle n’attend pas d’entrée, n’est pas en traitement de démarrage et n’a pas appelé PeekMessage dans le délai d'expiration interne de 5 secondes.

La source Fonction IsHungAppWindow

Si une fenêtre de niveau supérieur cesse de répondre aux messages pendant 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 ayant le même ordre, emplacement, taille et attributs visuels. Cela permet à l'utilisateur de le déplacer, de le redimensionner ou même de le fermer. Cependant, ce sont les seules actions disponibles car l'application ne répond pas réellement.

La source À propos des messages et des files d'attente de messages


Est-ce qu'il continue à interroger toutes les applications en cours d'exécution?

Non. Les applications ne sont pas interrogées mais disposent du temps processeur.

Windows dispose d'un système de planification qui donne du temps processeur aux threads d'application.

L’algorithme de programmation est complexe et est entièrement décrit dans Windows Internals, Part 1 (6th Edition) (Référence du développeur).


78
2017-08-24 08:48



L'état de blocage n'est pas basé sur le processeur. La plupart des programmes sont "suspendus" dans ce sens pendant 99,999% du temps et ne font rien. - usr
@usr Où ai-je dit que "hung" dépend du CPU? - DavidPostill♦
@usr La première partie de la réponse répond "continue-t-il à interroger toutes les applications en cours d'exécution?". La seconde partie répond "Comment Windows sait-il si un programme ne répond pas? Le PO a posé deux questions en un;) - DavidPostill♦
Ce n'est pas vraiment un sondage, n'est-ce pas? Je suppose que les éléments internes ressemblent plus à une poignée d’attente sur la fenêtre que lorsque vous appelez PeekMessage. Ainsi, lorsque Windows envoie un message à l'application et n'est pas signalé dans les cinq secondes, il marque l'application comme ne répondant pas. Et en fait, sur Windows plus récent, la fenêtre est marquée "ne répond pas" si elle ne répond pas utilisateur entrée dans le temps - jusqu'à ce que j'essaye de cliquer ou d'appuyer sur une touche ou quelque chose, l'application peut facilement rester "accroché" pendant des minutes sans "sembler" non-réactif. - Luaan
Vous pouvez supprimer tout ce qui précède "À propos des messages et des files d'attente de messages", car cela n'aide pas la réponse. Windows sait qu'une application a cessé de répondre car elle arrête de pomper des messages. L'application pourrait être en cours d'exécution car elle fait quelque chose de intense au lieu de pomper des messages (mais c'est un programme mal conçu). - Andy


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 ne conclue que l'application ne répond pas.

Par exemple, Windows n’a aucun moyen de savoir si une application de traitement des calculs sans interface utilisateur exécutée à partir de la ligne de commande fait son travail, ou peut-être si elle est bloquée dans une boucle infinie.

Les applications graphiques interactives dans Windows reçoivent des événements en interrogeant en permanence une file d'attente de messages. Windows remplit cette file d'attente de messages avec des événements clavier, souris, minuterie, etc. Si une application ne parvient pas à interroger la file d'attente pendant un certain temps (5 secondes est le délai mentionné dans la documentation de la fonction IsHungAppWindow ()), Windows considère que l'application est bloquée, ce qu'elle peut indiquer en modifiant le titre de la fenêtre (ajout du texte) (Pas de réponse) "ou texte équivalent dans les versions localisées) et en grisant le contenu de la fenêtre si l'utilisateur essaie d'interagir avec la fenêtre.

Les applications peuvent se bloquer d'une manière que Windows ne reconnaît pas. Par exemple, une application peut continuer à rechercher des messages dans sa file d'attente de messages sans agir correctement, de sorte que, pour toutes les fins pratiques, elle semblerait "bloquée" sans que Windows reconnaisse qu'elle ne répond pas.


32
2017-08-24 11:12



Ne pas répondre, par définition, signifie ne pas traiter les messages de fenêtre. Par conséquent, cela ne s'applique pas aux services ou aux applications de la console. Je dirais donc que Windows sait toujours si une application ne répond pas. Vous êtes confus et vous ne répondez pas. - Andy
Bien sûr, il peut savoir si un programme ne répond pas. "Ne pas répondre" n'est pas la même chose que "coincé dans une boucle infinie" - BlueRaja - Danny Pflughoeft
En fait, une application peut récupérer des messages via GetMessage () et ne les traite pas, et elle ne serait pas reconnue comme "ne répondant pas" par Windows, même si elle semble ne pas répondre à son utilisateur. Le terme "ne pas répondre" est également souvent utilisé pour décrire des applications réseau, service, ligne de commande interactive, etc. AFAIK il n'y a pas de définition formelle qui limite la phrase aux applications fenêtrées. Un blocage ou une boucle infinie (ou toute autre erreur de programmation) peut entraîner une non-réponse de l'application, mais non, je n'ai pas confondu cause et effet. - Viktor Toth


Windows est un système d'exploitation, il supervise tous les programmes en cours d'exécution.

Windows communique avec les applications basées sur des fenêtres utilisant des événements. Chaque programme a un thread qui écoute en permanence les événements entrants et les traite. Par exemple, lorsque vous cliquez sur un bouton ou sur une icône de zone de notification, Windows génère un événement et l'insère dans le 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 sous Windows. Par conséquent, lorsque le programme ne traite pas les événements entrants trop longtemps, cela signifie qu'il ne répond pas. Comme @DavidPostill a trouvé 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 des événements.


10
2017-08-24 09:00





La réponse à votre question est oui / non.

Bien que le système d'exploitation Windows puisse interroger les applications avec des événements dans la file d'attente Windows Messaging, les programmes n'ont absolument aucune obligation de créer un lien vers WinAPI ou de gérer / répondre à la file d'attente Windows. Même répondre à un message dans la file d'attente ne dit pas à Windows si le programme est "verrouillé" 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 d'arrêt", ce qui est formellement indécidable en informatique. La brève explication est que le processeur ne peut pas agir en tant que tiers observant lui-même pour déterminer si un sous-programme est bloqué dans une boucle infinie, ne rien faire ou incrémenter un compteur qui se terminera nombre normal.Ceux-ci peuvent être considérés comme des boucles étroitement fermées: l’une s’arrête, l’autre ne se terminera jamais.Même vous, en tant que personne, vous ne savez pas si un programme répond réellement ou non, surtout s'il se trouve dans un boucle étroitement fermée - vous savez seulement si pense qu'il devrait (répondre).

Du point de vue de Windows, ces deux boucles sont "ne répond pas". C'est pourquoi windows vous donne le choix d'attendre ou de terminer, car il ne sait pas.

Le corollaire est donc "pourquoi Windows sait-il qu'un processus est répondre? "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 très fermées, le compilateur peut ajouter un rendement() commande, qui fournit au processeur une notification pratique indiquant qu'il peut basculer vers d'autres processus en cours d'exécution. Il "abandonne" le processeur et un "changement de contexte" (comme on l'appelle) se produit qui permet au système d'exploitation (Windows inclus) de répondre à d'autres événements de la pile, dont certains incluent le suivi du processus. a a répondu.

** Cela ne signifie pas qu'un processus de réponse mettre fin. ** Un processus dans une boucle infinie peut générer 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 assez simples, sans terminaison de processeur, même dans des langages de niveau supérieur sur 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 des heuristiques - charge du processeur, mémoire, nombre d'interruptions gérées par le processeur pendant l'exécution du programme pour «deviner». Encore une fois, à ce stade, Windows doit vous demander de mettre fin à vos services, car il ne sait vraiment pas si

Voir aussi la réponse (correcte) de Viktor. Ignorer les commentaires sur le fait que "ne pas répondre" n'est pas la même chose qu'une boucle infinie. Il existe toutes sortes de messages, d'interruptions, de boucles qu'une application peut ou non gérer sans en informer la file d'attente des messages Windows. La gestion de la file d'attente de messages est l'un des nombreux types d'événements sur lesquels le système d'exploitation garde les compteurs deviner si un processus est suspendu


0
2018-03-14 02:57