Forum: PC-Programmierung Ansi-C: Memory Pool


von Jan (Gast)


Lesenswert?

Hallo ich benötige für ein Embedded System eine Memory Pool 
Funktionalität.
Wie kann ich sowas in Ansi-C realisieren? Ich benötige da insgesamt vier 
Funktionen: MemCreatePool, MemAlloc, MemRelease, MemFree

Für jede Unterstützung sag ich schonmal vielen Dank.

von P. S. (Gast)


Lesenswert?

Entschuldige, aber das ist nicht sonderlich schwer, reine Fleissarbeit - 
was willst du denn damit programmieren, wenn du das nicht an einem Tag 
hinbekommst?

von Karl H. (kbuchegg)


Lesenswert?

Meinst du tatsächlich einen Pool oder einen allgemeinen Memory 
Allocator?
Ein Pool verwaltet gleichartige Datenstrukturen. Ein Allocator ist im 
Prinzip auch ein Pool, allerdings arbeitet er auf Byteebene und die 
Schwierigkeit besteht darin, dass der Allocator mit beliebig großen 
Anforderungen klar kommen muss. Daher muss man auf dieser Ebene ein 
wenig anders arbeiten.
Aber ein Pool kann im einfachsten Fall einfach nur ein Array von 
vorrätigen Datenstrukturen sein, die vom Pool verwaltet werden. Und das 
ist nun wirklich nicht so schwer. Alle Vorrätigen mit einer Freelist 
verketten. Bei einer Anforderung wird die erste aus der Freelist 
genommen. Bei der Rückgabe kommt er wieder in die Freelist hinein. 
Fertig.

von Jan (Gast)


Lesenswert?

Ich möchte es gerne selber umsetzen. Mir fehlt da der richtige Ansatz.
Ich möchte einen festen Speicherbereich mit einer festen Größe vorgeben.
Das mit dem Pool ist mir nicht klar wie ich sowas in Ansi_C umsetzen 
muss.
Muss ich da den Speicherbereich nicht permannent vor anderen Zugriffen 
schützen (CriticalSection)?

von Karl H. (kbuchegg)


Lesenswert?

Jan schrieb:
> Ich möchte es gerne selber umsetzen. Mir fehlt da der richtige Ansatz.
> Ich möchte einen festen Speicherbereich mit einer festen Größe vorgeben.
> Das mit dem Pool ist mir nicht klar wie ich sowas in Ansi_C umsetzen
> muss.

'Muss' ist in dem Fall sowieso das falsche Wort. 'Kann' trifft es viel 
besser.
Denn genauso wie es unzählige Möglichkeiten gibt, wie ein Hotelier seine 
Zimmer verwaltet und bei Anforderung ausgibt, genauso gibt es viele 
Möglichkeiten einen Pool zu bauen.

> Muss ich da den Speicherbereich nicht permannent vor anderen Zugriffen
> schützen (CriticalSection)?

Du denkst jetzt über Details nach, die völlig uninteressant sind. 
Zumindest im Moment.

Postuliere eine struct, die du in einen Pool stecken willst. Dieser 
struct verpasst do noch einen zusätzlichen Zeiger, den nennst du "next". 
Seine Aufgabe ist es, die einzelnen Einträge im Array zu verketten, also 
eine Liste innerhalb des Arrays aufzubauen.
Im Init verkettest du alle Arrayeinträge zu einer einzigen Liste und 
nennst diese die 'Freelist'. Natürlich gibt es da noch einen Zeiger auf 
den Anfang der Liste in einer static Variablen, nennen wir sie 
pFreeList.

Kommt eine Anforderung, schaust du in pFreeList nach. Ist der Zeiger 
nicht NULL, dann hat dein Pool einen Eintrag vorrätig. Du lieferst ihn 
und setzt gleichzeitig den pFreeList auf den Nachfolger des Eintrags 
(dazu brauchst du den next Pointer in der struct).

Wird eine struct zurückgegeben, so wird der next Zeiger dorthin gesetzt 
wo der pFreeList zur Zeit hinzeigt und pFreeList wird auf die 
zurückgegebene struct gesetzt.

Und das wars dann schon: Du hast einen Memory Pool gebaut, der viele 
struct in einem vorallokierten Array verwalten kann.


Wenn ich jetzt noch mehr ins Detail gehe, dann schreib ich dir praktisch 
schon deine Pool Verwaltung.

von Jan (Gast)


Lesenswert?

Auf dieser Internetseite: 
http://openbook.galileocomputing.de/c_von_a_bis_z/021_c_dyn_datenstrukturen_003.htm#mj99a62629378300e719376434889e7c56, 
ist eine gute Erklärung wie man sowas machen könnte.

von P. S. (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:

> Ein Pool verwaltet gleichartige Datenstrukturen.

Ein Pool kann auch Speicherstuecke verschiedener Groesse verwalten. 
Generische Memory-Pools waren frueher gar nicht so unueblich um gegen 
Speicherlecks anzukaempfen.

von Jan (Gast)


Lesenswert?

Beim Memory-Pool wird also das LIFO (siehe Link) Prinzip angewendet.

von Karl H. (kbuchegg)


Lesenswert?

Jan schrieb:
> Beim Memory-Pool wird also das LIFO (siehe Link) Prinzip angewendet.

So hab ich das noch gar nie betrachtet.
Aber ja, man kann das so auffassen.
Am Stack liegen alle benutzbaren Datensätze. Wird einer gebraucht, so 
wird er vom Stack gepopt; wird der Datensatz vom Programm zurückgegeben, 
so wird er auf den Stack gepusht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.