이 있을 확인해야합니다 후에는 메모리 할당할 때 커널을 사용하여 오버 커밋 메모리

StackOverflow https://stackoverflow.com/questions/2248995

  •  20-09-2019
  •  | 
  •  

문제

그것은 일반적인 관행을 확인 NULL(지 메모리가 성공적으로 할당된 것)malloc(),어떤 것처럼

void *ptr = malloc(10);    
if (ptr != NULL) {  
  // do some thing usefull  
} else {  
 // no memory. safely return/throw ...  
}  

메모리 오버 커밋에서 사용하는 커널이 있는 기회를 얻 NULL?해야 하 관행을 따르의 종교적으로 확인에 NULL 을 각 할당?이 malloc NULL 을 반환에도 불구의 적극적인 오버 커밋하는 메커니즘(나 값 1)?

사실 안드로이드 커널을 사용하여 메모리 오버 커밋(에 대해 확실하지 않은 값을 사랑하는 것 그것을 알고 있(오버 커밋 값)와 그것의 중요성).의 일부 프레임워크 소스(C/C++)코드 안드로이드(수 있는 제 3 자)이 확인되지 않 NULL 도 catch bad_alloc 후에 할당입니다.나는 뭔가?

거기에 몇 가지에서 스레드도에 대한 오버 커밋 메모리,하지만 그들의 아무도 해결되 나 혼란이 있습니다.

편집: 는 경우에 적극적인 오버 커밋이 사용되는 NULL 늘 반환할(가정 1)입니다.이 없는 경우 물리적 메모리를 사용할 수 있고에 액세스하려고 할당된 메모리(쓰기에서 메모리를 할당),OOM 을 죽일 것이 어떤 과정 및 할당하는 메모리를 위한 응용 프로그램까지 그가 죽는(가정 2).어느 경우에는 모든 필요한 검사 NULL(메모리 할당 받고 또는다).나는 바로 내 가정을?
휴대 가능은 아니에 대한 관심은 이 질문입니다.

도움이 되었습니까?

해결책

예, 여전히 반환 된 실패를 확인해야합니다. malloc. 메모리를 과도하게 커뮤니케이션하는 환경에서는 이전 통화에 의해 프로그램에 할당 된 주소 공간의 일부에 쓸 때 필요한 물리적 저장소가 부족하여 실패로 인해 실패를 감지하고 복구 할 수 없습니다. malloc.

그러나 이것이 유일한 문제는 아닙니다. malloc 전통적인 환경에서 실패합니다. 프로그램의 주소 공간이 파편화되었을 때 특히 큰 메모리 블록에 대한 요청은 요청을 충족시키기에 충분한 총 물리적 메모리가 있더라도 실패 할 수 있습니다. 연속적인 무료 주소 공간이 없기 때문에 malloc 실패해야합니다. 이 유형의 실패는 신호를 보내야합니다 malloc 반환 NULL, 환경이 메모리를 과도하게하는지 여부.

다른 팁

NULL의 반품 값을 확인해야합니다 모든 시각. 모든 라이브러리 기능이 실패 할 수 있습니다. fclose ()조차도 (연결이 끊어진 NFS 공유에서, 그리고 NFS 파일의 fclose의 오류는 데이터가 저장되지 않았다는 것을 의미합니다).

대부분의 소프트웨어는 잘못 작성되었으며 모든 수표를 포함하지는 않습니다.

Malloc은 Null 또는 Pointer 이외의 것을 반환 할 수 없습니다. 전적으로 또는 전혀. 10을 요청하면 Malloc에서 1 바이트를 얻을 수 없습니다.

커널이 지나치게 경쟁 할 수없는 메모리를 가지고 있는지 여부에 관계없이 모든 기능 호출에서 종교적으로 null을 검사하는 것이 좋습니다.

아래의 다음 코드 세그먼트는 호출을 확인하는 방법을 보여줍니다. malloc 일했는지 아닌지 ...

void *ptr = malloc(10);
if (ptr != NULL){
   /* Do something here with ptr */
}else{
   /* Do something here if it fails */
}

파일 작업, 이름을 지정하는 메모리 작업이지만 몇몇은 실패시 NULL을 반환합니다.

이것이 도움이되기를 바랍니다.

음...리눅스에서 이 메모리 페이지를 백업(처음)만 만 페이지 백업 후에는 먼저 읽기/쓰기 OS 에서 실패하는 것은 당신을 제공하는 메모리(지 않는 한 당신이 지쳐 주소 공간,무언가를 가능하지 않에서 64 비트 시스템).그래서 그리고 그것을 밖으로 실행하는 경우의 메모리고 줄 수 없습니다 당신은 약속의 메모리 OOM 킬러니다 그냥 죽일 응용 프로그램 또는 다른 응용 프로그램을 줄 당신은 페이지를 백업을 필요합니다.그래서 당신은 NULL 체크인 또는지,아웃 와 같은 충돌.......

아니요, Malloc의 결과를 확인할 필요가 없습니다.

Malloc이 실패하기 오래 전에 운영 체제는 이미 많은 문제가 발생했습니다.

"Oom-Killer와 Overcommit"가 더 나은 선택이 될 것입니다.

뭐? 운영 체제가 "Oom-Killer 및 Overcommit"을 지원하지 않습니까?

이것이 Linux (또는 Android)로 전환 해야하는 이유입니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top