2013-08-05 26 views
10

Mülakat soru soruldu:Bu döngü kaç kez çalışır?

bu döngü bir 2 gb ram ve 8 gb ram çalışacağını kaç kere
while(1) 
{ 
void * a = malloc(1024*1024); 
} 

?

Sonsuz döngü dedim çünkü bellek dolu olsa bile sonlandırma koşulu yoktur. O katılıyorum. Şimdi hiçbir fikrim yok. Lütfen yardım edin.

+6

@Nobilis Bellek doluysa, 'malloc()' 'NULL 'değerini döndürür. –

+0

Ve neden aşağı bir oy ??? –

+0

@ H2CO3 Evet, bunun hakkında düşündüm ve aslında malloc çağrısı NULL döndürmeye devam edecek, yorum kaldırılırken segfault olacağını garanti etmez. – Nobilis

cevap

9

Süresiz olarak çalıştırılmalıdır. Çoğu platformda, daha fazla bellek olmadığında, malloc(), 0 değerini döndürecek, böylece döngü, ayrılan bellek miktarını değiştirmeden çalışmaya devam edecektir. Linux, bellek aşırı bağlılığına izin verir, böylece malloc() çağrıları sanal belleğe eklemeye devam eder. Süreç, malloc()'un belleği yönetmek için kullandığı veriler sorun yaratmaya başladığında OOM Killer tarafından eninde sonunda öldürülebilir (kod kullanılmadığı için, atanan belleğin kendisini kullanmayı denediğiniz için olmayacaktır), ancak Linux sorudaki platform olarak şart değildir.

+0

OOM katili, bellek gerçekten kullanıldığında hemen harekete geçecek. Yazılmamış olduğum belleği saklı tuttuğum sürece hiçbir şey olmamalı. – glglgl

+0

Hm, yanılmışım. 1 MiB malloc boyutunda, yönetim verileri o kadar büyük olur ki, sonunda belleği 64 bitlik bir sistemde doldururlar. 1 GiB malloc boyutu ile, sanal bellek boyutu 107t ('top' göre) emer ve program süresiz çalışır. – glglgl

+0

@glglgl: evet - ama malloc() 'un, neyi ayırdığıyla ilgili listelerini korumak için belleğe yazması gereken bir noktaya ulaşabilir ve o noktada OOM Killer harekete geçebilir. –

İlgili konular