Pregunta ¿Cómo sabe Windows si un programa no responde?


¿Cómo sabe Windows si un programa no responde? ¿Sigue sondeando constantemente todas las aplicaciones en ejecución?


171


origen


hurryupandwait.io/blog/detecting-a-hung-windows-process - magicandre1981
@ magicandre1981 Esa página propone una manera de verificar que un programa esté haciendo algo activamente, pero no es la forma en que Windows realmente lo usa. - Kevin Panko
Mira la cola de mensajes de Windows, un candidato es la función PeekMessage () - Luciano


Respuestas:


Una aplicación obtiene los eventos de una cola proporcionada por Windows.

Si la aplicación no sondea la secuencia de eventos durante un tiempo (5 segundos), por ejemplo, al hacer un cálculo largo, Windows asume que la aplicación está colgada y alerta al usuario.

Para evitar que las aplicaciones generen costosos cálculos en los subprocesos de trabajo o en el proceso de división, asegúrese de que la cola se sondee con regularidad.


149



↑ Esto. No tiene nada que ver con la programación o tal como se sugiere en la respuesta aceptada, solo si llama regularmente GetMessage (o similar) y DispatchMessage. - Damon
La respuesta aceptada, al referirse a IsHungAppWindow señala correctamente que un programa en la fase de inicio no tiene que llamar GetMessage. - MSalters
@MSalters Con inicio definido como el tiempo anterior al primero GetMessage? Esa característica permite que las aplicaciones simples de línea de comando funcionen sin que se las considere colgadas, ya que no necesitan sondear la cola. - ratchet freak
@ratchetfreak: Presumiblemente antes de la primera llamada CreateWindow. Las aplicaciones de línea de comandos son diferentes bestias en total; se ejecutan dentro de ConHost.EXE e interactúa con el sistema de interfaz gráfica de usuario de Windows para ellos. - MSalters
Además, me parece que en Windows 7 (y posiblemente antes) las ventanas notarán esto mucho antes si intentas y no manipulas la ventana de alguna manera. al igual que si un programa no procesa un mensaje de maximizar o mover, Windows 7 saltará a la derecha para no responder después de aproximadamente 1 o 2 segundos. - Dave Cousineau


¿Cómo sabe Windows si un programa no responde?

Sin el código fuente de Windows no podemos estar seguros de lo que está haciendo internamente.

Hay una función SDK de Windows IsHungAppWindow eso puede ser usado.

Se considera que una aplicación no responde si no está esperando la entrada, no está en proceso de inicio y no ha llamado PeekMessage dentro del período de tiempo de espera interno de 5 segundos.

Fuente Función IsHungAppWindow

Si una ventana de nivel superior deja de responder a los mensajes durante más de varios segundos, el sistema considera que la ventana no responde. En este caso, el sistema oculta la ventana y la reemplaza con una ventana fantasma que tiene el mismo orden Z, ubicación, tamaño y atributos visuales. Esto permite al usuario moverlo, cambiar su tamaño o incluso cerrar la aplicación. Sin embargo, estas son las únicas acciones disponibles porque la aplicación no responde.

Fuente Acerca de mensajes y colas de mensajes


¿Sigue sondeando constantemente todas las aplicaciones en ejecución?

No. Las aplicaciones no son sondeadas, pero se le da tiempo de procesador.

Windows tiene un sistema de programación que otorga tiempo de procesador a los hilos de la aplicación.

El algoritmo de programación es complejo y está completamente descrito en Windows Internals, Part 1 (6ª Edición) (Referencia del desarrollador).


78



El estado de suspensión no se basa en la CPU. La mayoría de los programas están "bloqueados" en ese sentido durante el 99.999% de las veces y no hacen nada. - usr
@usr ¿Dónde dije que "colgado" depende de la CPU? - DavidPostill♦
@usr La primera mitad de la respuesta es responder "¿Sigue sondeando constantemente todas las aplicaciones en ejecución?". La segunda mitad responde "¿Cómo sabe Windows si un programa no responde?". OP hizo dos preguntas en una; - DavidPostill♦
En realidad, no es una encuesta, ¿verdad? Supongo que las partes internas son más como un indicador de espera en la ventana que se señala cuando llamas PeekMessage. Entonces, cuando Windows envía un mensaje a la aplicación y no recibe una señal en cinco segundos, marca que la aplicación no responde. Y, de hecho, en Windows más reciente, la ventana solo está marcada como "no responde" si no responde. usuario entrada en el tiempo: hasta que intento hacer clic o presionar una tecla o algo, la aplicación puede mantenerse "colgada" durante minutos sin que "aparezca" sin respuesta. - Luaan
Puede eliminar todo lo anterior sobre "Acerca de los mensajes y las colas de mensajes", ya que no ayuda a la respuesta. Windows sabe que una aplicación ha dejado de responder porque deja de bombear mensajes. Sin embargo, la aplicación podría estar ejecutándose porque está haciendo algo de manera intensiva en lugar de transmitir mensajes (pero ese es un programa mal diseñado). - Andy


En realidad, Windows no siempre sabe que una aplicación no responde. La aplicación tiene que ser una aplicación interactiva con una ventana, y la ventana debe recibir mensajes que la aplicación no puede procesar antes de que Windows concluya que la aplicación no responde.

Por ejemplo, Windows no tiene forma de saber si una aplicación de procesamiento de números sin interfaz de usuario que se ejecuta desde la línea de comandos está haciendo lo suyo, o quizás está atrapada en un bucle infinito.

Las aplicaciones gráficas interactivas en Windows reciben eventos al sondear continuamente una cola de mensajes. Windows rellena esta cola de mensajes con eventos de teclado, mouse, temporizador, etc. Si una aplicación no puede sondear la cola de mensajes durante un tiempo (5 segundos es el tiempo de espera mencionado en la documentación de la función IsHungAppWindow ()), Windows considera que la aplicación está "colgada", lo que puede indicar cambiando el título de la ventana (agregando el texto " (No responde) "o texto equivalente en versiones localizadas) y sombrear los contenidos de la ventana si el usuario intenta interactuar con la ventana.

Las aplicaciones se pueden bloquear de forma que Windows no reconoce. Por ejemplo, una aplicación puede continuar sondeando mensajes en su cola de mensajes sin actuar adecuadamente sobre ellos, por lo que para todos los propósitos prácticos parece "bloqueado" sin que Windows reconozca que no responde.


32



No responder, por definición, significa no procesar los mensajes de la ventana, por lo que no se aplica a servicios o aplicaciones de consola, por lo que diría que Windows siempre sabe si una aplicación no responde. Estás confundiendo bloqueos muertos y no respondiendo. - Andy
Por supuesto, puede saber si un programa no responde. "No responder" no es lo mismo que "atrapado en un ciclo infinito" - BlueRaja - Danny Pflughoeft
En realidad, una aplicación puede recuperar mensajes a través de GetMessage () y no procesarlos, y Windows no lo reconocería como "no responde", a pesar de que aparentemente no respondería a su usuario. El término "no responde" también se usa a menudo para describir aplicaciones de red, servicio, línea de comando interactiva, etc. AFAIK no hay una definición formal que limite la frase a las aplicaciones con ventana. Tanto un punto muerto o un bucle infinito (o cualquier otro error de programación) pueden hacer que una aplicación deje de responder, pero no, no confundí causa y efecto. - Viktor Toth


Windows es un sistema operativo, supervisa todos los programas en ejecución.

Windows se comunica con las aplicaciones basadas en ventanas utilizando eventos. Cada programa tiene un hilo que constantemente escucha los eventos entrantes y los procesa. Por ejemplo, al hacer clic en un botón o en un icono del área de notificación, Windows genera un evento y lo envía al proceso correspondiente. El proceso puede decidir cómo manejarlo.

Todas las interacciones con los programas están basadas en eventos en Windows, por lo que cuando el programa no procesa los eventos entrantes por mucho tiempo, significa que no responde. Como @DavidPostill ha encontrado y observado en su respuesta, el tiempo de espera es de 5 segundos. PeekMessage es la función que obtiene un evento de la cola de eventos.


10





La respuesta a tu pregunta es sí / NO.

Si bien el sistema operativo Windows puede y realiza encuestas de aplicaciones con eventos en la cola de mensajes de Windows, los programas no tienen ninguna obligación de vincularse a WinAPI o manejar / contestar la cola de Windows. Incluso responder un mensaje en la cola no le dice a Windows si el programa se ha "bloqueado" o no. Es un indicador, pero eso es todo. La respuesta real es bastante más complicada.

La verdadera respuesta

La gente está cubriendo la respuesta real aquí. Determinar si un programa "no responde" es una variante del "detener el problema", que es formalmente indecidible en ciencias de la computación. La breve explicación es que el procesador no puede actuar como un tercero observándose a sí mismo para determinar si una subrutina está atascada en un bucle infinito, sin hacer nada frente a incrementar un contador que terminará de forma fija, número normal. Ambos pueden considerarse circuitos cerrados, uno se detiene y el otro nunca termina. Incluso usted, como persona, no sabe si un programa realmente está respondiendo o no, especialmente si está en un circuito cerrado, solo sabes si creo que debería (responder).

Desde la perspectiva de Windows, ambos de estos bucles son "no responde". Es por eso que Windows le da la opción de esperar o terminar porque no puede decir.

Entonces, el corolario es "¿por qué Windows sabe que un proceso es ¿Respondiendo? "La respuesta es bastante inteligente. Cuando un proceso se compila en un sistema operativo multiproceso y multiproceso, a veces incluso en bucles cerrados, el compilador puede agregar un rendimiento() comando, que proporciona una notificación conveniente al procesador que puede cambiar a otros procesos en ejecución. "Abandona" el procesador y se produce un "cambio de contexto" (como se le llama) que permite que el SO (Windows incluido) responda otros eventos en la pila, algunos de los cuales incluyen el seguimiento de que el proceso tiene respondido

** Esto no significa que un proceso de respuesta Terminar. ** Un proceso dentro de un ciclo infinito puede producir el procesador, lo que permite a Windows procesar otros eventos.

En algunos programas de Windows, el programa manejará las señales del sistema operativo Windows, que pueden decirle al sistema operativo que está "respondiendo", pero ningún programa está bajo ninguna obligación de hacerlo. Puede escribir programas muy simples de acaparamiento de CPU, no terminados, incluso dentro de lenguajes de nivel superior en Windows, como perl, php, python, y Windows puede no detectar que no está terminando y no responde. En ese punto, Windows depende de la heurística: carga de la CPU, memoria, cuántas interrupciones manejó el procesador mientras el programa se estaba ejecutando para "adivinar". Una vez más, en ese momento, Windows tiene que pedirle que finalice, porque realmente no sabe si debería terminar.

Ver también la respuesta (correcta) de Viktor. Ignore los comentarios sobre si "no responder" no es lo mismo que un ciclo infinito. Hay todo tipo de mensajes, interrupciones, bucles que una aplicación puede o no manejar sin informar a la cola de mensajes de Windows. La gestión de la cola de mensajes es solo uno de los muchos tipos de eventos en los que el sistema operativo mantiene los contadores para intentar adivinar si un proceso se cuelga


0