Questão Como o Windows sabe se um programa não está respondendo?


Como o Windows sabe se um programa não está respondendo? Ele continua constantemente pesquisando todos os aplicativos em execução?


171


origem


hurryupandwait.io/blog/detecting-a-hung-windows-process - magicandre1981
@ magicandre1981 Essa página propõe uma maneira de verificar se um programa está ativamente fazendo alguma coisa, mas não é a maneira que o Windows realmente usa. - Kevin Panko
Olhe para a fila de mensagens do Windows, um candidato é a função PeekMessage () - Luciano


Respostas:


Um aplicativo obtém os eventos de uma fila fornecida pelo Windows.

Se o aplicativo não pesquisar o eventqueue por um tempo (5 segundos), por exemplo, ao fazer um cálculo longo, o Windows presumirá que o aplicativo está interrompido e alerta o usuário.

Para evitar que os aplicativos enviem cálculos dispendiosos para segmentos de trabalho ou divida o processamento e verifique se a fila é pesquisada regularmente.


149



↑ Isso. Nada a ver com agendamento ou tal como sugerido na resposta aceita, somente se você chama regularmente GetMessage (ou afins) e DispatchMessage. - Damon
A resposta aceita, referindo-se a IsHungAppWindow corretamente observa que um programa na fase de inicialização não tem que chamar GetMessage. - MSalters
@MSalters Com a inicialização sendo definida como a hora anterior à primeira GetMessage? Esse recurso permite que aplicativos de linha de comando simples funcionem sem serem considerados suspensos, já que não precisam pesquisar a fila. - ratchet freak
@ratchetfreak: Presumivelmente antes da primeira chamada CreateWindow. Aplicativos de linha de comando são animais completamente diferentes; eles estão sendo executados dentro do ConHost.EXE e interagem com o susbystem da GUI do Windows para eles. - MSalters
Além disso, parece-me que no Windows 7 (e possivelmente anterior) que o Windows irá notar isso muito mais cedo se você tentar e não conseguir manipular a janela de alguma forma. como se um programa não processasse uma mensagem maximizar ou mover, o windows 7 passaria direto para não responder após cerca de 1 ou 2 segundos. - Dave Cousineau


Como o Windows sabe se um programa não está respondendo?

Sem o código-fonte para o Windows, não podemos ter certeza do que está fazendo internamente.

Existe uma função do SDK Windows IsHungAppWindow que pode ser usado.

Considera-se que uma aplicação não está respondendo se não está esperando pela entrada, não está no processo de inicialização e não chamou PeekMessage dentro do período de tempo limite interno de 5 segundos.

Fonte Função IsHungAppWindow

Se uma janela de nível superior parar de responder a mensagens por mais de alguns segundos, o sistema considerará que a janela não está respondendo. Nesse caso, o sistema oculta a janela e a substitui por uma janela fantasma com a mesma ordem Z, localização, tamanho e atributos visuais. Isso permite ao usuário movê-lo, redimensioná-lo ou até mesmo fechar o aplicativo. No entanto, essas são as únicas ações disponíveis porque o aplicativo não está respondendo.

Fonte Sobre mensagens e filas de mensagens


Ele continua constantemente pesquisando todos os aplicativos em execução?

Não. Os pedidos não são pesquisados, mas recebem o tempo do processador.

O Windows possui um sistema de agendamento que dá tempo ao processador para encadeamentos de aplicativos.

O algoritmo de escalonamento é complexo e é totalmente descrito em Internos do Windows, Parte 1 (6ª Edição) (Referência do Desenvolvedor).


78



O estado de interrupção não é baseado na CPU. A maioria dos programas é "suspensa" nesse sentido por 99,999% do tempo e não faz nada. - usr
@usr Onde eu disse que "pendurado" depende da CPU? - DavidPostill♦
@usr A primeira metade da resposta está respondendo: "Ela continua repetindo constantemente todas as aplicações em execução?". A segunda metade está respondendo "Como o Windows sabe se um programa não está respondendo ?. ​​O OP fez duas perguntas em uma;) - DavidPostill♦
Não é realmente polling, porém, é? Eu presumo que os internos são mais como um identificador de espera na janela é sinalizado quando você chama PeekMessage. Assim, quando o Windows envia uma mensagem para o aplicativo e não é sinalizado dentro de cinco segundos, ele marca o aplicativo como não respondendo. E, de fato, no Windows mais recente, a janela só é marcada como "não respondendo" se não responder a do utilizador entrada no tempo - até que eu tente clicar ou pressionar uma tecla ou algo assim, o aplicativo pode ficar facilmente "suspenso" por alguns minutos sem "aparecer" sem resposta. - Luaan
Você pode excluir tudo acima de "Sobre Mensagens e Filas de Mensagens", pois isso não ajuda na resposta. O Windows sabe que um aplicativo parou de responder porque parou de enviar mensagens. O aplicativo pode estar rodando enquanto está fazendo algo intensivo ao invés de enviar mensagens (mas isso é um programa mal projetado). - Andy


Na verdade, o Windows nem sempre sabe que um aplicativo não está respondendo. O aplicativo deve ser um aplicativo interativo com uma janela, e a janela deve estar recebendo mensagens que o aplicativo não consegue processar, antes que o Windows conclua que o aplicativo não está respondendo.

Por exemplo, o Windows não tem como saber se um aplicativo de processamento de números sem interface de usuário executada a partir da linha de comando está funcionando ou talvez preso em um loop infinito.

Aplicativos gráficos interativos no Windows recebem eventos continuamente pesquisando uma fila de mensagens. O Windows preenche essa fila de mensagens com eventos de teclado, mouse, timer etc. Se um aplicativo não pesquisar a fila de mensagens por algum tempo (5 segundos é o tempo limite mencionado na documentação da função IsHungAppWindow ()), o Windows considera o aplicativo "interrompido", o que pode indicar alterando o título da janela (adicionando o texto " (Não está respondendo) "ou texto equivalente em versões localizadas) e aclarando o conteúdo da janela se o usuário tentar interagir com a janela.

Os aplicativos podem travar de maneiras que o Windows não reconhece. Por exemplo, um aplicativo pode continuar pesquisando mensagens em sua fila de mensagens sem agir apropriadamente sobre elas, portanto, para todos os fins e propósitos práticos, elas pareceriam "interrompidas" sem o Windows reconhecer que não é responsivo.


32



Não responder, por definição, significa não processar mensagens de janela, portanto, não se aplica a serviços ou aplicativos de console, e por isso eu diria que o Windows sempre sabe se um aplicativo não está respondendo. Você está confundindo bloqueios mortos e não está respondendo. - Andy
Claro que pode saber se um programa não está respondendo. "Não responde" não é o mesmo que "preso em um loop infinito" - BlueRaja - Danny Pflughoeft
Na verdade, um aplicativo pode recuperar mensagens via GetMessage () e não processá-las, e não seria reconhecido como "não respondendo" pelo Windows, apesar do fato de que certamente pareceria não responder ao seu usuário. O termo "não respondendo" também é freqüentemente usado para descrever aplicativos de rede, serviço, linha de comando interativa, etc. AFAIK não existe uma definição formal que limite a frase a aplicativos em janelas. Um deadlock ou um loop infinito (ou qualquer outro erro de programação) pode fazer com que um aplicativo não responda, mas não, eu não confundi causa e efeito. - Viktor Toth


O Windows é um sistema operacional, está supervisionando todos os programas em execução.

O Windows se comunica com aplicativos baseados em janelas usando eventos. Todo programa tem um thread que constantemente escuta eventos de entrada e os processa. Por exemplo, quando você clica em um botão ou em um ícone da área de notificação, o Windows gera um evento e o alimenta no processo apropriado. O processo pode então decidir como lidar com isso.

Todas as interações com programas são baseadas em eventos no Windows, portanto, quando o programa não processa eventos recebidos por muito tempo, isso significa que ele não responde. Como @DavidPostill encontrou e anotou em sua resposta, o tempo limite é de 5 segundos. PeekMessage é a função que obtém um evento da fila de eventos.


10





A resposta para sua pergunta é sim / não.

Embora o sistema operacional Windows possa e faça poll de aplicativos com eventos na Fila do Windows Messaging, os programas não têm absolutamente nenhuma obrigação de vincular-se ao WinAPI ou de manipular / responder a Fila do Windows. Mesmo responder a uma mensagem na fila não informa ao Windows se o programa foi "bloqueado" ou não. É um indicador, mas é tudo o que é. A resposta real é um pouco mais complicada.

A verdadeira resposta

As pessoas estão cercando a verdadeira resposta aqui. Determinar se um programa "não está respondendo" é uma variante do "problema de parada", que é formalmente indecidível em ciência da computação. A breve explicação é que o processador não pode atuar como um terceiro observando para determinar se uma sub-rotina está presa em um loop infinito, não fazendo nada contra incrementar um contador que terminará em algum fixo, Ambos podem ser considerados como loops bem fechados, um pára, o outro nunca termina, mesmo você, como pessoa, não sabe se um programa está realmente respondendo ou não, especialmente se está em um laço bem fechado - você só sabe se acho que deveria (responder).

Do ponto de vista do Windows, esses dois loops são "não está respondendo". É por isso que o Windows lhe dá a opção de esperar ou encerrar, porque não pode dizer.

Portanto, o corolário é "por que o Windows sabe que um processo é respondendo? "A resposta é bastante inteligente. Quando um processo é compilado em um SO multi-threaded e multi-process, às vezes até em loops bem fechados, o compilador pode adicionar um produção() comando, que fornece uma notificação conveniente para o processador que pode alternar para outros processos em execução. Ele "desiste" do processador e um "switch de contexto" (como é chamado) acontece e permite que o SO (Windows incluído) responda a outros eventos na pilha, alguns dos quais incluem o rastreamento do processo. tem respondeu.

** Isso não significa que um processo de resposta terminar. ** Um processo dentro de um loop infinito pode render o processador, permitindo que o Windows processe outros eventos.

Em alguns programas do Windows, o programa lidará com os sinais do sistema operacional Windows, que pode dizer ao sistema operacional que está "respondendo", mas nenhum programa tem qualquer obrigação de fazê-lo. Você pode escrever programas simples e sem terminação de CPU, mesmo dentro de linguagens de alto nível no Windows, como perl, php, python, e o Windows pode não detectar que não está encerrando e não está respondendo. Nesse ponto, o Windows depende de heurísticas - carga da CPU, memória, quantas interrupções o processador processou enquanto o programa estava sendo executado para "adivinhar". Novamente, nesse ponto, o Windows tem que pedir para você terminar, porque ele realmente não sabe se deveria.

Veja também a resposta (correta) de Viktor. Ignore os comentários sobre se "não responder" não é o mesmo que um loop infinito. Existem todos os tipos de mensagens, interrupções, loops que um aplicativo pode ou não manipular sem informar a fila de mensagens do Windows. Manipular a fila de mensagens é apenas um dos muitos tipos de eventos que o SO mantém em contadores para tentar acho se um processo está suspenso.


0