메모리 부족 조건을 처리합니까?


답변:


4

충돌을 피하는 것처럼 OOM을 피할 것입니다.

한 번에 엄청난 양의 작업을 수행하지 말고 많은 양의 메모리를 할당하십시오. 디스크에 데이터를 유지하고 OS 디스크 캐시를 신뢰하며 가능한 한 메모리 매핑 된 IO를 사용하며 한 번에 작은 데이터 부분에서만 작동합니다. 대량의 데이터를 온라인 (낮은 대기 시간으로 제공)해야하는 경우 모든 대형 검색 엔진 회사와 마찬가지로 여러 컴퓨터의 메모리에 데이터를 보관하십시오. 또는 SSD를 구입하십시오.


분명히 이것은 가장 의미가 있습니다.
— mbq

2
이 정상적으로 OOM을 처리하는 방법에 대해 많은 논쟁이 있었다 (RAII, 예외 안전 저쩌구 ...)하지만 난 경우에도 복수의 동적 모듈 (타사에서 일부)와 멀티 스레드 시스템이 실현되면 당신의 스레드가하지 않았다 모든 스레드가 OOM을 볼 수있는 불행한 순간 이 있습니다. 한 사람이라도 계속하기로 결정했다면 목격자 외에는 아무것도 할 수 없습니다.
— rwong

13

이 질문에 대답하는 대부분의 사람들은 아마도 malloc이 0을 반환하는 것이 실제로 가능한 임베디드 시스템에서 일한 적이 없을 것입니다. 현재 작업중 인 시스템에는 총 4.25K 바이트의 RAM (4352 바이트)이 있습니다. 스택에 64 바이트를 할당하고 있으며 현재 1600 바이트 힙이 있습니다. 어제 힙 워크 루틴을 디버깅하여 메모리 할당 및 해제를 수행 할 수있었습니다. 힙 워크는 작은 (30 바이트) 정적으로 할당 된 버퍼를 사용하여 직렬 포트로 출력합니다. 릴리스 버전에서는 해제됩니다.

이 제품은 소비자 제품이므로 제품이 출시되면 메모리가 부족하지 않는 것이 좋습니다. 개발 중에는 확실합니다. 어쨌든, 내가 할 수있는 일은 스피커에 몇 번 경고음을 내고 강제로 재부팅하는 것입니다.


2
작은 공간에 기능을
— 맞추는

6
임베디드 시스템의 많은 프로젝트는 단순히 메모리의 동적 할당을 금지합니다. OOM의 유일한 경우는 스택 오버플로입니다.
— mouviciel

당신은 옳지 만, 특히 첫 문장과 관련이 있습니다. 대부분의 개발자는 운 좋게도 대부분의 개발자와 관련이 없습니다.
— Konrad Rudolph

4

솔직히 말해서, 내가 한 모든 프로젝트에서 (아직 아무데도 일하지 않는다는 것을 명심하십시오), 나는 그것이 일어날 수 있다고 생각한 적이 없으므로 프로그램이 매우 빨리 죽을 것이라고 생각합니다.

또한 OOM을 처리하려면 오류 메시지를 표시하거나 모든 것을 저장하기 위해 리소스를 미리 할당해야하므로 불편할 수 있습니다.

요즘 땅콩보다 메모리 비용이 적게 들지만 자주 일어나는 일이 아니라고 생각합니다. 보호 된 기억의 시작과 그 이전에, 그것은 아마도 걱정 이었지만 지금은? 내가 본 유일한 OOM 오류는 버그가있는 코드에서 발생한 것입니다.


프로세스에 이미있는 메모리 중 일부를 회수하고 생존 및 복구 (유용한 것을 덤프하면 하드 메모리) 또는 저장하려고하는 데이터 + 잔존물로 생존하려고합니다.
— mbq

2

malloc 리턴 코드 확인은 일반적으로 아무 의미가 없습니다.

최신 운영 체제는 메모리를 초과 커밋합니다. 실제로 사용 가능한 것보다 많은 메모리를 프로세스에 제공합니다. 프로세스에 부여 된 메모리는 가상이며 모두 단일 제로 아웃 페이지에 매핑됩니다.

물리적이고 고유 한 페이지가 프로세스에 할당되는 것은 메모리에 쓸 때까지는 아닙니다. 이 할당이 실패하면 커널은 메모리를 찾으려고 시도하는 프로세스 (아마도 당신의 것!)를 종료합니다. 이 시점에서 더 이상 할 수있는 일은 없습니다.


긴 잠을 자면서 while 루프에 들어가고 프로세스가 OOM 킬러에서 살아남을 경우 복구 할 생각이있었습니다. 0 주소를 사용하려는 시도로 인해 프로세스가 다소 종료되었다는 인상을 받았지만 확실한 테스트를 수행하지 않았습니다.
— mbq

OOM 킬러를 처리하기 위해 특별한 작업을 수행 할 필요는 없습니다. 프로세스가 트리거되었지만 선택되지 않은 경우 절대 알 수 없습니다. 메모리가 충분한 것처럼 모든 것이 작동합니다. 반면에 프로세스가 선택되면 프로세스가 종료되고 수행 할 수있는 작업도 없습니다.
— Kristof Provost

그러나 OOM이 메모리를 비우기를 기다렸다가 다시 할당하고 계속하려고 할 수 있습니다. malloc / new 가이 일을 기다리고 있지 않다는 인상을 받았습니다.
— mbq

아냐, 못해 당신의 할당은 항상 성공할 것입니다. 원하는 모든 가상 메모리를 얻을 수 있습니다. 실제 메모리가 할당되었다는 것은 당신이 그것을 만질 때까지는 아닙니다. 할당되지 않은 페이지를 터치하자마자 프로세스가 일시 중단됩니다. 커널은 더 많은 메모리를 찾아서 더 많은 메모리를 얻기 위해 프로세스를 종료시킬 수 있습니다. 성공하면 페이지가 할당되지 않고 프로세스가 다시 시작됩니다. 귀하의 프로세스가 이런 일이 발생했음을 알 수있는 방법은 없습니다.
— Kristof Provost

2
창문이 과도하게 커밋되지 않는다고 확신합니다. RAM 이상 스왑 파일 이상 커밋 할 수 없습니다.
— 코드 InChaos

2

임베디드 시스템, 실시간 시스템 또는 실패로 인해 생명 또는 수십억 달러의 비용이 발생할 수있는 매우 중요한 시스템을 개발하지 않는 한 메모리 부족 상황에 대해 걱정할 가치가있는 것은 아닙니다.

대부분의 경우, 새로운 객체를 생성하거나 무언가를 수행 할 수있는 작업을 수행 할 메모리가 없기 때문에 어쨌든 메모리가 부족할 때 수행 할 수있는 작업이 거의 없습니다. OOM을 처리하는 앱과 OOM의 이점을 비교해야합니다.


실시간 시스템은 다른 시스템보다 malloc 오류에 대해 더 많은 것을 확인할 필요가 없습니다.
— zneak

@zneak-사실이 아닙니다. 실시간 시스템은 예측 가능해야하며 특별히 계획하지 않는 한 메모리 부족을 예측할 수 없습니다.
— Erik Funkenbusch

OOM에 도달하면 무엇을 더 하시겠습니까?
— zneak

사용 가능한 메모리, 프로세스 취소 등. 실시간 시스템에는 일반적으로 결정적이어야하므로 가상 메모리 나 스왑 시스템이 없습니다. 따라서 훨씬 쉽게 메모리가 부족할 수 있습니다.
— Erik Funkenbusch

필연적으로 OOM 오류가 발생하는 특정 코드 경로를 고려할 때 메모리 해제 및 프로세스 취소보다 충돌이 덜 결정 론적 접근 방법인지 알 수 없습니다.
— zneak

1

항상 오류를 확인합니다. 무언가가 오류 조건을 반환하면 프로그램에서 처리해야합니다. "메모리가 부족합니다!"라는 메시지 일지라도 "액세스 위반", "코어 덤프"또는 그 밖의 것보다 낫습니다. 하나는 처리하는 오류 상태이고 다른 하나는 버그입니다. 그리고 사용자는 그것을 그대로 인식 할 것입니다.

특정 경우에 대해 작업을 롤백하고 실패 지점에 도달하고 오류를보고하며 실행을 계속할 때까지 할당 한 리소스를 해제하려고 시도 할 수 있습니다 (응용 프로그램을 종료하려고 할 때 즉시 종료 옵션). 이런 식으로 사용자는 무엇을해야할지 결정하거나 파일을 닫거나 닫는 등의 방법으로 메모리를 확보하려고 할 수 있습니다. 물론 상황을 처리하는 방법은 프로그램에 크게 의존합니다. 대화식으로 오류를 기록하고 종료하거나 계속하면됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.