Müllsammlung ...
-
Bei C++ kann man mit dem new und delete Operator Speicherbereiche
auf dem Heap reservieren und freigeben. Mit der Zeit muss der Heap
ziemlich fragmentiert werden. Wie geht das Betriebssystem vor wenn ein
new Operator ausgeführt wird. Windows müsste einige Zeit für das
finden eines ausrechend grossen Speicherbereich aufwenden, also langsam
werden. Ausserdem gibt es eine Funktion namens _heapmin. Es kann aber doch nicht
sein dass _heapmin den heap zusammenschiebt, da müssten alle verwendeten
Zeiger umgebogen werden. Weiss jemand darüber etwas ?
-
Prinzpiell hast du recht, das BS muss einen entsprechenden speicherbereich suchen. Wie es dabei vorgeht, hängt vom BS ab. Da gibt es verschiedene Algorithmen.
Praktisch hängt hinter new oft (ist aber kein muss!! der Standard schreibt das nicht vor) malloc aus den C-Libs. Und da arbeitet dann auch noch ein Speichermanager mit der zwischen BS und deiner Anwendung hängt.zu heapmin, da schaut man einfach in der MSDN nach:
MSDN schrieb:
The _heapmin function minimizes the heap by releasing unused heap memory to the operating system. If the operating system does not support _heapmin (for example, Windows 98), the function returns –1 and sets errno to ENOSYS.
-
Wann benötigt man so eine Funktion wie _heapmin bzw. ist diese überhaupt noch notwendig? Eigentlich ist das Speichermanagement unter Windows doch ziemlich effizient.
-
Man müsste schon den new-/delete-Operator überladen und alles selbst implementieren, damit ein sauberer heap möglich ist. In "Modernes C++ Design" wird erklärt wie man eine Speicherverwaltung implementiert. Zwar nicht speziell bzgl. Defragmentierung, aber es ist eine der wenigen Quellen in denen überhaupt in die Richtung erklärt wird.
Oder man nimmt gleich eine fertige Lib wie SmartHeap die laut c't-Tests seine Sache sogar sehr gut machen soll.
-
offtopic...
komisch, dass schon der amiga eine mmu hatte (memory management unit) und aktuelle computer das erst mit .Net hinbekommen...
Stefan
-
@StefanKittel: komisch dass du nicht verstanden hast was eine MMU ist.
Ohne MMU ginge unter Windows garnix.
-
MMU gibt es im PC bereich schon seit Einführung des ProtectedMode, also ist gar nicht soooo neu. Was glaubst Du wie sonnst FileMapping, SwapDatei usw. Funktionieren soll. Aber das nur mal so am Rande und das sind nur zwei beispiele für was dei MMU verantwortlich ist.
Gruß Matthias
-
MMU ist hauptsächlich für virtuellen Hauptspeicher gedacht, und das gibts nun wirklich schon lange auf PCs. In diesem Thread geht es um was ganz anderes! Da war der Classic Amiga & Co. noch weit von entfernt.
-
Eine Möglichkeit ist es, einen künstlichen Heap, mit einem Array, und
Belegungs und Freigabe Mechanismen einzubauen. Sofern die Grösse der
zu belegenden Speicherblöcke konstant ist. Ansonsten für jede Bereichsgrösse
einen künstlichen Heap. Aber andererseits, wenn Windows schnell genug ist ?
-
@GeorgC++: Windows ist da relativ langsam - zumindest Windows XP. Dafür wird allerdings nicht viel Speicher "verschenkt" - die ganzen schnellen general purpose allokatoren verballern ziemlich viel Speicher nur um schnell zu sein.