프로그램이 응답하지 않는 경우 Windows는 어떻게 알 수 있습니까?


171

프로그램이 응답하지 않는 경우 Windows는 어떻게 알 수 있습니까? 항상 실행중인 모든 응용 프로그램을 계속 폴링합니까?



@ magicandre1981이 페이지는 프로그램이 무엇인가를하고 있는지 확인하는 한 가지 방법을 제안하지만 Windows가 실제로 사용하는 방식은 아닙니다.
Kevin Panko

Windows 메시지 대기열을 살펴보면 PeekMessage () 함수가 후보가됩니다.
Luciano

답변:


149

응용 프로그램은 Windows에서 제공하는 대기열에서 이벤트를 가져옵니다.

응용 프로그램이 긴 계산을 수행하는 것과 같이 이벤트 대기열을 잠시 (5 초) 폴링하지 않으면 Windows는 응용 프로그램이 중지되어 사용자에게 경고한다고 가정합니다.

응용 프로그램이 값 비싼 계산을 작업자 스레드로 밀어 넣거나 처리를 분할하고 큐가 정기적으로 폴링되도록해야하는 것을 피하려면.


27
↑. 일정 잡기와 관련이 없거나 수락 된 답변에서 제안 된 것과 같이 아무 것도 정기적으로 전화를 걸지 만 GetMessage (또는 이와 유사한 것) 및 DispatchMessage.
Damon

1
허용 된 대답은 다음을 참조하십시오. IsHungAppWindow 시작 단계에있는 프로그램이 호출 할 필요가 없다는 것을 정확하게 기록합니다. GetMessage.
MSalters

@MSalters 시작 시간이 첫 번째 시간 전에 정의 된 경우 GetMessage? 이 기능을 사용하면 대기열을 폴링 할 필요가 없으므로 간단한 명령 행 응용 프로그램이 멈추지 않고도 작동 할 수 있습니다.
ratchet freak

4
@ratchetfreak : 아마도 첫 번째 CreateWindow 호출 전에. 커맨드 라인 앱은 서로 다른 짐승이다. 그들은 ConHost.EXE에서 실행 중이며, Windows GUI susbystem과 상호 작용합니다.
MSalters

1
또한 Windows 7 (및 이전 버전)에서는 창을 어떤 방식 으로든 조작하려고 시도 할 때 창을 훨씬 빨리 알 수 있다고합니다. 프로그램이 최대화 또는 메시지 이동을 처리하지 않는 것처럼, Windows 7은 약 1 초 또는 2 초 후에 응답하지 않을 것입니다.
Dave Cousineau

78

프로그램이 응답하지 않는 경우 Windows는 어떻게 알 수 있습니까?

Windows에 대한 소스 코드가 없으면 내부적으로 무엇을하는지 확신 할 수 없습니다.

SDK Windows 기능이 있습니다. IsHungAppWindow 사용할 수 있습니다.

응용 프로그램이 입력을 기다리지 않고 시작 처리 중에 있지 않고 호출하지 않은 경우 응답하지 않는 것으로 간주됩니다 PeekMessage 5 초의 내부 타임 아웃 기간 내에

출처 IsHungAppWindow 함수

최상위 창에서 몇 초 이상 메시지에 응답하지 않으면 시스템은 창을 응답하지 않는 것으로 간주합니다. 이 경우 시스템은 창을 숨기고 동일한 Z 순서, 위치, 크기 및 시각적 속성을 갖는 고스트 창으로 대체합니다. 이를 통해 사용자는 이동하거나 크기를 조정하거나 응용 프로그램을 닫을 수 있습니다. 그러나 응용 프로그램이 실제로 응답하지 않기 때문에 사용할 수있는 유일한 조치입니다.

출처 메시지 및 메시지 큐 정보


항상 실행중인 모든 응용 프로그램을 계속 폴링합니까?

응용 프로그램은 폴링되지 않지만 프로세서 시간이 주어집니다.

Windows에는 응용 프로그램 스레드에 프로세서 시간을 제공하는 스케줄링 시스템이 있습니다.

스케줄링 알고리즘은 복잡하며 다음에서 자세히 설명됩니다. Windows Internals, Part 1 (6th Edition) (개발자 참조) .


2
정지 상태는 CPU를 기반으로하지 않습니다. 대부분의 프로그램은 그 의미에서 99.999 %의 시간 동안 "매달려"있고 아무 것도하지 않습니다.
usr

2
@usr "hang"은 CPU에 달려 있다고 어디에서 말했습니까?
DavidPostill

2
@usr 답변의 첫 번째 절반은 "계속해서 모든 실행중인 응용 프로그램을 폴링합니까?"라고 대답하고 있습니다. 후반부는 "프로그램이 응답하지 않는 경우 Windows는 어떻게 알 수 있습니까?"라는 질문에 OP는 두 가지 질문을 던졌습니다.
DavidPostill

9
그래도 진짜 투표는 아니지, 그렇지? 나는 내부가 당신이 전화 할 때 창문에 대기 핸들과 같다고 생각한다. PeekMessage. 따라서 Windows가 응용 프로그램에 메시지를 보내고 5 초 내에 신호를받지 못하면 응용 프로그램이 응답하지 않는 것으로 표시합니다. 그리고 실제로 최근의 Windows에서는 창에 응답하지 않으면 "응답하지 않음"으로 표시됩니다. 사용자 시간에 맞춰 입력 - 클릭하거나 키 또는 다른 것을 누르기 전까지는 응용 프로그램이 응답하지 않는 상태로 "나타나지"않고도 몇 분 동안 "멈춰"있을 수 있습니다.
Luaan

2
대답에 도움이되지 않기 때문에 "메시지 및 메시지 대기열 정보"에 관한 모든 내용을 삭제할 수 있습니다. Windows는 응용 프로그램이 메시지 펌핑을 중지하기 때문에 응답을 중지 한 것을 알고 있습니다. 앱이 메시지를 펌핑하는 대신 집약적 인 일을하는 것처럼 실행될 수 있습니다 (하지만 잘못 설계된 프로그램 인 경우).
Andy

32

실제로 Windows는 응용 프로그램이 응답하지 않는다는 것을 항상 알 수 없습니다. 응용 프로그램은 윈도우가있는 대화 형 응용 프로그램이어야하며 Windows는 응용 프로그램이 응답하지 않는다고 판단하기 전에 응용 프로그램이 처리하지 못한 메시지를 받아야합니다.

예를 들어, Windows는 커맨드 라인에서 실행되는 사용자 인터페이스가없는 수많은 애플리케이션이 그 일을하고 있는지, 아니면 무한 루프에 빠져 있는지를 알 수있는 방법이 없습니다.

Windows의 대화 형 그래픽 응용 프로그램은 메시지 큐를 계속 폴링하여 이벤트를 수신합니다. Windows는이 메시지 큐를 키보드, 마우스, 타이머 등의 이벤트로 채 웁니다. 응용 프로그램이 메시지 대기열을 잠시 동안 폴링하지 못하면 (5 초가 IsHungAppWindow () 함수 설명서에 언급 된 시간 초과) Windows는 해당 응용 프로그램을 "중지"한 것으로 간주합니다. 이는 윈도우 제목을 변경하여 나타낼 수 있습니다 (텍스트 " (응답이 없음) "또는 현지화 된 버전의 해당 텍스트)을 입력하고 사용자가 창과 상호 작용하려고하면 창 내용을 회색으로 표시합니다.

응용 프로그램은 Windows가 인식하지 못하는 방식으로 중단 될 수 있습니다. 예를 들어, 응용 프로그램은 메시지 대기열의 메시지를 적절하게 처리하지 않고 폴링을 계속할 수 있으므로 Windows가 응답하지 않음을 인식하지 않으면 모든 실제 의도와 목적을 위해 "중단"상태로 표시됩니다.


8
응답이 없다는 것은 윈도우 메시지를 처리하지 않는 것을 의미하기 때문에 서비스 나 콘솔 앱에는 적용되지 않으므로 Windows가 앱이 응답하지 않는 경우 Windows가 항상 알 것이라고 말하고 싶습니다. 죽은 자물쇠를 혼동하고 응답하지 않습니다.
Andy

물론 프로그램이 응답하지 않는지 알 수 있습니다. "응답 없음"은 "무한 루프에서 멈춤"과 동일하지 않습니다.
BlueRaja - Danny Pflughoeft

1
실제로 응용 프로그램은 GetMessage ()를 통해 메시지를 검색하고 처리하지 못하고 사용자가 응답하지 않는 것처럼 보이지만 Windows에서 "응답하지 않음"으로 인식되지 않습니다. "응답하지 않음"이라는 용어는 네트워크, 서비스, 대화 형 명령 줄 등의 응용 프로그램을 설명하는 데 자주 사용됩니다. AFAIK에는 문구를 창 응용 프로그램으로 제한하는 공식 정의가 없습니다. 교착 상태 또는 무한 루프 (또는 다른 프로그래밍 오류)로 인해 응용 프로그램이 응답하지 않을 수 있지만 아니요, 원인과 결과를 혼동하지 않았습니다.
Viktor Toth

10

Windows는 운영 체제이며 실행중인 모든 프로그램을 감독합니다.

Windows는 이벤트를 사용하여 창 기반 응용 프로그램과 통신합니다. 모든 프로그램에는 들어오는 이벤트를 지속적으로 수신하고 처리하는 스레드가 있습니다. 예를 들어 단추 나 알림 영역 아이콘을 클릭하면 Windows에서 이벤트를 생성하고 적절한 프로세스로 공급합니다. 그런 다음 프로세스에서 처리 방법을 결정할 수 있습니다.

Windows에서 프로그램과의 모든 상호 작용은 이벤트 기반이므로 프로그램이 들어오는 이벤트를 너무 오랫동안 처리하지 않으면 응답하지 않는다는 의미입니다. @DavidPostill이 발견하고 주목 한 것처럼 그의 대답 시간 제한은 5 초입니다. PeekMessage 이벤트 대기열에서 이벤트를 가져 오는 함수입니다.


0

귀하의 질문에 대한 대답은 예 / 아니오입니다.

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가 카운터를 유지하려고하는 여러 종류의 이벤트 중 하나 일뿐입니다. 추측 프로세스가 중단되었는지 여부.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.