Вопрос Как Windows знает, не отвечает ли программа?


Как Windows знает, не отвечает ли программа? Постоянно ли он отслеживает все запущенные приложения?


171
2017-08-24 07:33


происхождения


hurryupandwait.io/blog/detecting-a-hung-windows-process - magicandre1981
@ magicandre1981 Эта страница предлагает один из способов проверить, что программа активно что-то делает, но это не тот способ, который использует Windows. - Kevin Panko
Посмотрите на очередь сообщений Windows, кандидатом является функция PeekMessage () - Luciano


ответы:


Приложение получает события из очереди, предоставляемой Windows.

Если приложение не проводит опрос eventqueue какое-то время (5 секунд), например, при длительном вычислении, тогда Windows предполагает, что приложение зависает и предупреждает пользователя.

Чтобы избежать того, что приложения должны подталкивать дорогостоящие вычисления к рабочим потокам или разделить обработку и следить за тем, чтобы очередь регулярно проверялась.


149
2017-08-24 10:09



↑ Это. Не имеет никакого отношения к планированию или предложению в принятом ответе, только если вы регулярно звоните GetMessage (или тому подобное) и DispatchMessage, - Damon
Принятый ответ, ссылаясь на IsHungAppWindow правильно отмечает, что программе на этапе запуска не нужно звонить GetMessage, - MSalters
@MSalters С запуском определяется как время до первого GetMessage? Эта функция позволяет простыми приложениями командной строки работать, не считая зависанием, так как они не требуют опроса очереди. - ratchet freak
@ratchetfreak: Предположительно перед первым вызовом CreateWindow. Приложения в командной строке - это разные животные; они работают внутри ConHost.EXE, и они взаимодействуют с системой Windows GUI susbystem для них. - MSalters
также, мне кажется, что в Windows 7 (и, возможно, раньше) эти окна заметят гораздо раньше, если вы попытаетесь каким-то образом не обработать окно. например, если программа не обрабатывает максимизацию или перемещение сообщения, окна 7 будут прыгать вправо, чтобы не отвечать после примерно 1 или 2 секунд. - Dave Cousineau


Как Windows знает, не отвечает ли программа?

Без исходного кода для Windows мы не можем быть уверены, что он делает внутренне.

Существует функция SDK Windows IsHungAppWindow которые могут быть использованы.

Приложение считается не отвечающим, если оно не ждет ввода, не находится в обработке при запуске и не вызвало PeekMessage в течение внутреннего тайм-аута 5 секунд.

Источник Функция IsHungAppWindow

Если окно верхнего уровня перестает отвечать на сообщения более нескольких секунд, система считает, что окно не отвечает. В этом случае система скрывает окно и заменяет его призрачным окном, которое имеет одинаковые Z-порядок, местоположение, размер и визуальные атрибуты. Это позволяет пользователю перемещать его, изменять его размер или даже закрывать приложение. Однако это единственные доступные действия, потому что приложение на самом деле не отвечает.

Источник О сообщениях и очередях сообщений


Постоянно ли он отслеживает все запущенные приложения?

Нет. Приложения не опрошены, а заданы время процессора.

Windows имеет систему планирования, которая дает процессорное время для потоков приложений.

Алгоритм планирования является сложным и полностью описан в Windows Internals, часть 1 (6-е издание) (ссылка для разработчиков),


78
2017-08-24 08:48



Состояние зависания не основано на процессоре. Большинство программ «висят» в этом смысле за 99,999% времени и ничего не делают. - usr
@usr Где я сказал, что «зависание» зависит от процессора? - DavidPostill♦
@usr Первая половина ответа отвечает «постоянно ли он отслеживает все запущенные приложения?». Вторая половина ответила: «Как Windows знает, не отвечает ли программа?». ОП задал два вопроса в одном;) - DavidPostill♦
На самом деле это не опрос? Я предполагаю, что внутреннее устройство больше похоже на дескриптор ожидания в окне, когда вы вызываете PeekMessage, Поэтому, когда Windows отправляет сообщение в приложение и не получает сигнал в течение пяти секунд, он отмечает, что приложение не отвечает. И на самом деле, в более поздних Windows, окно помечено как «не отвечающее», если оно не отвечало на пользователь ввод во времени - пока я не попытаюсь щелкнуть или нажать клавишу или что-то еще, приложение может легко оставаться «висящим» в течение нескольких минут без «появления» невосприимчивым. - Luaan
Вы можете удалить все выше «О сообщениях и очередях сообщений», так как это не поможет ответить. Windows знает, что приложение перестало отвечать, потому что оно перестает накачивать сообщения. Приложение может работать, хотя оно делает что-то интенсивное, а не накачивает сообщения (но это плохо разработанная программа). - Andy


На самом деле Windows не всегда знает, что приложение не отвечает. Приложение должно быть интерактивным приложением с окном, и окно должно получать сообщения, которые приложение не может обработать, прежде чем Windows сделает вывод, что приложение не отвечает.

Например, Windows не имеет возможности узнать, делает ли приложение с хрустом число без интерфейса пользователя, которое запускается из командной строки, или может застрять в бесконечном цикле.

Интерактивные графические приложения в Windows получают события путем непрерывного опроса очереди сообщений. Windows заполняет эту очередь сообщений событиями клавиатуры, мыши, таймера и т. Д. Если приложение не может опросить очередь сообщений в течение некоторого времени (5 секунд - это тайм-аут, упомянутый в документации по функции IsHungAppWindow ()), Windows считает приложение «зависанием», что может указывать, изменив заголовок окна (добавив текст « (Не отвечает) "или эквивалентный текст в локализованных версиях) и выравнивание содержимого окна, если пользователь пытается взаимодействовать с окном.

Приложения могут зависать так, что Windows не распознает. Например, приложение может продолжать опрос сообщений в очереди сообщений без должного действия на них, поэтому для всех практических целей и задач он будет «висел» без Windows, признавая, что он не отвечает требованиям.


32
2017-08-24 11:12



Не отвечающий, по определению, означает не обрабатывать оконные сообщения, поэтому он не применяется к службам или консольным приложениям, поэтому я бы сказал, что Windows всегда знает, не отвечает ли приложение. Вы путаете мертвые замки и не отвечаете. - Andy
Конечно, он может знать, не отвечает ли программа. «Не реагировать» - это не то же самое, что «застрял в бесконечном цикле» - BlueRaja - Danny Pflughoeft
Фактически, приложение может получать сообщения через GetMessage () и не обрабатывать их, и оно не будет признано «не реагирующим» на Windows, несмотря на то, что оно, безусловно, окажется невосприимчивым к его пользователю. Термин «не реагирующий» также часто используется для описания сетевых приложений, интерактивной командной строки и т. Д. Приложений; AFAIK нет формального определения, которое ограничивает фразу для оконных приложений. Как тупик, так и бесконечный цикл (или любая другая ошибка программирования) могут привести к тому, что приложение станет невосприимчивым, но нет, я не путал причину и следствие. - Viktor Toth


Windows - это операционная система, она контролирует все запущенные программы.

Windows взаимодействует с приложениями на основе окон, используя события. Каждая программа имеет поток, который постоянно прослушивает входящие события и обрабатывает их. Например, когда вы нажимаете кнопку или значок области уведомлений, Windows генерирует событие и передает его в соответствующий процесс. Затем процесс может решить, как с ним справиться.

Все взаимодействия с программами основаны на событиях в Windows, поэтому, когда программа не обрабатывает входящие события слишком долго, это означает, что она не отвечает. Как @DavidPostill нашел и отметил в его ответ, тайм-аут составляет 5 секунд. PeekMessage это функция, которая получает событие из очереди событий.


10
2017-08-24 09:00





Ответ на ваш вопрос - да / нет.

Хотя ОС Windows может и выполняет опрос приложений с событиями в очереди сообщений Windows, программы абсолютно не обязаны связываться с WinAPI или обрабатывать / отвечать на очередь Windows. Даже ответ на сообщение в очереди не указывает Windows, была ли программа заблокирована или нет. Это показатель, но это все. Реальный ответ довольно сложный.

Настоящий ответ

Люди здесь хеджируют фактический ответ. Определение того, является ли программа «не ответом», является вариантом «проблема с остановкой», которое формально неразрешимо в компьютерной науке. Краткое объяснение заключается в том, что процессор не может действовать как третья сторона, наблюдающая себя, чтобы определить, задерживается ли подпрограмма в бесконечном цикле, ничего не делаю и увеличивая счетчик, который завершится при некотором фиксированном, нормальное число, оба из которых можно считать плотно закрытыми петлями. Одна остановка, другая никогда не прекратится. Даже вы, как человек, не знаете, действительно ли программа отвечает или нет, особенно если она находится в плотно замкнутый контур - вы знаете только, если думаю, что это должно (отвечать).

С точки зрения Windows, обе эти петли "не отвечает", Вот почему окна дают вам возможность подождать или прекратить работу, потому что они не могут сказать.

Таким образом, следствием является «почему окна знают, что процесс является отвечая? »Ответ довольно умный. Когда процесс скомпилирован в многопоточной и многопроцессорной ОС, иногда даже в плотно закрытых циклах, компилятор может добавить в Уступать() команда, которая обеспечивает удобное уведомление процессору, что он может переключиться на другие запущенные процессы. Он «отказывается» от процессора, и происходит «контекстный переключатель» (как его называют), что позволяет ОС (включая Windows) отвечать на другие события в стеке, некоторые из которых включают отслеживание того, что процесс имеет ответил.

** Это не означает, что ответный процесс будет прекратить, ** Процесс внутри бесконечного цикла может дать процессор, позволяя Windows обрабатывать другие события.

В некоторых программах Windows программа будет обрабатывать сигналы ОС Windows, которые могут сказать ОС, что она «отвечает», но ни одна программа не обязана делать это. Вы можете написать довольно простую загрузку процессора, без прерывания программ даже внутри языков более высокого уровня в Windows, таких как perl, php, python и Windows, возможно, не обнаруживают, что они не завершают и не отвечают. В этот момент Windows зависит от эвристики - загрузки процессора, памяти, количества прерываний, обрабатываемых процессором, когда программа запускалась для «угадывания». Опять же, в этот момент Windows должна попросить вас прекратить работу, потому что она действительно не знает, нужно ли это делать.

См. Также ответ Виктора (правильный). Игнорируйте комментарии о том, что «не отвечает» не совпадает с бесконечным циклом. Существуют всевозможные сообщения, прерывания, циклы, которые приложение может обрабатывать или не обрабатывать, не сообщая очередь сообщений Windows. Обработка очереди сообщений - это только один из многих видов событий, на которые ОС держит счетчики, чтобы попытаться Угадай висит ли процесс.


0
2018-03-14 02:57