2013-08-05 3 views
10

인터뷰 질문을했다 :이 루프는 몇 번 실행됩니까?

이 루프는 2 gb 램과 8 gb 램에서 실행됩니다 얼마나 많은 시간
while(1) 
{ 
void * a = malloc(1024*1024); 
} 

?

메모리가 가득차더라도 종료 조건이 없으므로 무한 루프가 발생했습니다. 그는 동의하지 않습니다. 나는 지금 전혀 몰라. 도와주세요.

+6

@Nobilis 메모리가 가득 차면 malloc()은 NULL을 반환합니다. –

+0

그리고 왜 아래로 투표 ??? –

+0

@ H2CO3 그래, 나는 그것에 대해 생각하고 사실 malloc 호출이 NULL을 반환하고 계속 주석을 제거하므로 segfault가 보장되지는 않는다. – Nobilis

답변

9

무한정 실행해야합니다. 대부분의 플랫폼에서 사용할 수있는 메모리가 더 이상없는 경우 malloc()은 0을 반환하므로 할당 된 메모리 양을 변경하지 않고 루프가 계속 실행됩니다. 리눅스는 메모리 과다 약속을 허용하여 malloc() 호출이 가상 메모리에 계속 추가됩니다. malloc()이 메모리를 관리하기 위해 사용하는 데이터가 문제를 일으키기 시작하면 (결국 코드가 사용하지 않기 때문에 할당 된 메모리 자체를 사용하려고하기 때문에) 프로세스가 OOM 킬러에 의해 종료 될 수 있습니다. 그러나 Linux 문제의 플랫폼으로 규정되어 있지 않습니다.

+0

OOM 킬러는 메모리가 실제로 사용되는 즉시 조치에 들어갑니다. 필자가 할당되지 않은 메모리를 유지하는 한 아무 일도 일어나지 않아야한다. – glglgl

+0

흠, 틀렸어. 1 MiB malloc 크기로 관리 데이터가 커져 결국 64 비트 시스템의 메모리를 가득 채 웁니다. 1 GiB malloc 크기를 사용하면 가상 메모리 크기가 107t로 빨라지고 (top에 따라) 프로그램이 무기한 실행됩니다. – glglgl

+0

@glglgl : 그렇습니다.하지만 malloc()이 할당 된 것을 유지하기 위해 메모리에 쓰기를해야만하고, 그 시점에서 OOM Killer가 작동 할 수도 있습니다. –

관련 문제