분명히 나는 보통 달리지 않습니다.
#include <stdlib.h>
int main() {
while (malloc(50));
return 0;
}
하지만 저는 대규모 프로젝트를 컴파일하려고 노력해 왔습니다. 을( 를) 실행하는 동안 cmake
내 컴퓨터의 리소스가 고갈되고 컴퓨터 속도가 느려져 몇 분 동안 사용할 수 없게 됩니다. 그러다가 갑자기 내 컴퓨터가 다시 응답했습니다 cmake
. SIGKILL
해결책은 를 cmake
실행하여 작업 수를 제한하는 것이었습니다 -j2
.
그러나 위에 표시된 간단한 "메모리 부족" 프로그램을 실행한 후, 처음에 내 시스템이 과부하된 것을 발견하고 놀랐습니다. 매뉴얼 페이지에 따르면 , malloc()
사용 가능한 메모리가 없으면 malloc
단순히 반환됩니다 0
. 내 시스템이 메모리 문제를 인식하지 못하고 malloc
실패를 선택하는 이유는 무엇입니까?
즉, 프로그램이 메모리를 모두 차지하여 시스템이 느려지도록 시스템을 구성할 수 있는 방법을 찾고 있습니다. 마찬가지로, 항상 내 DE의 우선순위를 지정하도록 스케줄러를 설정하는 방법이 있습니까?
저는 KDE를 사용하여 Linux 5.6.6.arch1-1 x86_64를 실행하고 있습니다. 감사해요.
답변1
malloc() 매뉴얼 페이지에 따르면, malloc은 사용 가능한 메모리가 없으면 단순히 0을 반환합니다.
이 경우 코드가 종료되는 방식으로 지정됩니다. 하지만 선점된 것 같습니다.
Linux에는 악성 프로세스를 식별하여 종료하고 프로세스가 수행하는 작업을 기록하는 OOM(메모리 부족) 킬러가 있습니다. 그러나 조기에 실행하지 않으려고 노력합니다.
폴라이트 애플리케이션은 시스템에 구성을 쿼리하고 이에 따라 동작을 조정하는 것으로 알려져 있습니다. 분명히 cmake는 그중 하나가 아닙니다.
답변2
RAM이 부족하면 시스템이 디스크로 교체되기 시작하는 것 같습니다. 디스크는 RAM보다 훨씬 느리기 때문에 속도가 느려집니다. 어떤 시점에서는 가상 메모리도 고갈되고 Linux의 Out of Memory Killer가 시작되어 악의적이라고 생각되는 프로세스를 선택하여 종료합니다(표시되는 SIGKILL이 바로 이것이다). 이렇게 하면 시스템을 계속 사용할 수 있습니다.
프로세스에 사용 가능한 RAM의 양을 제한하여 이러한 일이 발생하는 것을 방지할 수 있습니다. 예를 들어 CMake에 사용 가능한 메모리 양을 100MB로 제한하려면 다음을 수행하세요.
ulimit -v 100000
cmake <args>
RAM(-m)과 가상 메모리(-v)에 대해 별도의 제한을 설정할 수 있습니다. 사용 가능한 메모리가 없으면 malloc()
널 포인터가 반환됩니다. 잘 작성된 소프트웨어는 이를 현명하게 처리해야 하지만 다른 소프트웨어는 널 포인터를 역참조할 때 분할 오류로 인해 중단될 수 있습니다.