2011-11-21 3 views

답변

5

스마트 스답은 "예, 어떤 이유로 메모리 할당이 실패 할 수 있습니다"입니다. 그것은 당신이 찾고있는 것이 아닐 수도 있습니다.

일반적으로 시스템에 사용 가능한 메모리가 남아 있는지 여부는 할당이 성공하는지 여부와 관련이 없습니다. 오히려 문제는 프로세스 주소 공간에 여유 공간이 있는지 여부입니다. virtual address space.

할당자는 (malloc, operator new, ...)가 매핑 이미 현재 프로세스에서 무료로 주소 공간이 존재하는 경우, 즉, 보이는 커널이 주소를 사용할 수 있어야 것을 알고있다. 존재하는 경우, 주소 공간은 할당 자에 예약되어 리턴됩니다.

그렇지 않으면 커널에 새 주소 공간을 프로세스에 매핑하라는 메시지가 표시됩니다. 이 일 수 있지만 일반적으로 매핑은 실제 메모리를 사용하지 않는다. 따라서 누군가가이 주소에 액세스하려고하면 커널이 실제 메모리를 찾아서 MMU 테이블은 가상 -> 물리적 인 변환으로 찾는다.

시스템 메모리가 부족하고 실제 메모리가 남아 있지 않으면 프로세스가 일시 중단되고 커널은 다른 프로세스의 메모리를 디스크로 옮겨 실제 메모리를 확보하려고 시도합니다. 단일 어셈블러 명령을 실행하는 데 오랜 시간이 걸렸습니다.

매핑 된 빈 영역이 충분하지 않고 커널이 매핑을 설정하기를 거부하면 프로세스의 메모리 할당이 실패합니다. 예를 들어, 대부분의 운영 체제는 커널을 특정 주소 (일반적으로 0x80000000, 0xc0000000, 0xe0000000 또는 32 비트 아키텍처의 일부)에 매핑하기 때문에 모든 가상 주소를 사용할 수있는 것은 아니므로 프로세스 당 한도가 시스템 제한 (예 : Windows에서 32 비트 프로세스는 시스템이 64 비트 인 경우에도 2GB 만 할당 할 수 있음) 파일 매핑 (예 : 프로그램 자체 및 DLL)은 사용 가능한 공간을 추가로 줄입니다.

0

매우 일반적이며 이론적 인 대답은 아니오 일 수 있습니다. 아주 특별한 상황에서 실패 할 가능성이있는 이유 중 하나는 사용 가능한/할당 가능한 메모리가 이상하게 조각 나있을 수 있다는 것입니다. 나는 당신이 (아마도 아주 사소한) 성능 향상 (pointer == NULL - 일종의 경우)을 시도하고 있는지 궁금해하고 있으며, 그것을 토론하고 싶다면, 아마도 채팅을 사용해야 할 것이다.

0

예, 32 비트 응용 프로그램에서 메모리 공간이 부족하면 메모리 할당이 실패하는 경우가 많습니다 (OS 버전 및 설정에 따라 2, 3 또는 4GB가 될 수 있음). 이것은 메모리 누출 때문일 것입니다. OS에서 스왑 파일의 공간이 부족한 경우에도 오류가 발생할 수 있습니다.