프로그램이 응답하지 않는 경우 Windows는 어떻게 알 수 있습니까? 항상 실행중인 모든 응용 프로그램을 계속 폴링합니까?
프로그램이 응답하지 않는 경우 Windows는 어떻게 알 수 있습니까? 항상 실행중인 모든 응용 프로그램을 계속 폴링합니까?
답변:
응용 프로그램은 Windows에서 제공하는 대기열에서 이벤트를 가져옵니다.
응용 프로그램이 긴 계산을 수행하는 것과 같이 이벤트 대기열을 잠시 (5 초) 폴링하지 않으면 Windows는 응용 프로그램이 중지되어 사용자에게 경고한다고 가정합니다.
응용 프로그램이 값 비싼 계산을 작업자 스레드로 밀어 넣거나 처리를 분할하고 큐가 정기적으로 폴링되도록해야하는 것을 피하려면.
GetMessage
(또는 이와 유사한 것) 및 DispatchMessage
.
IsHungAppWindow
시작 단계에있는 프로그램이 호출 할 필요가 없다는 것을 정확하게 기록합니다. GetMessage
.
GetMessage
? 이 기능을 사용하면 대기열을 폴링 할 필요가 없으므로 간단한 명령 행 응용 프로그램이 멈추지 않고도 작동 할 수 있습니다.
Windows에 대한 소스 코드가 없으면 내부적으로 무엇을하는지 확신 할 수 없습니다.
SDK Windows 기능이 있습니다. IsHungAppWindow
사용할 수 있습니다.
응용 프로그램이 입력을 기다리지 않고 시작 처리 중에 있지 않고 호출하지 않은 경우 응답하지 않는 것으로 간주됩니다 PeekMessage 5 초의 내부 타임 아웃 기간 내에
최상위 창에서 몇 초 이상 메시지에 응답하지 않으면 시스템은 창을 응답하지 않는 것으로 간주합니다. 이 경우 시스템은 창을 숨기고 동일한 Z 순서, 위치, 크기 및 시각적 속성을 갖는 고스트 창으로 대체합니다. 이를 통해 사용자는 이동하거나 크기를 조정하거나 응용 프로그램을 닫을 수 있습니다. 그러나 응용 프로그램이 실제로 응답하지 않기 때문에 사용할 수있는 유일한 조치입니다.
응용 프로그램은 폴링되지 않지만 프로세서 시간이 주어집니다.
Windows에는 응용 프로그램 스레드에 프로세서 시간을 제공하는 스케줄링 시스템이 있습니다.
스케줄링 알고리즘은 복잡하며 다음에서 자세히 설명됩니다. Windows Internals, Part 1 (6th Edition) (개발자 참조) .
PeekMessage
. 따라서 Windows가 응용 프로그램에 메시지를 보내고 5 초 내에 신호를받지 못하면 응용 프로그램이 응답하지 않는 것으로 표시합니다. 그리고 실제로 최근의 Windows에서는 창에 응답하지 않으면 "응답하지 않음"으로 표시됩니다. 사용자 시간에 맞춰 입력 - 클릭하거나 키 또는 다른 것을 누르기 전까지는 응용 프로그램이 응답하지 않는 상태로 "나타나지"않고도 몇 분 동안 "멈춰"있을 수 있습니다.
실제로 Windows는 응용 프로그램이 응답하지 않는다는 것을 항상 알 수 없습니다. 응용 프로그램은 윈도우가있는 대화 형 응용 프로그램이어야하며 Windows는 응용 프로그램이 응답하지 않는다고 판단하기 전에 응용 프로그램이 처리하지 못한 메시지를 받아야합니다.
예를 들어, Windows는 커맨드 라인에서 실행되는 사용자 인터페이스가없는 수많은 애플리케이션이 그 일을하고 있는지, 아니면 무한 루프에 빠져 있는지를 알 수있는 방법이 없습니다.
Windows의 대화 형 그래픽 응용 프로그램은 메시지 큐를 계속 폴링하여 이벤트를 수신합니다. Windows는이 메시지 큐를 키보드, 마우스, 타이머 등의 이벤트로 채 웁니다. 응용 프로그램이 메시지 대기열을 잠시 동안 폴링하지 못하면 (5 초가 IsHungAppWindow () 함수 설명서에 언급 된 시간 초과) Windows는 해당 응용 프로그램을 "중지"한 것으로 간주합니다. 이는 윈도우 제목을 변경하여 나타낼 수 있습니다 (텍스트 " (응답이 없음) "또는 현지화 된 버전의 해당 텍스트)을 입력하고 사용자가 창과 상호 작용하려고하면 창 내용을 회색으로 표시합니다.
응용 프로그램은 Windows가 인식하지 못하는 방식으로 중단 될 수 있습니다. 예를 들어, 응용 프로그램은 메시지 대기열의 메시지를 적절하게 처리하지 않고 폴링을 계속할 수 있으므로 Windows가 응답하지 않음을 인식하지 않으면 모든 실제 의도와 목적을 위해 "중단"상태로 표시됩니다.
Windows는 운영 체제이며 실행중인 모든 프로그램을 감독합니다.
Windows는 이벤트를 사용하여 창 기반 응용 프로그램과 통신합니다. 모든 프로그램에는 들어오는 이벤트를 지속적으로 수신하고 처리하는 스레드가 있습니다. 예를 들어 단추 나 알림 영역 아이콘을 클릭하면 Windows에서 이벤트를 생성하고 적절한 프로세스로 공급합니다. 그런 다음 프로세스에서 처리 방법을 결정할 수 있습니다.
Windows에서 프로그램과의 모든 상호 작용은 이벤트 기반이므로 프로그램이 들어오는 이벤트를 너무 오랫동안 처리하지 않으면 응답하지 않는다는 의미입니다. @DavidPostill이 발견하고 주목 한 것처럼 그의 대답 시간 제한은 5 초입니다. PeekMessage
이벤트 대기열에서 이벤트를 가져 오는 함수입니다.
귀하의 질문에 대한 대답은 예 / 아니오입니다.
Windows OS는 Windows 메시징 대기열의 이벤트로 응용 프로그램을 폴링 할 수 있지만 WinAPI에 연결하거나 Windows 대기열을 처리 / 응답 할 절대적 의무는 없습니다. 심지어 대기열의 메시지에 응답해도 프로그램이 "잠겨 있는지"여부를 Windows에 알리지 않습니다. 그것은 지표이지만 그게 전부입니다. 진짜 대답은 꽤 복잡합니다.
진짜 대답
사람들은 실제 답변을 둘러싼 헤딩을하고 있습니다. 프로그램이 "응답하지 않음"인지 여부를 결정하는 것은 " 정지 문제 "이것은 컴퓨터 과학에서 공식적으로 결정할 수없는 간단한 설명입니다. 프로세서는 서브 루틴이 무한 루프에 갇혀 있는지 여부를 확인하기 위해 자신을 관찰하는 제 3의 역할을 할 수 없으며, 둘 다 단단히 닫힌 루프로 간주 될 수 있습니다. 하나는 멈추고 다른 하나는 종료되지 않습니다. 심지어 사람으로서, 프로그램이 실제로 응답하는지 여부를 알지 못합니다. 특히 단단히 닫힌 루프 - 당신은 그것이라고 생각한다. (응창 성가).
Windows의 관점에서 볼 때이 두 루프는 모두 "응답 없음" . 그래서 Windows는 기다릴 수 없으며 종료 할 수있는 선택권을 제공합니다.
그래서 결과는 "Windows가 프로세스를 알고있는 이유는 무엇입니까? ~이다. 응답은 오히려 영리합니다. 프로세스가 다중 스레드 및 다중 프로세스 OS에서 컴파일 될 때, 때로는 단단히 닫힌 루프에서도 컴파일러가 수율() 명령은 프로세서에 실행중인 다른 프로세스로 전환 할 수 있다는 편리한 통지를 제공합니다. 그것은 프로세서를 "포기"하고 OS (Windows 포함)가 스택의 다른 이벤트에 응답 할 수있게 해주는 "컨텍스트 스위치"(호출 됨)가 발생합니다.이 중 일부는 프로세스를 추적하는 것을 포함합니다 있다 대답했다.
** 이것은 응답 프로세스가 끝내다 . ** 무한 루프 내부의 프로세스로 인해 프로세서가 생성되어 Windows가 다른 이벤트를 처리 할 수 있습니다.
일부 Windows 프로그램에서는 프로그램이 Windows OS 신호를 처리하여 OS가 "응답 중"이라고 말할 수 있지만 프로그램에서 어떤 응답도하지 않아도됩니다. 아주 간단한 CPU 호깅, perl, php, python과 같은 Windows의 상위 레벨 언어 내에서도 종료되지 않는 프로그램을 작성할 수 있으며 Windows는 종료하지 않고 응답하지 않을 수도 있습니다. 이 시점에서 Windows는 경험적 방법 (CPU로드, 메모리, 프로그램이 "추측"하기 위해 실행되는 동안 처리 한 인터럽트 수)에 따라 다릅니다. 다시 말하지만, Windows는 종료해야하는지 여부를 정말로 묻지 않아야합니다.
빅터의 (정확한) 대답도보십시오. "응답하지 않음"이 무한 루프와 다른지 여부에 대한 설명을 무시하십시오. 응용 프로그램이 Windows 메시지 큐에 알리지 않고 처리 할 수도 있고 처리하지 않을 수도있는 모든 종류의 메시지, 인터럽트, 루프가 있습니다. 메시지 대기열 처리는 OS가 카운터를 유지하려고하는 여러 종류의 이벤트 중 하나 일뿐입니다. 추측 프로세스가 중단되었는지 여부.