2013-02-08 1 views
1

할당 할 50MB가 있고 각 반복에서 메모리를 할당하는 this for 루프가 있다고 가정합니다. 다음 for 루프가 실행되면 어떻게됩니까? {사용 가능한 메모리를 초과하여

int *p = malloc(5MB); 

}

내가 인터뷰에서이 같은 질문을했다

는 대한 (; 난 < (20) 내가 + + I = 0 INT). 누군가 나를 이런 식으로 인도하고 그러한 상황을 이해하기 위해 배워야하는 필요한 주제로 안내 할 수 있습니까?

+0

50MB는 실제 메모리 또는 사용 가능한 주소 공간을 참조합니까? (가상 메모리가있는 시스템에 있다고 가정합니다.) 인터뷰 질문에 반드시 간단한 대답이있는 것은 아닙니다. – millimoose

+0

@millimoose : 답장을 보내 주셔서 감사합니다. 나는이 50MB가 실제 메모리를 언급하는 것에 대해서는 언급하지 않았다. 또한 시스템에는 가상 메모리가 있습니다. 나는 가상 메모리가 초과 메모리 할당을 처리 할 것이라는 대답에서 가상 메모리를 참조했다. 면접관은 만족 스러웠지만 자세히 설명하길 원했습니다. 좀 더 자세한 정보를 알려주시겠습니까? – user1225752

답변

2

가상 메모리를 사용하는 시스템 인 경우 malloc이 null 포인터를 실패하고 반환하는 것보다 상황이 분명 복잡합니다. 이 경우 malloc 호출은 가상 주소 공간에 메모리 페이지를 할당하게됩니다. 이 메모리에 액세스하면 페이지 폴트가 발생하고 os 메모리 관리자에게 제어가 주어지며 가상 메모리 페이지가 실제 메모리 페이지로 매핑됩니다. 사용 가능한 실제 메모리가 가득 차면 메모리 관리자는 현재 실제 메모리에있는 데이터를 디스크 백업에 쓰거나 (또는 ​​디스크 파일로 이미 백업 된 경우이 데이터를 버리고)이 페이지 매핑을 다시 매핑하여 추가 페이지 폴트를 처리합니다 원래 페이지 오류를 일으킨 가상 메모리 페이지에 대해 사용 가능한 실제 메모리. 이전에 디스크 백업에 기록 된 가상 주소 페이지에 액세스하려고 시도하면 유사한 프로세스가 발생합니다.

위키 백과에는 다양한 OS에 대한 구현 세부 정보가 포함되어 있으며이 프로세스에 대한 기본적인 개요가 포함되어 있습니다 (http://en.wikipedia.org/wiki/Paging). 보다 자세한 정보는 여러 다른 출처에서 구할 수 있습니다 (예 : 인텔 아키텍처 소프트웨어 개발 매뉴얼 (http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html)

0

malloc (예 : http://www.cplusplus.com/reference/cstdlib/malloc/)에 대한 문서에 따르면 5MB 메모리 블록에 대한 포인터가 표시됩니다 (malloc의 인수는 MB가 아닌 필요한 바이트 수임을 유의하십시오.) 처음 10 번 사용 가능한 50MB 중에서 추출 된 malloc의 공간과 관련된 오버 헤드가 있으면 아마 9 번)이 공간에 대한 포인터가 반환됩니다. 이 다음으로 5MB의 메모리 덩어리를 사용할 수 없으며 malloc이 실패하고 널 포인터가 반환됩니다.

+0

답장을 보내 주셔서 감사합니다. 계산을 쉽게하기 위해 malloc에서 5MB를 언급했습니다. – user1225752