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


답변:


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.