2016-07-09 9 views
0

Ich möchte einen Speicherpoolmanager für ein eingebettetes Systemprojekt erstellen. Ich möchte einen separaten Header und eine entsprechende Implementierung in einer .c-Datei machen (zB mempool.c). Mein Zweifel hier ist, wenn ich in den Funktionsimplementierungen in dieser Datei malloc() aufrufen, welchen Heap-Speicher verwende ich eigentlich?Implementieren von Speicherpool

Da gibt es andere Dateien (sagen foo1.c und foo2.c), die den Header "mempool.h" und die entsprechenden Funktionen in mempool.c verwenden. Also, wenn ich foo1.c und foo2.c gleichzeitig kompiliere und ausführe, werden ihre Aufrufe an die Funktionen in mempool Zuweisungen auf 2 völlig separaten Heaps oder dem gleichen aufrufen?

+0

Zu breit, aber eingebettete Systeme haben normalerweise nicht die Standardbibliothek zur Verfügung und die Verwendung von 'malloc' & friends ist eine sehr schlechte Idee. Das ist der Grund, warum man Speicherpools verwendet ... – Olaf

+0

Sind foo1.c und foo2.c in dasselbe Programm oder zwei separate Programme kompiliert? – kkrambo

+0

Sie sind alle einzeln getrennte Programme. –

Antwort

2

Es gibt drei C-Quelldateien im Spiel: mempool, foo1, foo2.

Die .h Datei (en) sind Header Dateien, die beschreiben, wie die Funktionen "aussehen" und wie sie heißen.

Beim Kompilieren entweder foo1 oder foo2, wird das Objekt-Code aus mempool.o sein statisch in ihnen verknüpft.

Damit sind sie jetzt "zwei völlig getrennte Programme", die beide ein identisches Bit an Objektcode enthalten.

Wenn die beiden Programme ausgeführt werden, hat jeder von ihnen seinen eigenen privaten Heap. Obwohl beide denselben Objektcode enthalten, der für die Speicherpoolverwaltung verwendet wird, sind sie nicht miteinander verknüpft.

Wenn Sie tun möchten, dass die Programme tatsächlich "Speicher freigeben", müssen Sie ein benanntes Shared-Memory-Segment verwenden. (shmget, etc ...), und Sie müssen Ihren Memory-Pool-Manager-Code entwerfen, um diese freigegebene Ressource zu finden, zu öffnen und ordnungsgemäß zu verwenden. Beide Programme enthalten wieder eine eigene unabhängige Kopie des Objektcodes Ihres Speicherpool-Managers.

(Hinweis:. „dies bereits getan worden ist“ können Sie komplette Bibliotheken finden, die dies tun, auf Orte wie GitHub, stattdessen auf eine maßgeschneiderte Implementierung einsteigen, sich selbst)

=== Zusätzlicher Hinweis:

ich auch kommentieren, nebenbei möchte, dass eine dritte Möglichkeit besteht: dynamisch geladen Bibliotheken.

Wenn Sie diesen Ansatz verwenden, wird der Objektcode von der Anwendung zur Laufzeit geladen, und wird nicht "" wird "Teil des" Objekt-Code der Anwendungen, die es verwenden. Stattdessen wird es für sie zugänglich. Darüber hinaus ist das Betriebssystem der Freigabe bekannt, und es kann eine einzige Instanz erkennen, die freigegeben wird. Es kann ermöglichen eine gemeinsame Menge von Speicherzuweisungen zu "im Besitz von" dieser einzelnen, geteilten Instanz. Betriebssysteme (und Versionen, "historische vs. heute" z. B. MS-Windows ...) variieren in diesem speziellen Punkt.

+0

Vielen Dank. Sehr klare Antwort! –