Speicherfreigabe bei Buddy Verfahren

Beispeil Klausur : Juli 2009 Aufgabe 3

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.

Speicherfreigabe bei Buddy Verfahren
Hallo zusammen :slight_smile:

Kann jemand mir vllt erklären wie wird der Speicher bei Buddy Verfahren freigegeben ?

z.B Klausur Juli 2009 :
Nach malloc-Aufrufe sieht die Tabelle bei Buddy Verfahren folgendes aus :

➀ malloc(100) → 128
➁ malloc(50) → 64
➂ malloc(100) → 256
➃ malloc(100) → 384
➄ malloc(150) → 512

Jetzt die Frage ist : Wie sieht den Aufbau der Freispeicherstrukturen nach der Freigabe von ➀,➂,➃,➄ ?

Eine Lösung für die Aufgabe hab ich schon im Forum gefunden aber WIE macht man das ?

Danke :slight_smile:


Die Freigabe findet einfach umgekehrt zur Vergabe statt. Der Bereich wird als frei markiert und falls möglich mit seinem Buddy verschmolzen (ggf. mehrmals).


Ja ok aber wie fühlt man die Buddy Tabelle bei Freigabe aus ?


Du schreibst die (Anfangs-)Adressen der jeweiligen Bereiche in die Tabelle.

Edit: Gemeint sind die freien Bereiche.


Hier mal meine Lösung für Juli 2009:

In die Freispeicherliste trägst du je nach Größe des freien Speichers das Byte ein, wo der freie Speicher beginnt.

Für die deine genannte Klausur, weißt du ja, dass du noch 256 Byte frei hast, die an Position 768 beginne, das trägst du ein:

    init        A        B          C            D

2⁹ 512 512
2⁸ 768 768 786 256
2⁷ 128 128,256 128,256 128
2⁶
2⁵

Im nächsten schritt gibst du A frei, das beginnt an Stelle 128 und sind insgesamt 128 Byte (mit interner Fragmentierung), deshalb trägst du es bei 2⁷ an und immer so weiter und nicht vergessen, immer schön die Buddys verschmelzen.


[quote=benschzilla:1373573211]Im nächsten schritt gibst du A frei, das beginnt an Stelle 256 und sind 128 Byte , deshalb trägst du es bei 2⁷ an und immer so weiter und nicht vergessen, immer schön die Buddys verschmelzen.
[/quote]
A beginnt nicht bei 256 sondern bei 128. (?)

Und gleich noch ne Frage dazu: Die Buddies sind alle 2^i? Also immer 64, 128, 256, 512, 1024? Oder sind Buddies immer diejenigen Blöcke, die sich relativ um 2^i unterscheiden? Also wenn z.B. 128-255 frei ist und 256-383 auch, dann sind 128 und 256 Buddies sowie 384 und 768?

Und benschzilla, warum schreibst du z.B. bei C drei Einträge rein? wenn C gefree’ed wird, dann ist ja 512-767 frei, d.h. 256, dann würde doch bei C nur dortstehen 2^8 → 512?

Bei mir sieht die Tabelle so aus:

        init     A     B     C     D

2^10 128
2^9
2^8 768 128 512
2^7 128 128 384


SORRY, war mein Fehler, ich habe die Aufgabe vom Juli 2009 gemacht, ich versuche mich im Laufe des Tages noch mal an den Lösungen vom März.


Ok kuhl, vielen Dank. :slight_smile:


Zur März 2009 Klausur für Aufgabe 3a:
(http://www4.cs.fau.de/Lehre/WS09/V_SP/Pruefung/2008w-SP-Klausur-www.pdf)

Worst-Fit: 0-130 (initial), 130-200 (malloc 70), 200-400 (malloc 200), 400-450 (malloc 50), 450-750 (malloc 300) und 750-800 (malloc 50)

Buddy-Verfahren: 0-130 (initial), dabei bis 256 Verschnitt, 256-326 (malloc 70), dabei bis 384 Verschnitt, 512-712 (malloc 200), dabei bis 760 Verschnitt, 384-434 (malloc 50), dabei bis 448 Verschnitt, malloc 300 passt nicht rein => auslassen und 448-498 (malloc 50), dabei bis 512 Verschnitt.

Passt das so oder hab ich das falsch verstanden?


Jo genau so habe ich das auch, dass sollte passen!

So jetzt noch mal zur Speicherfreigabe von Buddyverfahren:

    init        A        B        C         D

2⁹ 512 512 512
2⁸ 768 768 256
2⁷ 256 256 256
2⁶ 384
2⁵

Der erste Eintrag bei Init sollte klar sein, an der Stelle 768 sind 256 Byte frei, deswegen bei 2⁸ eintragen. Bei A gebe ich an der Stelle 256 wieder 128 Byte frei, die zuvor von 70 Byte beansprucht waren + dem internen Verschnitt. Bei B wird der Speicher ab Adresse 512 frei, da lagen 200 Byte drin, 256 mussten allokiert werden und da die 256 Byte ab 512 und ab 768 Buddies sind, können sie verschmolzen werden und man trägt die Adresse 512 bei 2⁹ ein, da man nun an dieser Stelle 512 Byte frei hat und die Adresse 256 wird von vorhin wieder übernommen. Und dann geht das ganze immer so weiter. Vielleicht hat noch jemand anders eine Meinung dazu, aber ich denke das sollte so passen.