Skąd Windows wie, czy program nie odpowiada? Czy stale odpytuje wszystkie uruchomione aplikacje?
Skąd Windows wie, czy program nie odpowiada? Czy stale odpytuje wszystkie uruchomione aplikacje?
Odpowiedzi:
Aplikacja pobiera zdarzenia z kolejki udostępnianej przez system Windows.
Jeśli aplikacja nie odpytuje kolejki zdarzeń przez jakiś czas (5 sekund), na przykład podczas wykonywania długich obliczeń, wówczas Windows zakłada, że aplikacja została zawieszona i ostrzega użytkownika.
Aby tego uniknąć, aplikacje powinny przesyłać kosztowne obliczenia do wątków roboczych lub dzielić przetwarzanie i upewnić się, że kolejka jest regularnie sprawdzana.
GetMessage
(lub tym podobne) i DispatchMessage
.
IsHungAppWindow
poprawnych uwag, stwierdza, że program w fazie uruchamiania nie musi wywoływać GetMessage
.
GetMessage
? Ta funkcja umożliwia działanie prostych aplikacji wiersza polecenia bez konieczności zawieszania się, ponieważ nie trzeba sondować kolejki.
Bez kodu źródłowego dla systemu Windows nie jesteśmy pewni, co robi wewnętrznie.
Istnieje funkcja Windows SDK, IsHungAppWindow
której można użyć.
Uznaje się, że aplikacja nie odpowiada, jeśli nie czeka na dane wejściowe, nie jest przetwarzana podczas uruchamiania i nie wywołała PeekMessage w wewnętrznym limicie czasu wynoszącym 5 sekund.
Źródło IsHungAppWindow
Jeśli okno najwyższego poziomu przestanie odpowiadać na wiadomości na dłużej niż kilka sekund, system uzna, że okno nie odpowiada. W takim przypadku system ukrywa okno i zamienia je na okno-widmo, które ma tę samą kolejność Z, lokalizację, rozmiar i atrybuty wizualne. Dzięki temu użytkownik może go przenieść, zmienić rozmiar, a nawet zamknąć aplikację. Są to jednak jedyne dostępne działania, ponieważ aplikacja w rzeczywistości nie odpowiada.
Źródło o wiadomościach i kolejkach wiadomości
Nie. Aplikacje nie są odpytywane, ale mają określony czas procesora.
Windows ma system planowania, który daje procesorowi czas na wątki aplikacji.
Algorytm planowania jest złożony i jest w pełni opisany w Windows Wewnętrznych, Część 1 (wydanie 6) (Developer Reference) .
PeekMessage
. Tak więc, gdy system Windows wysyła komunikat do aplikacji i nie otrzymuje sygnału w ciągu pięciu sekund, oznacza to, że aplikacja nie odpowiada. W rzeczywistości w nowszym systemie Windows okno jest oznaczone jako „nie odpowiada” tylko wtedy, gdy nie zareaguje na dane wprowadzone przez użytkownika w odpowiednim czasie - dopóki nie spróbuję kliknąć lub nacisnąć klawisza lub czegoś innego, aplikacja może z łatwością „zawiesić się” minut bez „pojawienia się” braku odpowiedzi.
W rzeczywistości system Windows nie zawsze wie, że aplikacja nie odpowiada. Aplikacja musi być aplikacją interaktywną z oknem, a okno musi odbierać komunikaty, których aplikacja nie przetwarza, zanim system Windows stwierdzi, że aplikacja nie odpowiada.
Na przykład system Windows nie ma sposobu, aby dowiedzieć się, czy aplikacja powodująca awarie liczb bez interfejsu użytkownika uruchamianego z wiersza poleceń działa, czy może utknęła w nieskończonej pętli.
Interaktywne aplikacje graficzne w systemie Windows odbierają zdarzenia poprzez ciągłe przeszukiwanie kolejki komunikatów. System Windows zapełnia tę kolejkę komunikatów zdarzeniami dotyczącymi klawiatury, myszy, timera itp. Jeśli aplikacja nie przeszukuje kolejki komunikatów przez pewien czas (5 sekund to limit czasu wymieniony w dokumentacji funkcji IsHungAppWindow ()), system Windows uznaje aplikację za „zawieszoną”, co może wskazywać, zmieniając tytuł okna (dodając tekst „ (Nie odpowiada) ”lub równoważny tekst w zlokalizowanych wersjach) i wyszarzenie zawartości okna, jeśli użytkownik spróbuje wejść w interakcję z oknem.
Aplikacje mogą się zawieszać w sposób, którego system Windows nie rozpoznaje. Na przykład aplikacja może kontynuować odpytywanie o wiadomości w swojej kolejce komunikatów bez odpowiedniego działania na nich, więc dla wszystkich praktycznych intencji i celów wydaje się „zawieszona” bez rozpoznania przez Windows, że nie odpowiada.
Windows to system operacyjny, który nadzoruje wszystkie uruchomione programy.
System Windows komunikuje się z aplikacjami opartymi na systemie Windows za pomocą zdarzeń. Każdy program ma wątek, który stale nasłuchuje nadchodzących zdarzeń i przetwarza je. Na przykład po kliknięciu przycisku lub ikony obszaru powiadomień system Windows generuje zdarzenie i przekazuje je do odpowiedniego procesu. Proces może następnie zdecydować, jak sobie z tym poradzić.
Wszystkie interakcje z programami są oparte na zdarzeniach w systemie Windows, więc jeśli program nie przetwarza przychodzących zdarzeń zbyt długo, oznacza to, że nie odpowiada. Jak @DavidPostill znalazł i zauważył w swojej odpowiedzi , limit czasu wynosi 5 sekund. PeekMessage
to funkcja, która pobiera zdarzenie z kolejki zdarzeń.
Odpowiedź na twoje pytanie brzmi: tak / nie.
Podczas gdy system operacyjny Windows może i odpytuje aplikacje ze zdarzeniami w kolejce Windows Messaging, programy mają absolutnie zerowy obowiązek łączenia się z WinAPI lub obsługi / odbierania kolejki Windows. Nawet odpowiedź na wiadomość w kolejce nie informuje systemu Windows, czy program „zablokował się”, czy nie. To wskaźnik, ale to wszystko. Prawdziwa odpowiedź jest nieco bardziej skomplikowana.
Prawdziwa odpowiedź
Ludzie żywią się tutaj wokół właściwej odpowiedzi. Określenie, czy program „nie odpowiada” jest odmianą „ problemu zatrzymania ”, który formalnie jest nierozstrzygalny w informatyce. Krótkie wyjaśnienie jest takie, że procesor nie może działać jako strona trzecia obserwująca się w celu ustalenia, czy podprogram utknął w nieskończonej pętli, nie robiąc nic, a nie zwiększając licznik, który zakończy się na pewnej stałej, normalnej liczbie. Oba z nich można uznać za ściśle zamknięte pętle. Jeden się zatrzymuje, drugi nigdy się nie skończy. Nawet ty, jako osoba, nie wiesz, czy program faktycznie odpowiada, czy nie, szczególnie jeśli jest w ściśle zamkniętej pętli - wiesz tylko, jeśli uważasz, że powinien (odpowiedzieć).
Z punktu widzenia systemu Windows obie te pętle „nie odpowiadają” . Właśnie dlatego system Windows daje możliwość czekania lub zakończenia, ponieważ nie jest w stanie tego stwierdzić.
Więc następstwem jest „Dlaczego okna wiedzieć, że proces jest reagować?” Odpowiedź jest raczej sprytna. Gdy proces jest kompilowany w wielowątkowym i wieloprocesowym systemie operacyjnym, czasem nawet w ciasno zamkniętych pętlach, kompilator może dodać komendę fed () , która zapewnia wygodne powiadomienie procesora, że może przełączyć się na inne uruchomione procesy . To „rezygnuje” procesor i „przełączanie kontekstu” (jak to się nazywa) zdarza się, że pozwala na OS (Windows w zestawie), aby odpowiedzieć na inne wydarzenia w stos, z których niektóre zawierają śledzenie, że proces nie odpowiedział.
** Nie oznacza to, że proces odpowiadania zostanie zakończony . ** Proces wewnątrz nieskończonej pętli może dać procesorowi, umożliwiając systemowi Windows przetwarzanie innych zdarzeń.
W niektórych programach systemu Windows program będzie obsługiwał sygnały systemu operacyjnego Windows, co może powiedzieć systemowi, że „odpowiada”, ale żaden program nie jest do tego zobowiązany. Możesz pisać dość proste blokowanie procesora, nie kończące się programy, nawet w językach wyższego poziomu w systemie Windows, takich jak perl, php, python, a Windows może nie wykryć, że nie kończy i nie odpowiada. W tym momencie system Windows zależy od heurystyki - obciążenia procesora, pamięci, liczby przerwań obsługiwanych przez procesor podczas działania programu w celu „odgadnięcia”. Ponownie, w tym momencie Windows musi poprosić cię o zakończenie, ponieważ tak naprawdę nie wie, czy powinien.
Zobacz także (poprawną) odpowiedź Viktora. Zignoruj komentarze dotyczące tego, czy „brak odpowiedzi” nie jest tym samym, co nieskończona pętla. Istnieją różne rodzaje komunikatów, przerwań, pętli, które aplikacja może obsługiwać lub nie, bez informowania kolejki komunikatów systemu Windows. Obsługa kolejki komunikatów jest tylko jednym z wielu rodzajów zdarzeń, na które system operacyjny liczy, próbując zgadnąć, czy proces się zawiesił.