Frage Woher weiß Windows, ob ein Programm nicht reagiert?


Woher weiß Windows, ob ein Programm nicht reagiert? Wird ständig alle laufenden Anwendungen abgefragt?


171
2017-08-24 07:33


Ursprung


hurypupandwait.io/blog/detecting-a-hung-windows-process - magicandre1981
@ magicandre1981 Diese Seite schlägt eine Möglichkeit vor, um zu überprüfen, ob ein Programm aktiv etwas tut, aber es ist nicht die Art, wie Windows tatsächlich verwendet. - Kevin Panko
Betrachten Sie die Windows-Nachrichtenwarteschlange, ein Kandidat ist die PeekMessage () - Funktion - Luciano


Antworten:


Eine Anwendung ruft die Ereignisse aus einer von Windows bereitgestellten Warteschlange ab.

Wenn die Anwendung die Ereigniswarteschlange für eine Weile (5 Sekunden) nicht abfragt, z. B. wenn eine lange Berechnung durchgeführt wird, geht Windows davon aus, dass die Anwendung angehalten wurde, und alarmiert den Benutzer.

Um zu vermeiden, dass Anwendungen teure Berechnungen an Worker-Threads weiterleiten oder die Verarbeitung aufteilen und sicherstellen, dass die Warteschlange regelmäßig abgefragt wird.


149
2017-08-24 10:09



↑ Dies. Nichts mit der Planung zu tun oder wie in der angenommenen Antwort vorgeschlagen, nur, ob Sie regelmäßig anrufen GetMessage (oder dergleichen) und DispatchMessage. - Damon
Die angenommene Antwort, in Bezug auf IsHungAppWindow stellt fest, dass ein Programm in der Startphase nicht aufrufen muss GetMessage. - MSalters
@MSalters Der Start wird als die Zeit vor dem ersten definiert GetMessage? Mit dieser Funktion können einfache Befehlszeilen-Apps ohne Verzögerung ausgeführt werden, da sie die Warteschlange nicht abfragen müssen. - ratchet freak
@ratchetfreak: Vermutlich vor dem ersten CreateWindow-Aufruf. Befehlszeilen-Apps sind insgesamt verschiedene Biester; Sie laufen in ConHost.EXE und interagieren mit dem Windows-GUI-System für sie. - MSalters
Außerdem scheint es mir, dass Windows in Windows 7 (und möglicherweise früher) das viel früher bemerkt, wenn Sie versuchen, das Fenster in irgendeiner Weise zu manipulieren. Wenn ein Programm eine Maximierung oder eine Nachricht nicht verarbeitet, springt Windows 7 nach etwa 1 oder 2 Sekunden nach rechts, um nicht zu antworten. - Dave Cousineau


Woher weiß Windows, ob ein Programm nicht reagiert?

Ohne den Quellcode von Windows können wir nicht sicher sein, was es intern macht.

Es gibt eine SDK-Windows-Funktion IsHungAppWindow das kann verwendet werden.

Eine Anwendung wird als nicht reagierend betrachtet, wenn sie nicht auf eine Eingabe wartet, sich nicht in der Startverarbeitung befindet und nicht aufgerufen wurde PeekMessage innerhalb der internen Timeout-Zeit von 5 Sekunden.

Quelle IsHungAppWindow-Funktion

Wenn ein Fenster der obersten Ebene länger als einige Sekunden nicht mehr auf Nachrichten reagiert, betrachtet das System das Fenster als nicht reagierend. In diesem Fall blendet das System das Fenster aus und ersetzt es durch ein Geisterfenster mit der gleichen Z-Reihenfolge, dem gleichen Ort, der gleichen Größe und den gleichen visuellen Attributen. Dies ermöglicht dem Benutzer, es zu verschieben, die Größe zu ändern oder sogar die Anwendung zu schließen. Dies sind jedoch die einzigen verfügbaren Aktionen, da die Anwendung tatsächlich nicht reagiert.

Quelle Über Nachrichten und Nachrichtenwarteschlangen


Wird ständig alle laufenden Anwendungen abgefragt?

Nein. Anwendungen werden nicht abgefragt, aber die Prozessorzeit wird angegeben.

Windows verfügt über ein Zeitsteuerungssystem, das den Anwendungs-Threads Prozessorzeit gibt.

Der Scheduling-Algorithmus ist komplex und wird vollständig beschrieben Windows Internals, Teil 1 (6. Edition) (Entwicklerreferenz).


78
2017-08-24 08:48



Der Hang-Status basiert nicht auf CPU. Die meisten Programme sind in diesem Sinne für 99,999% der Zeit "hängen" und tun nichts. - usr
@usr Wo habe ich gesagt, dass "hängt" hängt von der CPU ab? - DavidPostill♦
@usr Die erste Hälfte der Antwort lautet: "Liest sie ständig alle laufenden Anwendungen?". Die zweite Hälfte beantwortet "Wie weiß Windows, ob ein Programm nicht antwortet?". Das OP stellte zwei Fragen in einem;) - DavidPostill♦
Es ist jedoch nicht wirklich Umfrage, oder? Ich nehme an, die Interna sind eher wie ein Wartegriff auf dem Fenster signalisiert wird, wenn du anrufst PeekMessage. Wenn Windows eine Nachricht an die Anwendung sendet und innerhalb von fünf Sekunden nicht signalisiert wird, markiert es die Anwendung als nicht reagierend. Und tatsächlich, auf neueren Windows, ist das Fenster nur als "nicht reagiert" markiert, wenn es nicht reagierte Benutzer Eingabe in der Zeit - bis ich versuche, zu klicken oder eine Taste oder etwas zu drücken, kann die Anwendung leicht für Minuten "hängen" bleiben, ohne "zu reagieren" nicht reagierend. - Luaan
Sie können alles über "Über Nachrichten und Nachrichtenwarteschlangen" löschen, da es die Antwort nicht hilft. Windows weiß, dass eine App nicht mehr reagiert, weil sie keine Nachrichten mehr sendet. Die App könnte aber laufen, weil sie etwas intensives tut, anstatt Nachrichten zu pumpen (aber das ist ein schlecht entworfenes Programm). - Andy


Tatsächlich weiß Windows nicht immer, dass eine Anwendung nicht reagiert. Die Anwendung muss eine interaktive Anwendung mit einem Fenster sein, und das Fenster muss Nachrichten empfangen, die die Anwendung nicht verarbeiten kann, bevor Windows zu dem Schluss kommt, dass die Anwendung nicht reagiert.

Zum Beispiel hat Windows keine Möglichkeit zu wissen, ob eine Anwendung zur Berechnung von Zahlen ohne Benutzeroberfläche, die über die Befehlszeile ausgeführt wird, ihre Aufgabe erfüllt oder vielleicht in einer Endlosschleife steckt.

Interaktive grafische Anwendungen in Windows empfangen Ereignisse, indem sie kontinuierlich eine Nachrichtenwarteschlange abfragen. Windows füllt diese Nachrichtenwarteschlange mit Tastatur-, Maus-, Timer- usw. Ereignissen. Wenn eine Anwendung die Nachrichtenwarteschlange für einige Zeit nicht abfragen kann (5 Sekunden ist das in der IsHungAppWindow () - Funktionsdokumentation erwähnte Zeitlimit), betrachtet Windows die Anwendung als "hängt", was durch Ändern des Fenstertitels angezeigt werden kann (Hinzufügen des Textes) (Nicht reagierend) "oder äquivalenter Text in lokalisierten Versionen) und den Fensterinhalt grau ausgräbt, wenn der Benutzer versucht, mit dem Fenster zu interagieren.

Anwendungen können auf eine Weise hängen, die Windows nicht erkennt. Zum Beispiel kann eine Anwendung weiterhin nach Nachrichten in ihrer Nachrichtenwarteschlange suchen, ohne auf sie richtig zu reagieren, so dass sie für alle praktischen Absichten und Zwecke "hängen" würde, ohne dass Windows erkennt, dass sie nicht reagiert.


32
2017-08-24 11:12



Nicht reagieren bedeutet definitionsgemäß, dass Fenstermeldungen nicht verarbeitet werden. Daher gilt dies nicht für Dienste oder Konsolen-Apps. Daher würde ich sagen, dass Windows immer weiß, ob eine App nicht antwortet. Du verwirrst tote Sperren und reagierst nicht. - Andy
Natürlich kann es wissen, ob ein Programm nicht antwortet. "Nicht reagieren" ist nicht dasselbe wie "in einer Endlosschleife stecken geblieben" - BlueRaja - Danny Pflughoeft
Tatsächlich kann eine Anwendung Nachrichten über GetMessage () abrufen und sie nicht verarbeiten, und es würde von Windows nicht als "nicht reagierend" erkannt werden, obwohl es für seinen Benutzer sicherlich nicht reagiert. Der Begriff "nicht reagiert" wird häufig auch verwendet, um Anwendungen für Netzwerk, Dienst, interaktive Befehlszeilen usw. zu beschreiben; AFAIK gibt es keine formale Definition, die den Ausdruck auf Fensteranwendungen beschränkt. Sowohl ein Deadlock als auch eine Endlosschleife (oder ein anderer Programmierfehler) kann dazu führen, dass eine Anwendung nicht mehr reagiert, aber nein, Ursache und Wirkung wurden nicht verwechselt. - Viktor Toth


Windows ist ein Betriebssystem, es überwacht alle laufenden Programme.

Windows kommuniziert mit fensterbasierten Anwendungen über Ereignisse. Jedes Programm hat einen Thread, der ständig auf eingehende Ereignisse wartet und sie verarbeitet. Wenn Sie beispielsweise auf eine Schaltfläche oder ein Infobereich klicken, generiert Windows ein Ereignis und füttert es in den entsprechenden Prozess. Der Prozess kann dann entscheiden, wie er damit umgehen soll.

Alle Interaktionen mit Programmen sind ereignisbasiert in Windows. Wenn das Programm eingehende Ereignisse nicht zu lange verarbeitet, heißt das, dass es nicht reagiert. Wie @DavidPostill gefunden und notiert hat seine Antwort, ist die Zeitüberschreitung 5 Sekunden. PeekMessage ist die Funktion, die ein Ereignis aus der Ereigniswarteschlange abruft.


10
2017-08-24 09:00





Die Antwort auf Ihre Frage lautet Ja / Nein.

Während das Windows-Betriebssystem Anwendungen mit Ereignissen in der Windows Messaging-Warteschlange abfragen kann und muss, sind Programme absolut nicht verpflichtet, eine Verbindung mit der WinAPI herzustellen oder die Windows-Warteschlange zu bearbeiten / beantworten. Selbst wenn eine Nachricht in der Warteschlange beantwortet wird, wird Windows nicht mitgeteilt, ob das Programm "gesperrt" ist oder nicht. Es ist ein Indikator, aber das ist alles. Die wirkliche Antwort ist ein bisschen komplizierter.

Die echte Antwort

Die Leute hüten sich hier um die tatsächliche Antwort. Das Bestimmen, ob ein Programm "nicht antwortet", ist eine Variante des "Problem anhalten", die in der Informatik formal unentscheidbar ist. Die kurze Erklärung ist, dass der Prozessor nicht als ein Dritter agieren kann, der sich selbst beobachtet, um zu bestimmen, ob eine Subroutine in einer Endlosschleife feststeckt, gegen einen Zähler, der zu einem festen Termin endet. normale Zahl, die beide als eng geschlossene Schleifen betrachtet werden können: Einer hält an, der andere wird nie beendet, selbst Sie als Person wissen nicht, ob ein Programm tatsächlich antwortet oder nicht, insbesondere wenn es sich um eine eng geschlossene Schleife - Sie wissen nur, ob denke es sollte (reagieren).

Aus der Perspektive von Windows sind beide Schleifen "reagiert nicht". Deshalb gibt Windows Ihnen die Wahl zu warten oder zu beenden, weil es nicht sagen kann.

Die logische Konsequenz ist also, warum Windows einen Prozess kennt ist Antwort? "Die Antwort ist ziemlich clever. Wenn ein Prozess in einem Multi-Threaded- und Multi-Prozess-Betriebssystem kompiliert wird, manchmal sogar in dicht geschlossenen Schleifen, kann der Compiler ein hinzufügen Ausbeute() Befehl, der dem Prozessor eine bequeme Benachrichtigung darüber gibt, dass er zu anderen laufenden Prozessen wechseln kann. Es "gibt" den Prozessor auf, und ein "Kontextwechsel" (wie es genannt wird) passiert, der es dem Betriebssystem (einschließlich Windows) ermöglicht, andere Ereignisse im Stapel zu beantworten, von denen einige das Verfolgen des Prozesses umfassen hat geantwortet.

** Dies bedeutet nicht, dass ein antwortender Prozess wird beenden. ** Ein Prozess innerhalb einer Endlosschleife kann den Prozessor bereitstellen, sodass Windows andere Ereignisse verarbeiten kann.

In einigen Windows-Programmen wird das Programm Windows-Betriebssystemsignale verarbeiten, die dem Betriebssystem mitteilen können, dass es "reagiert", aber kein Programm ist dazu verpflichtet. Sie können ziemlich einfaches CPU-Chogging schreiben, nicht-terminierende Programme selbst in höheren Programmiersprachen unter Windows wie Perl, PHP, Python und Windows erkennt möglicherweise nicht, dass es nicht beendet und nicht reagiert. An diesem Punkt hängt Windows von Heuristiken ab - CPU-Last, Speicher, wie viele Unterbrechungen der Prozessor während des Programmlaufs verarbeitet hat, um "raten" zu können. Auch an diesem Punkt muss Windows Sie bitten, zu beenden, weil es wirklich nicht weiß, ob es sollte.

Siehe auch Viktors (richtige) Antwort. Ignoriere die Kommentare darüber, ob "nicht reagieren" nicht einer Endlosschleife entspricht. Es gibt alle Arten von Nachrichten, Unterbrechungen, Schleifen, die eine Anwendung ohne die Windows-Nachrichtenwarteschlange möglicherweise verarbeiten oder nicht verarbeiten kann. Das Behandeln der Nachrichtenwarteschlange ist nur eine von vielen Arten von Ereignissen, bei denen das Betriebssystem versucht, Zähler zu versuchen vermuten ob ein Prozess hängt.


0
2018-03-14 02:57