2016-12-14 3 views
1

Ich versuche eine Übung von "Expert C Programming" wo der Punkt zu sehen, wie viel Speicher ein Programm zuordnen kann. Es hängt von malloc ab, NULL zurückzugeben, wenn es nicht mehr zuordnen kann.Malloc Kernel Panik statt NULL

Anstatt die Summe zu drucken, bekomme ich eine Kernel-Panik nach dem Zuweisen von ~ 8GB auf meinem 16GB Macbook Pro.

Kernel panic Protokoll:

Anonymous UUID:  0B87CC9D-2495-4639-EA18-6F1F8696029F 

Tue Dec 13 23:09:12 2016 

*** Panic Report *** 
panic(cpu 0 caller 0xffffff800c51f5a4): "zalloc: zone map exhausted while allocating from zone VM map entries, likely due to memory leak in zone VM map entries (6178859600 total bytes, 77235745 elements allocated)"@/Library/Caches/com.apple.xbs/Sources/xnu/xnu-3248.50.21/osfmk/kern/zalloc.c:2628 
Backtrace (CPU 0), Frame : Return Address 
0xffffff91f89bb960 : 0xffffff800c4dab12 
0xffffff91f89bb9e0 : 0xffffff800c51f5a4 
0xffffff91f89bbb10 : 0xffffff800c5614e0 
0xffffff91f89bbb30 : 0xffffff800c5550e2 
0xffffff91f89bbba0 : 0xffffff800c554960 
0xffffff91f89bbd90 : 0xffffff800c55f493 
0xffffff91f89bbea0 : 0xffffff800c4d17cb 
0xffffff91f89bbf10 : 0xffffff800c5b8dca 
0xffffff91f89bbfb0 : 0xffffff800c5ecc86 

BSD process name corresponding to current thread: a.out 

Mac OS version: 
15F34 

Ich verstehe, dass dies leicht durch das Klischee des Arztes festgelegt werden kann „? Es tut weh, wenn Sie das tun dann tun das nicht“, aber ich, warum malloc verstehen wollen funktioniert nicht wie erwartet.

OS X 10.11.5

+0

Nachschlagen "Lazy Allocation", dies ist eine "Funktion" des Betriebssystems –

Antwort

2

Für die definitive Antwort auf diese Frage können Sie sich den Quellcode schauen, die Sie hier finden:

zalloc.c source in XNU

In diesem Quelldatei finden die Funktion zalloc_internal(). Dies ist die Funktion, die den Kernel in Panik versetzt.

In der Funktion finden Sie eine "for (;;) {" - Schleife, die grundsätzlich versucht, den angeforderten Speicher in der angegebenen Zone zuzuweisen. Wenn nicht genügend Speicherplatz vorhanden ist, wird sofort erneut versucht. Wenn dies fehlschlägt, führt es eine zone_gc() (garbage collect) aus, um zu versuchen, Speicher zurückzufordern. Wenn das auch nicht klappt, gerät der Kernel einfach in Panik und stoppt den Computer effektiv.

Wenn Sie wissen möchten, wie zalloc.c funktioniert, suchen Sie zonenbasierte Speicherzuordner.

Ihr Programm macht den Kernel in der Zone namens "VM-Map-Einträge", die eine vordefinierte Zone ist, die beim Booten zugewiesen wird, nicht mehr voll. Sie können wahrscheinlich das von Ihnen erwartete Ergebnis ohne Kernel-Panic erhalten, wenn Sie mehr als 1 MB gleichzeitig zugewiesen haben.

Im Wesentlichen ist es nicht wirklich ein Problem für den Kernel, Ihnen mehrere Gigabyte Speicher zuzuweisen. Die Zuteilung von Tausenden von kleineren Zuordnungen, die zu diesen Gigabytes zusammengefasst werden, ist jedoch viel schwieriger.

+0

Ändern der Menge an Speicher zugewiesen führt nicht dazu, dass das Programm jemals erfolgreich ausgeführt wird, aber es macht es nicht Kernel Panic. – valbaca

+0

Hängt davon ab, was Sie unter "erfolgreich ausführen" verstehen. Das Programm ist kein echtes Programm, sondern ein Lehrbeispiel, bei dem die malloc-Funktion irgendwann fehlschlagen soll. – jksoegaard

+0

"Erfolgreich ausführen bedeutet: so viel Arbeitsspeicher zuweisen, wie über die while-Schleife zugewiesen werden kann. Wenn es versucht, N + 1. MB zuzuordnen, sollte malloc null zurückgeben, die while-Schleife beenden, dann printf und beenden. – valbaca

Verwandte Themen