사용할 메모리가 없는 경우 프로세스는 상황을 어떻게 처리합니까?

사용할 메모리가 없는 경우 프로세스는 상황을 어떻게 처리합니까?

특정 프로세스에서 사용할 메모리가 없다는 사실을 발견하면 어떻게 되나요?

해당 프로세스가 작업을 진행하기 위해 다른 프로세스를 종료/다시 시작합니까?

아니면 이 상황에서 (더 많은 메모리가 필요한) 프로세스는 무엇을 하게 될까요?

가능하다면 이에 관한 좋은 링크를 제공할 수 있습니까?

답변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 킬러는 메모리 부족 조건을 유발한 작업을 종료하도록 구성할 수도 있습니다.

커널 메모리 계산 알고리즘은 설정으로 조정할 수 있습니다 vm.overcommit_memory. 기본값은 오버커밋 전에 약한 경험적 검사를 수행하는 것이지만, 메모리 계산 알고리즘을 엄격 모드로 설정할 수도 있습니다. 여기서 가상 주소 공간 제한은 vm.overcommit_ratio다음 공식에 따라 설정 값에 따라 결정됩니다.

    virtual memory = (swap + physical memory * (overcommit_ratio / 100))

엄격한 메모리 계산을 사용하는 경우 페이지를 저장할 여유 물리적 메모리나 스왑 공간이 충분하지 않으면 커널은 더 이상 익명 페이지를 할당하지 않습니다. 이는 시스템이 필수적이라는 것을 의미합니다.충분한 스왑 공간으로 구성. 메모리 약속을 충족할 만큼 충분한 물리적 메모리나 스왑 공간이 없으면 호출이 malloc()실패할 수 있습니다. 이러한 경우 적절한 조치를 결정하는 것은 프로그램 자체에 달려 있습니다. 일부는 포기하고 완전히 실패할 수도 있지만 메모리 할당이 필요한 작업을 수행하기 위해 더 느리지만 더 메모리 효율적인 알고리즘으로 돌아갈 수도 있습니다.

답변2

이는 프로그램이 수행하도록 구성된 내용에 따라 다릅니다. 간단한 프로그램은 오류 메시지를 인쇄하고 충분한 메모리를 할당할 수 없으면 종료됩니다. 일부 프로그램은 스스로 일부 메모리를 확보하고 다시 시도합니다. 일부 프로그램은 종료하기 전에 긴급 상태 저장을 수행합니다. 일부 프로그램은 사용자에게 일부 명령을 수행할 수 없다고 알린 후 추가 메모리 없이도 어떻게든 계속 작동합니다.

프로세스는 원칙적으로 다른 프로세스를 종료할 수 있지만 이는 매우 이상한 동작입니다. 프로세스는 어떤 프로세스를 종료할지 알 수 없으며 해당 프로세스의 메모리를 확보할 수 있다는 보장도 없습니다.

만약커널에서 메모리 부족이 감지되었습니다.애플리케이션 대신에 커널은 복잡한 경험적 방법(예: "죽이지 마세요 sshd")을 기반으로 일부 프로세스를 종료할 수 있습니다.

관련 정보