자원 누수

자원 누수(resource leak)는 프로그램에 의한 자원소비의 한 종류로서 이 프로그램이 자신이 획득했던 자원들을 놓지 않을 때 일어난다. 이 조건은 보통 프로그램 내의 버그에 의해 나타난다. 전형적인 자원 누수로는 메모리 누수핸들 누수 등이 있으며, 참고로 메모리는 종종 다른 자원들과 독립적으로 고려된다.[1]

운영체제에서 제한적으로 사용 가능한 자원으로는 인터넷 소켓, 파일 핸들, 프로세스 테이블 엔트리 그리고 프로세스 식별자(PID)가 있다. 자원 누수는 종종 사소한 문제로써 사소한 늦어짐만 유발하고 프로세스가 종료된 후에 회복된다. 어떤 경우에는 자원 누수가 중요한 문제가 될 수 있는데 이 경우는 자원 고갈과 심각한 시스템 둔화 또는 불안정이 유발되고 자신을 포함한 여러 프로세스들이 충돌될 수 있다.[2]자원 누수는 종종 경량이나 짧은 런타임 시에는 알아채지 못하다가, 무거운 시스템 로드 또는 오랜 기간 실행 시에 발생할 수 있다.[3]

자워 누수는 특히 매우 낮은 양의 자원이 사용 가능할 때 문제가 된다. Lock 같은 유니크한 자원이 누수되는 경우 즉각적인 자원 고갈이 발생하고 이것은 교착 상태까지 유발한다. 의도적인 자원 누수는 서비스 거부 공격에 사용될 수 있다.

원인

자원 누수는 일반적으로 프로그래밍 오류에 의해 발생한다. 획득된 자원은 반드시 놓아져야 하지만 획득과 놓아주기 사이의 기간 동안 많은 일이 벌어질 수 있고 놓아주기를 놓치기가 쉽다.

매우 흔한 예시는 열렸던 파일의 닫기가 이루어지지 않아 파일 핸들 누수가 발생하는 것이다. 또한 파이프의 경우에도 발생한다. 다른 예시로 부모 프로세스가 자식 프로세스에 시스템 호출 wait를 호출하는 것을 잊는 경우가 있는데 이 경우는 프로세스 테이블 엔트리가 누수되면서 자식 프로세스를 좀비 프로세스로 만든다.

예방과 완화

자원 누수는 자원 관리를 통해 예방되고 관리될 수 있다. 프로그래밍 기법들과 언어 구조들은 자원을 즉각적으로 놓아줌으로써 누수를 방지한다. 많은 자원 누수가 운영체제에 의해  exit 시스템 호출 이후에 고쳐진다.

자원 누수는 그러므로 오래 생존하는 프로세스에서 주요한 문제이다.

같이 보기

각주