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

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

170 голосов | спросил ArunPrasanth 24 AM000000100000005131 2015, 10:33:51

5 ответов


149

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

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

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

ответил ratchet freak 24 PM00000010000005731 2015, 13:09:57
78

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

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

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

  

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

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

  

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

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


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

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

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

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

ответил DavidPostill 24 AM000000110000001531 2015, 11:48:15
32

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

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

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

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

ответил Viktor Toth 24 PM00000020000004631 2015, 14:12:46
10

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

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

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

ответил gronostaj 24 PM000000120000005131 2015, 12:00:51
0

Ответ на ваш вопрос: yes /NO.

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

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

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

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

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

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

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

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

ответил Beracah 14 MaramTue, 14 Mar 2017 05:57:16 +03002017-03-14T05:57:16+03:0005 2017, 05:57:16

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132