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
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