2013-08-05 6 views
10

Интервью задаваемый вопрос:Сколько раз этот цикл будет работать?

while(1) 
{ 
void * a = malloc(1024*1024); 
} 

Сколько раз этот цикл будет работать на 2 gb барана и 8 gb барана?

Я сказал бесконечный цикл, потому что нет условия завершения, даже если память будет заполнена. Он не согласен. У меня нет никакой идеи сейчас. Пожалуйста, помогите.

+6

@Nobilis Если память заполнена, 'malloc()' возвращает 'NULL'. –

+0

И почему голос? –

+0

@ H2CO3 Да, я подумал об этом, и на самом деле нет гарантии, что он будет segfault, поскольку вызов malloc просто вернет NULL, удалит комментарий. – Nobilis

ответ

9

Он должен работать бесконечно. На большинстве платформ, когда памяти больше нет, malloc() вернет 0, поэтому цикл будет продолжать работать без изменения объема выделенной памяти. Linux позволяет переназначать память, так что вызовы malloc() продолжают добавляться в виртуальную память. Процесс может в конечном итоге быть убит OOM Killer, когда данные, которые malloc() использует для администрирования памяти, начинают вызывать проблемы (это будет не потому, что вы пытаетесь использовать выделенную память, потому что код ее не использует), но Linux не рассматривается как платформа в вопросе.

+0

Убийца OOM будет действовать, как только память действительно будет использоваться. Пока я сохраняю память, которую я не написал, ничего не должно произойти. – glglgl

+0

Хм, я был неправ. С размером 1 мегабайт MiB данные администрирования становятся настолько большими, что они в конечном итоге заполняют память на 64-битной системе. При размере 1 мегабайт GiB размер виртуальной памяти становится равным 107 т (согласно 'top'), и программа работает неограниченно долго. – glglgl

+0

@glglgl: yes - но вы можете достигнуть точки, где 'malloc()' должен записывать в память, чтобы сохранить свои списки того, что она выделила, и в этот момент OOM Killer может перейти в действие. –