06.10.2013 Aufrufe

Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke

Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke

Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>E<strong>in</strong>e</strong> <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> Informatik <strong>und</strong> <strong>die</strong> <strong>Programmiersprache</strong> C<br />

26.1 Selbstgeschriebene Speicherverwaltung<br />

Gelegentlich ist es Erforderlich, aus Effizienzgründen selbst e<strong>in</strong>e Speicherverwaltung zu schreiben.<br />

Diese kann dabei auf Geschw<strong>in</strong>digkeit oder Speicherausnutzung optimiert werden.<br />

Die standardmässige Speicherverwaltung führt meistens e<strong>in</strong>e Liste der freien Speicherblöcke, <strong>und</strong><br />

sucht sich bei der Anforderung von Speicher e<strong>in</strong>en Block passender Grösse, oder zerteilt e<strong>in</strong>en grösseren<br />

Block falls ke<strong>in</strong> passender Block vorhanden ist. Bei der Freigabe wird ensprechend versucht,<br />

den Block mit e<strong>in</strong>em benachbarten freien Block <strong>in</strong> der Liste zusammenzufassen, sonst wird er <strong>in</strong> <strong>die</strong><br />

Liste der freien Blöcke aufgenommen. Um <strong>die</strong> Verwaltung zu vere<strong>in</strong>fachen werden dabei <strong>die</strong><br />

Blockgrössen auf e<strong>in</strong> vielfaches e<strong>in</strong>er Basisblockgrösse aufger<strong>und</strong>et, dadurch ergibt sich e<strong>in</strong> Mittelweg<br />

zwischen Geschw<strong>in</strong>digkeit <strong>und</strong> effizienter Speicherausnutzung.<br />

Wenn man e<strong>in</strong>e sehr schnelle Speicherverwaltung benötigt, geht das am e<strong>in</strong>fachsten mit e<strong>in</strong>em Array,<br />

dabei muss man aber <strong>die</strong> E<strong>in</strong>schränkung e<strong>in</strong>er fixen Blockgrösse <strong>in</strong> Kauf nehmen.<br />

static char MyMemory[50][128] = {0}; /* 50 Blöcke a 128 Bytes */<br />

void *FastMalloc(void) /* Ke<strong>in</strong>e Grössenangabe, da fixe Blockgrösse */<br />

{<br />

<strong>in</strong>t i;<br />

for (i = 0; i < 50; i++) { /* Freien Block suchen */<br />

if (MyMemory[i][0] == 0) {<br />

MyMemory[i][0] = 1; /* Block als Belegt markieren */<br />

return &(MyMemory[i][0]); /* Zeiger auf reservierten Block */<br />

/* zurueckliefern */<br />

}<br />

}<br />

return NULL; /* ke<strong>in</strong>en freien Speicher gef<strong>und</strong>en */<br />

}<br />

void FastFree(void *Mem)<br />

{<br />

*((char *)(Mem)) = 0; /* Block als Frei markieren */<br />

}<br />

Bei <strong>die</strong>ser Version gilt <strong>die</strong> E<strong>in</strong>schränkung, das im ersten Byte des Speicherblocks nie der Wert 0<br />

abgelegt werden darf, weil sonst der Block als Frei angesehen wird. In vielen Anwendungen ist das<br />

ke<strong>in</strong> Problem, <strong>und</strong> sonst muss e<strong>in</strong>fach e<strong>in</strong> Zeiger auf das zweite Byte des Blocks zurückgegeben<br />

werden, dann hat der Anwender ke<strong>in</strong>en Zugriff auf das Flag-Byte am Anfang:<br />

/* Aenderung <strong>in</strong> FastMalloc: */<br />

return &(MyMemory[i][1]); /* Zeiger auf Zweites Byte zurueck */<br />

/* Aenderung <strong>in</strong> FastFree: */<br />

*(((char *)(Mem))-1) = 0; /* Block als Frei markieren */<br />

Wenn man mehrere Blockgrössen benötigt, kann man e<strong>in</strong>fach für jede Blockgrösse e<strong>in</strong> eigenes Array<br />

benutzen, <strong>und</strong> <strong>die</strong> grösse der Arrays dem zu erwartenden Speicherbedarf anpassen. Speicheranforderungen<br />

des Anwenders werden jeweils auf <strong>die</strong> nächstgrösste Blockgrösse aufger<strong>und</strong>et, <strong>und</strong> der<br />

Block aus dem entsprechenden Array angefordert.<br />

Bei grossen Arrays kann anstelle e<strong>in</strong>es Flagbytes e<strong>in</strong>e Indexliste aufgebaut werden. In jedem freien<br />

Block ist im vordersten Byte/Wort der Index des naechsten freien Blocks e<strong>in</strong>getragen, so wird e<strong>in</strong>e<br />

Liste der freien Blocks aufgebaut welche schnelleres f<strong>in</strong>den e<strong>in</strong>es freien Blocks erlaubt. Die Speicherverwaltung<br />

muss sich den Index des ersten freien Blocks merken (Head der Liste).<br />

Freigegebene Blöcke werden zuvorderst <strong>in</strong> <strong>die</strong> Liste e<strong>in</strong>gehängt, <strong>und</strong> angeforderte Blöcke werden<br />

wiederum vom Listenanfang genommen (Somit ist nur e<strong>in</strong> 'Head-Po<strong>in</strong>ter' notwendig).<br />

Gedruckt am 11.09.2008 13:04:00 Letzte Änderung am: 11. September 2008 Version 2.4, I. Oesch 101/147

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!