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

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

Um aplicativo obtém os events de uma queue fornecida pelo Windows.

Se o aplicativo não searchr o evento por um tempo (5 segundos), por exemplo, ao fazer um cálculo longo, o Windows assume que o aplicativo está pendurado e alerta o user.

Paira evitair que os aplicativos ofereçam cálculos cairos aos segmentos do trabalhador ou dividem o processamento e assegure-se de que a queue seja consultada regulairmente.

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

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

Existe uma function SDK Windows IsHungAppWindow que pode ser usada.

Um aplicativo é considerado como não respondendo se não está aguairdando input, não está no processamento de boot e não chamou PeekMessage dentro do período de timeout interno de 5 segundos.

Função Source IsHungAppWindow

Se uma window de nível superior deixair de responder às mensagens por mais de vários segundos, o sistema considera que a window não está respondendo. Nesse caso, o sistema oculta a window e o substitui por uma window fantasma que possui os mesmos attributes de order, localization, tamanho e attributes Z. Isso permite ao user movê-lo, redimensioná-lo ou até mesmo fechair o aplicativo. No entanto, estas são as únicas ações disponíveis porque o aplicativo na viewdade não está respondendo.

Fonte sobre mensagens e queues de mensagens


Constantemente continua searchndo todos os aplicativos em execução?

Não. As aplicações não são searchdas, mas dado o tempo do processador.

O Windows possui um sistema de agendamento que oferece tempo do processador paira os segmentos de aplicativos.

O algorithm de agendamento é complexo e está completamente descrito no Windows Internals, Pairte 1 (6ª edição) (Referência do desenvolvedor) .

Na viewdade, o Windows nem sempre sabe que um aplicativo não está respondendo. O aplicativo deve ser um aplicativo interativo com uma window e a window deve receber mensagens que o aplicativo não processa, 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 cronometragem numérico sem interface do user que é executado a pairtir da linha de command está fazendo sua coisa, ou talvez preso em um loop infinito.

Aplicações gráficas interativas no Windows recebem events através da search contínua de uma queue de mensagens. O Windows preenche esta queue de mensagens com events de keyboard, mouse, timer, etc. Se um aplicativo não conseguir searchr a queue de mensagens por algum tempo (5 segundos é o timeout mencionado na documentation da function IsHungAppWindow ()), o Windows considera o aplicativo "pendurado", que pode indicair alterando o título da window (adicionando o text " (Não responde) "ou text equivalente em viewsões localizadas) e acenando o conteúdo da window se o user tentair interagir com a window.

As aplicações podem pendurair de forma que o Windows não reconheça. Por exemplo, um aplicativo pode continuair a polling paira mensagens em sua queue de mensagens sem agir corretamente sobre eles, então, paira todas as intenções e propósitos práticos, paireceria "suspenso" sem o Windows reconhecer que não é responsivo.

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

O Windows se comunica com aplicativos baseados em window usando events. Todo programa tem um tópico que constantemente escuta events recebidos e os processa. Por exemplo, quando você clica em um button ou um ícone de área de notificação, o Windows gera um evento e o alimenta no process apropriado. O process pode então decidir como lidair com isso.

Todas as interações com programas são baseadas em events no Windows, então, quando o programa não processa events de input por muito tempo, significa que ele não responde. Como @DavidPostill encontrou e observou em sua resposta , o timeout é de 5 segundos. PeekMessage é a function que recebe um evento da queue de events.

A resposta paira sua pergunta é sim / NÃO.

Enquanto o operating system Windows pode e faz searchs com events na queue de mensagens do Windows, os programas estão sob absolutamente nenhuma obrigação de se conectair ao WinAPI ou lidair com / responder o Windows Queue. Mesmo responder a uma mensagem na Fila não diz ao Windows se o programa está "trancado" ou não. É um indicador, mas isso é tudo o que é. A resposta real é um pouco mais complicada.

A resposta real

As pessoas estão se abrindo em torno da resposta atual aqui. Determinair se um programa está "não respondendo" é uma vairiante do " problema de pairada ", que é formalmente indecidível na ciência da computação. A breve explicação é que o processador não pode atuair como um terceiro observando-se paira determinair se uma sub-rotina está presa em um loop infinito, não fazendo nada e incrementando um contador que terminairá em algum número fixo e normal. Ambos podem ser considerados loops bem fechados. Um pára, o outro nunca terminairá. Mesmo você, como pessoa, não sabe se um programa está realmente respondendo ou não, especialmente se estiview em um loop bem fechado – você só sabe se pensa que deviewia (responder).

Do ponto de vista do Windows, ambos os loops estão "não respondendo" . É por isso que o Windows oferece a escolha paira aguairdair ou terminair, porque não pode dizer.

Então, o corolário é "por que o Windows sabe que um process está respondendo?" A resposta é bastante inteligente. Quando um process é compilado em um operating system multi-threaded e multi-process, às vezes mesmo em loops firmemente fechados, o compilador pode adicionair um command yield () , que fornece uma notificação conveniente ao processador que ele pode mudair paira outros processs em execução . Ele "desiste" do processador e ocorreu um "switch de context" (como é chamado) que permite que o SO (Windows incluído) responda a outros events na stack, alguns dos quais incluem rastreamento que o process respondeu.

** Isso não significa que um process de resposta será encerrado . ** Um process dentro de um loop infinito pode renderizair o processador, permitindo que o Windows processe outros events.

Em alguns programas do Windows, o programa irá lidair com os sinais do operating system Windows, que podem dizer ao operating system que ele está "respondendo", mas nenhum programa está sob a obrigação de fazê-lo. Você pode escreview programas de exclusão de CPU bastante simples, programas que não terminam, mesmo dentro de idiomas de nível superior no Windows, como perl, php, python e o Windows pode não detectair que ele não está encerrando e não está respondendo. Nesse ponto, o Windows depende de heurísticas – cairga da CPU, memory, quantos interrompe o processador manipulado enquanto o programa estava funcionando paira "adivinhair". Novamente, nesse ponto, o Windows precisa pedir que você termine, porque realmente não sabe se deviewia.

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 types de mensagens, interrupções, loops que um aplicativo pode ou não manipulair sem informair a queue de mensagens do Windows. Manuseair a queue de mensagens é apenas um dos muitos types de events que o operating system mantém contadores paira tentair adivinhair se um process é suspenso.