Ich renne Fedora 26
.
Dies ist für eine sehr seltsame Aufgabe, die mein Algorithmusprofessor gegeben hat. Die Aufgabe lautet:
Speicherfragmentierung in C:
Entwerfen, Implementieren und Ausführen eines C-Programms, das Folgendes ausführt: Es weist Speicher für eine Folge von3m
Arrays mit einer Größe von jeweils 800.000 Elementen zu; Anschließend werden alle geradzahligen Arrays explizit freigegeben und eine Folge vonm
Arrays mit einer Größe von jeweils 900.000 Elementen zugewiesen . Messen Sie die Zeit, die Ihr Programm für die Zuordnung der ersten und der zweiten Sequenz benötigt. Entladen Siem
fast den gesamten Hauptspeicher, der Ihrem Programm zur Verfügung steht. "
Das übergeordnete Ziel ist es, den Speicher zu fragmentieren und dann etwas mehr als das anzufordern, was als zusammenhängender Block verfügbar ist, wodurch das Betriebssystem gezwungen wird, den Speicher zu komprimieren oder zu defragmentieren.
Im Unterricht fragte ich, wie wir dies tun sollten, da das Gedächtnis visualisiert und nicht wirklich zusammenhängend ist, worauf er antwortete: "Nun, Sie müssen [virtuelles Gedächtnis] ausschalten." Einige andere Schüler fragten in der Klasse, wie wir wissen sollten, wann wir diese "Garbage Collection" erreicht haben, und er sagte: "Der Zeitpunkt für die zweite Zuweisung sollte länger sein als der erste, da die Garbage Collection viel Zeit in Anspruch nimmt."
After searching around a bit, the closest thing I could find to disabling virtual memory was to disable swap memory with swapoff -a
. I disabled my desktop environment and compiled and ran my program from the native terminal (to avoid possible interference from other processes, especially a heavy one like the Desktop Environment). I did this and ran my program with increasing m
until I reached a point where the timing for the second allocation was greater than the first.
Ich habe das Programm mit zunehmender m
Geschwindigkeit ausgeführt und schließlich einen Punkt gefunden, an dem die Zeit für die zweite Zuweisung länger war als die Zeit für die erste Zuweisung. Unterwegs traf ich jedoch einen Punkt, an dem der Prozess vor der zweiten Zuweisung beendet wurde. Ich überprüfte dmesg
und sah, dass es von oom
-killer getötet wurde . Ich habe mehrere Artikel über oom
-killer gefunden und gelesen und festgestellt, dass Sie die Speicherzuweisung durch den Kernel deaktivieren können.
Ich tat dies und führte mein Programm erneut aus, nur dieses Mal konnte ich kein m
solches finden, so dass das Timing des zweiten höher war als das des ersten. Schließlich würde malloc mit immer größerem m (obwohl viel kleiner als bei aktivierter Gesamtzuordnung) fehlschlagen und mein Programm würde enden.
Ich habe drei Fragen, von denen die erste nicht wirklich so wichtig ist:
Ist Garbage Collection der richtige Begriff dafür? Mein Professor sagt sehr unerbittlich, dass dies eine Speicherbereinigung ist, aber ich ging davon aus, dass die Speicherbereinigung von Programmiersprachen durchgeführt wurde und dass dies als defragmentierter angesehen wird.
Ist eine Komprimierung auf einem Linux-System möglich, wie er es möchte?
Warum konnte ich einen Punkt erreichen, an dem die Zeit für die zweite Zuweisung höher war als die erste, als ich den Swap deaktivierte, aber die Gesamtzuordnung des Speichers aktiviert hatte? Hat die Verdichtung tatsächlich stattgefunden? Wenn ja, warum konnte ich keinen Punkt erreichen, an dem die Komprimierung stattfand, nachdem ich die Gesamtzuordnung des Speichers deaktiviert hatte?