WIPIVERSE

자원 누수

자원 누수(resource leak)는 컴퓨터 프로그램이 실행 과정에서 획득한 시스템 자원을 사용 후 적절히 해제(반환)하지 않아 발생하는 자원 소비 현상이다. 이는 일반적으로 프로그램 내의 버그(프로그래밍 오류)에 의해 나타난다.

대표적인 자원 누수의 유형으로는 메모리 누수(memory leak)와 핸들 누수(handle leak)가 있으며, 메모리는 종종 다른 자원들과 별도로 구분되어 다루어지기도 한다. 운영체제에서 제한적으로 사용 가능한 자원의 예로는 인터넷 소켓(network socket), 파일 핸들(file handle), 프로세스 테이블 엔트리(process table entry), 프로세스 식별자(PID) 등이 있다.

자원 누수는 경미한 경우 프로세스 종료 후 회복되며 사소한 성능 저하만 유발하지만, 심각한 경우에는 자원 고갈(resource exhaustion)로 이어져 시스템 둔화, 불안정, 나아가 프로세스나 시스템의 충돌(crash)을 초래할 수 있다. 특히 락(lock)과 같이 한 번에 하나의 프로세스만 사용할 수 있는 유일(uniqure) 자원이 누수되면 즉각적인 자원 고갈과 교착 상태(deadlock)가 발생할 수 있다. 의도적인 자원 누수는 서비스 거부 공격(DoS attack)에 악용되기도 한다.

자원 누수의 주요 원인은 획득된 자원을 반드시 해제해야 한다는 원칙이 지켜지지 않는 데 있다. 흔한 사례로는 파일을 연 후 닫지 않아 발생하는 파일 핸들 누수, 파이프를 닫지 않는 경우, 부모 프로세스가 자식 프로세스에 대해 wait 시스템 호출을 호출하지 않아 프로세스 테이블 엔트리가 누수되면서 자식 프로세스가 좀비 프로세스(zombie process)로 남는 경우 등이 있다.

자원 누수는 자원 관리(resource management) 기법을 통해 예방되고 완화될 수 있다. C++의 RAII(Resource Acquisition Is Initialization)와 같은 프로그래밍 관용구, Java의 try-with-resources 구문, 스마트 포인터(smart pointer) 등의 언어적 구조는 자원을 객체 수명에 연결하여 누수를 방지한다. 많은 자원 누수는 프로세스가 exit 시스템 호출로 종료된 후 운영체제에 의해 회복된다. 따라서 자원 누수는 단기간 실행되는 프로세스보다는 장시간 실행되는 서버나 데몬 프로세스에서 주요한 문제로 간주된다.

둘러보기

더 찾아볼 만한 주제

    전체 문서 보기