메모리 부족

메모리 부족(Out of memory, OOM)은 프로그램이나 운영체제가 사용할 추가 주기억장치를 할당할 수 없는 컴퓨터 작동의 원치 않는 상태이다. 이러한 시스템은 더 이상 프로그램을 로드할 수 없으며, 많은 프로그램이 실행 중에 추가 데이터를 메모리로 로드할 수 있으므로 이러한 프로그램은 제대로 작동하지 않게 된다. 이는 일반적으로 디스크 스왑 공간을 포함한 사용 가능한 모든 메모리가 할당되었기 때문에 발생한다.

역사
역사적으로 메모리 부족 상태는 초기 프로세서가 많은 양의 메모리를 처리할 수 없었을 뿐만 아니라 비용 고려 사항으로 인해 초기 컴퓨터와 운영체제가 소량의 물리적 랜덤 액세스 메모리 (RAM)로 제한되었기 때문에 현재보다 더 흔했다. 가상 메모리의 등장으로 스왑 공간 사용의 문이 열린 이후로 이러한 상태는 덜 빈번해졌다. 거의 모든 최신 프로그램은 런타임에 메모리를 자유롭게 할당 및 할당 해제할 수 있을 것으로 예상하며, 이러한 예상이 충족되지 않으면 통제할 수 없는 방식으로 실패(충돌)하는 경향이 있다. 이전 프로그램은 메모리를 한 번만 할당하고, 모든 작업을 수행하기에 충분한지 확인한 다음, 더 이상 필요하지 않을 것으로 예상했다. 따라서 이러한 프로그램은 즉시 "메모리 부족" 오류(OOME) 메시지와 함께 실패하거나 예상대로 작동했다.

MS-DOS와 같은 초기 운영체제는 다중작업을 지원하지 않았다. 프로그램에는 필요에 따라 사용할 수 있는 물리적 메모리가 할당되었다. 물리적 메모리는 종종 부족한 자원이었고, 상주 종료 기능과 같은 응용 프로그램에 의해 소진되었을 때, 실행 중인 응용 프로그램이 닫힐 때까지 더 이상 응용 프로그램을 시작할 수 없었다.

현대 운영체제는 가상 메모리를 제공하며, 이 메모리에서 프로세스는 메모리 범위를 부여받지만, 메모리는 실제 물리적 RAM에 직접적으로 대응하지 않는다. 가상 메모리는 물리적 RAM, mmap (유닉스 계열) 또는 MapViewOfFile (Windows)을 통한 디스크 파일, 또는 스왑 공간으로 백업될 수 있으며, 운영체제는 필요에 따라 가상 메모리 페이지를 이동할 수 있다. 가상 메모리는 물리적 메모리에 의해 백업될 필요가 없기 때문에, 가상 메모리의 고갈은 드물고, 일반적으로 운영체제에 의해 자원 소비에 대한 다른 제한이 부과된다.

무어의 법칙에서 예측한 바와 같이, 모든 컴퓨터의 물리적 메모리 양은 거의 기하급수적으로 증가했지만, 이는 프로그램과 파일 자체가 더 커지는 경향으로 인해 어느 정도 상쇄된다. 일부 경우, 로드된 데이터의 대부분이 하드 디스크에 상주하는 가상 메모리 지원 컴퓨터는 물리적 메모리는 부족하지만 가상 메모리는 부족하지 않아 과도한 페이징을 유발할 수 있다. 스래싱으로 알려진 이 상태는 일반적으로 일부 프로그램이 닫히거나 시스템이 재부팅될 때까지 컴퓨터를 사용할 수 없게 만든다. 이러한 이유로 현대 컴퓨터에서는 메모리 부족 메시지가 거의 발생하지 않는다.

그러나 현대 컴퓨터에서도 OOM 조건이 발생할 수 있다. 현대 컴퓨터에서 일반적인 OOM 사례는 운영체제가 더 이상 가상 메모리를 생성할 수 없을 때 발생한다. 이는 모든 잠재적 백업 장치가 가득 찼거나 최종 사용자가 비활성화했기 때문이다. 이 조건은 fork() 후 복사-쓰기로 인해 발생할 수 있다.

복구
리눅스와 같은 운영체제의 커널은 OOM 킬러로 알려진 메커니즘을 통해 하나 이상의 프로세스를 종료하여 이러한 종류의 OOM 상태에서 복구하려고 시도한다.Linux OOM Killer 리눅스 4.6 (2016년 5월 출시)은 OOM 상황에서 변화를 도입하여 감지 및 신뢰성을 향상시켰다. OOM 킬러의 cgroup 인식은 2018년 10월에 출시된 리눅스 커널 4.19에서 구현되었으며, 이는 cgroup을 단일 단위로 종료할 수 있는 기능을 추가한다.

일부 리눅스 시스템에서 OOM 킬러의 늦은 활성화로 인해, 너무 늦기 전에 OOM 상태에서 메모리를 복구하는 데 도움이 되는 여러 데몬과 커널 패치가 있다.

 earlyoom
 nohang
 Systemd-oomd
 PSI (압력 스톨 정보) 커널 패치와 동반되는 oomd 데몬. 이 패치는 리눅스 커널 4.20에 병합되었다.

프로세스별 메모리 제한
시스템 전체 물리 메모리 제한 외에도 일부 시스템은 각 프로세스가 사용할 수 있는 메모리 양을 제한한다. 일반적으로 정책 문제이지만, OS가 프로세스 수준에서 사용 가능한 주소 공간보다 더 큰 주소 공간을 가질 때도 이러한 제한이 발생할 수 있다. 일부 고성능 32비트 시스템(예: 물리 주소 확장이 활성화된 시스템)은 8 기가바이트 이상의 시스템 메모리를 제공하지만, 단일 프로세스는 32비트 평면 메모리 모델에서 그 중 4GB만 접근할 수 있다.

프로세스별 제한을 초과하고 추가 메모리 할당을 시도하면 오류 상태가 발생한다. 예를 들어, 메모리 할당을 위한 C 표준 함수인 Malloc()은 NULL을 반환하며 잘 동작하는 응용 프로그램은 이 상황을 처리해야 한다.

 각주 

 외부 링크 
 메모리 부족 처리
기사 "응용 프로그램 하위 프로세스 생성을 위한 메모리 사용 최소화"  by 그레그 나키모프스키
기사 "OOM 킬러 길들이기" by 골드윈 로드리게스
기사 "리눅스가 메모리가 부족할 때" by 물랴디 산토사
논문 "“메모리 부족” 오류 처리 " by 존 보이랜드

분류:메모리 관리
분류:컴퓨터 오류