특정 프로세스에서 사용 가능한 메모리가 없음을 발견하면 어떻게 됩니까?
프로세스가 작업을 계속하기 위해 다른 프로세스를 종료/다시 시작합니까?
아니면 이 경우(더 많은 메모리가 필요한 프로세스) 어떻게 됩니까?
가능하다면 누구든지 이와 관련된 좋은 링크를 제공할 수 있습니까?
답변1
일부 요청 페이징 가상 메모리 시스템에서 운영 체제는 익명 페이지(즉, 런타임 데이터, 프로그램 스택 등과 같이 파일 시스템 소스가 없는 데이터가 포함된 페이지)를 교환할 수 있는 충분한 스왑 공간이 없으면 할당을 거부합니다. 물리적 메모리를 해제하기 위한 페이지입니다. 이러한 엄격한 계산의 장점은 각 프로세스가 할당된 만큼의 가상 메모리에 대한 액세스를 보장한다는 것입니다. 그러나 이는 사용 가능한 가상 메모리의 양이 본질적으로 스왑 공간의 크기에 의해 제한된다는 의미이기도 합니다.
Linux 커널의 메모리 통계는 프로세스가 실제로 사용하는 메모리 양을 추적하여 사용하는 것보다 더 많은 메모리를 할당하는 경향이 있는 프로그램을 보상하려고 시도합니다.과도하게 커밋하다가상 메모리의 양. 즉, 커널이 할당한 가상 메모리의 양은 시스템의 실제 메모리와 스왑 공간을 합친 것보다 클 수 있습니다. 실제로 이는 메모리 할당이 malloc()
결코 실패하지 않음을 의미합니다. 이를 통해 물리적 메모리와 스왑 공간을 더 잘 활용할 수 있지만, 사용된 메모리 양이 사용 가능한 물리적 메모리 및 스왑 공간의 양을 초과하는 경우 커널은 메모리 할당 약속을 충족하기 위해 어떻게든 메모리 리소스를 확보해야 한다는 단점이 있습니다.
재사용을 채우기 위해 메모리를 회수하는 커널 메커니즘을 호출합니다.메모리 부족 킬러(OOM 킬러). 일반적으로 이 메커니즘은 메모리를 많이 차지하는 "불량" 프로세스를 종료하여 다른 프로세스를 위해 메모리를 확보합니다. OOM-killer 및 메모리 계산 알고리즘의 동작을 sysctl
설정하거나/proc/sys/vm
. 0이 아닌 값으로 설정 하면 vm.panic_on_oom
시스템 메모리가 부족할 때 커널에 패닉이 발생합니다.
OOM-killer에서 사용하는 경험적 방법은 vm.oom_kill_allocating_task
설정을 통해 수정할 수 있습니다. 기본적으로 OOM-killer는 작업 목록을 검사하고 메모리 집약적인 악성 작업을 선택하여 종료합니다. OOM-killer는 메모리 부족 상태를 유발하는 작업을 종료하도록 구성할 수도 있습니다.
커널 메모리 통계 알고리즘은 설정을 통해 조정할 수 있습니다 vm.overcommit_memory
. 기본값은 오버커밋 전에 약한 경험적 검사를 수행하는 것이지만 메모리 계산 알고리즘을 엄격 모드로 설정할 수도 있습니다. 여기서 가상 주소 공간 제한은 vm.overcommit_ratio
다음 공식에 따라 설정된 값에 의해 결정됩니다.
virtual memory = (swap + physical memory * (overcommit_ratio / 100))
엄격한 메모리 통계를 사용할 때 페이지를 저장할 수 있는 여유 물리적 메모리나 스왑 공간이 충분하지 않으면 커널은 더 이상 익명 페이지를 할당하지 않습니다. 이는 시스템이 다음을 수행해야 함을 의미합니다.충분한 스왑 공간이 구성되었습니다.. 메모리 약속을 충족할 만큼 충분한 물리적 메모리나 스왑 공간이 없으면 호출이 malloc()
실패 할 수 있습니다. 이러한 상황에서 적절한 조치 과정을 결정하는 것은 프로그램 자체에 달려 있습니다. 일부는 포기하고 완전히 실패할 수도 있지만 메모리 할당이 필요한 작업을 수행하기 위해 더 느리지만 메모리 효율적인 알고리즘으로 돌아갈 수도 있습니다.
답변2
이는 프로그램 구성에 따라 다릅니다. 간단한 프로그램은 단지 오류 메시지를 인쇄한 다음 충분한 메모리를 할당할 수 없을 때 종료됩니다. 일부 프로그램은 스스로 일부 메모리를 확보한 후 다시 시도합니다. 일부 프로그램은 종료하기 전에 긴급 상태 저장을 수행합니다. 일부 프로그램은 특정 명령을 실행할 수 없다는 것을 사용자에게 알린 후에도 추가 메모리 없이 계속 실행됩니다.
원칙적으로 한 프로세스가 다른 프로세스를 종료할 수 있지만 이는 매우 이상한 동작입니다. 프로세스는 어떤 프로세스를 종료할지 알 수 없으며 해당 프로세스의 메모리를 얻을 수 있다는 보장도 없습니다.
만약에커널이 메모리 부족을 감지합니다.sshd
커널은 애플리케이션이 아닌 복잡한 경험적 방법(예: "종료하지 마세요")을 기반으로 특정 프로세스를 종료할 수 있습니다 .