Aufgabe 3: halde => Größe des Speichers

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Aufgabe 3: halde => Größe des Speichers
Hallo,

in der Aufgabenstellung heißt es ja:

Gehe ich richtig in der Annahme, dass, wenn ich mehr Speicher anfordere (beispielsweise zusätzliche sizeof(mblock) für die Verwaltungsstruktur), aber nur die 128 MiB nach Außen zur Verfügung gestellt werden und dies damit ja genau der Aufgabenstellung entspricht, weil der Overhead ja nicht verwaltet wird, dies mit der gewollten Aufgabenstellung konform ist? (wie ich feststellen musste, divergieren nämlich manchmal Geschriebenes und Gemeintes in diversen Aufgabenstellungen)

Vielen Dank!


Nein, die 128MB müssen sich Daten und Kontrollstrukturen teilen.


EDIT: Da war jemand schneller als ich


Anders ist dass auch nur sehr ineffizient machbar. Stichwort Worst-Case: jemand fordert 12810241024 mal 1 Bytes an, dann braeuchte man 12810241024*sizeof(mblock) zusaetzlichen Speicher um sicherzustellen das man im Worst-Case allen Speicher ueberhaupt vergeben kann[1]. Da sizeof(mblock) > 1 Byte verbraucht man also bei der artiger Implementierung (mit statisch allokiertem Speicherbereich) die mit dem Worst-Case klar kommt mehr Speicher fuer die Verwaltung als fuer die Daten. Deshalb teilen sich Daten- und Verwaltungsstrukturen den statisch allokierten Speicher. Damit kann man die noetigen Verwaltungsstrukturen dynamisch anlegen und vermeidet unnoetigen Overhead.

[1] Oder man braucht 128MiB wenn man nur Speicher in sizeof(mblock)-Granularitaet herausgibt.


Das bedeutet doch dann aber, dass man zur Erfüllung der Checkliste (malloc von 128MiB) noch einen Spezialfall in dem Code vorsehen muss, damit das auch so funktioniert. In diesem Fall ist ja in den 128MiB (dem Array) kein Platz für mblock+128MiB Daten. Richtig?


Lies nochmal genau, in der Checkliste steht „128 MiB - Größe eines Listenelementes“, d.h. [m]malloc(sizeof(memory) - sizeof(struct mblock))[/m] muss funktionieren.