응답 없음
1. 개요
[image]
Not Responding
Microsoft Windows에서 프로그램과 프로그램 간에 충돌 오류가 일어나 이를 운영 체제에서 독자적으로 해결할 때까지 프로그램 작동을 멈추는 현상. Windows 9x 커널에서 유난히 자주 발생하는 블루스크린과는 달리 Windows NT 커널에서도 자주 볼 수 있는 현상이다. 사진의 예시는 파일 탐색기.
2. 원인
윈도우에서 마우스를 클릭하거나 키보드의 키를 누르는 등[1] 의 행동은 전부 메시지라고 하여 운영 체제(OS)가 먼저 1차적으로 받고 각 프로그램에게 해야 할 역할을 하달한다. 프로그램들은 각각 자기만의 메시지 큐(쉽게 이야기하면 그냥 받은 메시지 즉 '''해야 할 일'''을 담는 상자)를 가지고 있는데 프로그램은 매번 루프를 돌면서[2] 이 메시지 큐에 메시지가 있으면 해당 메시지를 큐에서 꺼내 그에 알맞은 무언가를 하게 된다.
이것을 프로그램의 '응답'이라고 하며 이렇게 운영 체제(OS)와 프로그램 간에 서로 대화를 하는 느낌으로 사용자 시스템이 돌아가는데 가끔가다 이 프로그램이 자기의 작업을 처리하다가 무한 루프에 걸려 버린다던가 아니면 너무 시간이 오래 걸리는 작업을 한다던가 등의 이유로 이 메시지 큐에 있는 메시지들을 제때제때 처리하지 못할 경우 운영 체제(OS)에서는 '응답'이 없고 무한루프는 무한정으로 돌고 있으니 문제가 있다고 판정하고 이 프로그램이 정상화되어 쌓인 메시지들을 처리할 때까지 무한정 기다리게 되고 이것이 곧 응답 없음 상태라고 말하는 그것이다.
이것이 서로 동등한 관계의 프로세스에게 발생할 경우 데드락이라고 해서 다른 루틴에서의 개입 없이는 영원히 서로가 서로를 기다리게 되는 상황이 되어버리지만 이 상황에서는 프로그램 하나만 렉이라던지 무한루프에서 못 벗어나는 등 문제가 생긴 것이고 운영 체제(OS)와 일개 프로그램의 사이에는 엄청난 프로그램들이 존재하고 있으므로 운영 체제(OS)는 이 프로그램에게 그냥 '''(응답 없음)''' 딱지를 붙이고 다른 일을 하러 가게 된다. 유저는 그렇게 아무런 반응 없이 하얗게 질려버린 프로그램을 보게 되는 것.
만약 일개 프로그램이 아니라 커널 내에서 이러한 무한 루프나 데드락이 발생할 경우 단지 응답 없음 정도로 끝나지 않고 블루스크린을 동반해버린다.
3. 해결법
'''기다린다.''' (원래 작업시간이 길다면) or '''강제 종료하고 다시 킨다.''' (무한 루프에 걸린 경우)
원인부터가 말 그대로 프로그램이 뭔가 다른 일을 하느라 미처 운영 체제(OS)의 메시지를 처리하지 못한 것이기 때문에 만일 그것이 시간이 많이 걸리는 작업[3] 일 경우 어느 정도의 시간을 기다려 주자. 프로그램은 자기가 할 일을 다 끝내고 다시 메시지를 처리할 것이고 그러면 '응답 없음' 상태에서 자연스럽게 탈출하게 되며 가장 이상적인 해결법.
하지만 논리 오류 등 다른 이유에 의해서 프로그램이 내부적으로 꼬여 있을 경우에는 아무리 오래 기다려도 더이상 작업이 진행되지 않는다. 이 경우는 정말로 강제 종료밖에 답이 없으므로 오래 공들인 작업물이 모두 날아가 버리는 등의 원치 않는 대참사를 막기 위해 문서 작성 등을 할 때는 '''자주 저장을 하는 습관을 들이자.'''
4. 기타
[image]
[~~응~~ [[답 없음]]]
보통 그래픽 작업을 하는 사람들이 제일 싫어하고 무서워하는 것이다. 그 이유는 단순한 문서 작업에 비해 그래픽 작업은 컴퓨터의 자원을 많이 소모하기 때문에 그만큼 응답 없음 상태에 빠지기 쉽기 때문이다.
기본적으로 응답 없음 프로그램을 강제로 종료하려면 5초에서 20초 정도의 딜레이가 생기지만 레지스트리 수정으로 이를 1초 내외로 줄이는 것이 가능하다.[4] 방법은 다음과 같다.
- 레지스트리 편집기(regedit.exe)를 실행한다.
-
폴더에서HKEY_CURRENT_USER\Control Panel\Desktop
- 문자열 값
를 생성한 다음 값을AutoEndTasks
로 지정한다.1
- 문자열 값
을 생성한 다음 값을HungAppTimeout
으로 지정한다.1000
- 문자열 값
을 생성한 다음 값을WaitToKillAppTimeout
으로 지정한다.1000
- 문자열 값
-
폴더에서HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
- 문자열 값
을 생성한 다음 값을WaitToKillServiceTimeout
으로 지정한다.1000
- 문자열 값
- 재부팅한다.
[1] 마우스가 이동하거나 프로그램이 종료되는 것은 물론이고 모니터에 자신을 그려야 된다거나(WM_PAINT) 심지어 특정한 상황(타이머)에서는 '''가만히 있어도 알아서 메시지가 생긴다.'''[2] 무한 루프의 쓰임새 중 하나로 이 무한 루프가 없으면 모든 프로그램(OS 포함)이 시작하자마자 바로 '''지 할 일만 다 하고 광속으로 종료된다.''' 간단히 설명하면 이 무한 루프는 자신의 일을 다 끝냈는지에 대한 체크와도 같은 기능으로 이 무한 루프가 계속 돌고 있고 응답없음이 백지화 상태로 됐다면 자가 점검에서 일이 끝나지 않았다는 신호를 보내는 것.[3] 몇 테라바이트 짜리 파일을 통으로 저장한다던지 아니면 네트워크에서 데이터를 받는 중이라던지 등등... 물론 이런 작업은 일반적으로 스레드를 따로 생성하여 처리한다.[4] 다만 앞서 설명한 것같이 프로그램이 수행중인 연산이 많아서 잠시 응답 없음인데도 강제로 꺼져버리기 때문에 평소에 1~2초 정도의 짧은 응답 없음을 자주 겪는다면 이 방법은 피하는게 좋다. 예시로 알림이 올 때마다 살짝씩 멈추는 PC 카카오톡 특성상 이 방법을 썼다가는 하루에 수십번씩 튕기는걸 볼 수 있다.