2012-08-02 2 views
8

C++에서 제한된 메모리 (Tegra 2)를 사용하는 임베디드 시스템 용 응용 프로그램을 개발 중입니다. 난 때때로 NULL을 처리하는 코드를 통해 newnew[] 전체 처리하지만 응용 프로그램이 처리 할 수 ​​있습니다.CIG에서 메모리를 할당하는 중 SIGKILL

메모리가 완전히 소모되면 시스템이 SIGKILL로 프로세스를 종료한다는 것이 문제입니다. 어쨌든 new은 프로세스를 죽이는 대신 NULL을 리턴해야한다고 말할 수 있습니까?

+1

,하지만 당신은 "새로운 (nothrow)"http://www.cplusplus.com/reference/std/를 사용하려고 할 수 있습니다 new/nothrow/ –

+0

나는 더 많은 양의 메모리를 할당 할 때 대부분의 경우를 수행한다. 어떤 경우에는 new (std :: nothrow)를 새로 작성하기에는 게으르다. 그러나 나는 프로세스가 SIGKILL 대신에 예외로 종료 될 것이라고 생각한다. – Blackhex

답변

11

사용중인 OS 종류가 확실하지 않지만 이 Linux처럼 opportunistic memory allocation을 지원하는지 확인해야합니다. 그것을 사용하는 경우

, 다음과 같은 상황이 발생할 수 있습니다 :

  1. 귀하의 new 또는 malloc는 커널에서 유효한 주소를 가져옵니다. 메모리가 충분하지 않은 경우에도 ...
  2. 커널은 첫 번째 액세스 순간까지 실제로 메모리를 할당하지 않습니다.
  3. "오버 커밋 된"메모리가 모두 사용되면 운영 체제는 관련 프로세스 중 하나를 죽일 수는 없지만 하나만 죽입니다. (충분한 메모리가 없다는 것을 프로그램에 알리는 것은 너무 늦다.) 리눅스에서는 이것을 Out Of Memory Kill (OOM Kill)이라고 부른다. 그런 킬은 커널 메시지 버퍼에 기록됩니다.

솔루션 : 메모리의 해제 overcommitting : 잘 모르겠어요 echo 2 > /proc/sys/vm/overcommit_memory

1

두 가지 아이디어가 떠오 릅니다.

1.) new에 직접 의존하지 않고 자신의 메모리 할당 기능을 작성하십시오. 당신은 임베디드 시스템에 있다고 언급했는데, 특별한 할당자가 어플리케이션에서 흔히 볼 수 있습니다. 하드웨어에서 직접 응용 프로그램을 실행하고 있습니까, 아니면 executive/OS 계층 아래에서 실행중인가요? 후자의 경우, 메모리를 할당하기 위해 제공된 시스템 API가 있습니까?

2.) C++ set_new_handler을 확인하고 도움이되는지 확인하십시오. new 할당이 실패 할 때 특수 함수가 호출되도록 요청할 수 있습니다. 아마도이 함수에서 프로세스를 죽이는 것이 무엇이든지 실행하지 못하도록 조치를 취할 수 있습니다. 참조 : http://www.cplusplus.com/reference/std/new/set_new_handler/

+0

add 1) 예, 해결 방법은 있지만 시스템 구성 기반 솔루션이 될 수있는 경우 지금까지이 방법을 사용하기에는 너무 게으른 방법이었습니다. 오픈 임베디드 배포판이기 때문에 "실제"임베디드 시스템에 비해 상당히 무겁습니다. 특별한 메모리 할당을위한 API가 있는지 나는 모른다. 어떤 힌트? 2) 좋은 통찰력, 나는 그것을 시도 할 것이다. – Blackhex

관련 문제