2011-01-17 10 views
2

In vielen eingebetteten Systemen ist die Speicherfragmentierung ein Problem. Insbesondere für Software, die über lange Zeiträume (Monate, Jahre usw.) läuft. Für viele Projekte besteht die Lösung darin, keine dynamische Speicherzuweisung wie malloc/free und new/delete zu verwenden. Wenn möglich, wird globaler Speicher verwendet, und Speicherpools für Typen, die häufig zugewiesen und freigegeben werden, sind gute Strategien, um eine dynamische Speicherverwaltung zu vermeiden.Embedded Linux: Speicherfragmentierung

In Embedded Linux wie wird das angesprochen? Ich sehe, dass viele Bibliotheken dynamischen Speicher verwenden. Gibt es Mechanismen, die das Betriebssystem zur Verhinderung von Speicherfragmentierung verwendet? Bereinigt es den Heap regelmäßig? Oder sollte man vermeiden, diese Bibliotheken in einer eingebetteten Umgebung zu verwenden?

Antwort

2

Es gibt keinen nicht beweglichen Speicherzuordner, der eine Fragmentierung von mindestens einem Protokoll (M/m) -Faktor vermeiden kann, wobei M = die Größe der größten Objektanforderung und m = die Größe der kleinsten Objektgröße ein klassisches Ergebnis aufgrund von Robson, 1971).

Ich arbeite mit Leuten, die Echtzeit-System-Programmierung (einschließlich bei Airbus), und sie vermeiden sorgfältig die Verwendung von dynamischen Speicherzuweisung, stattdessen mit Pools, wie Sie erwähnen.

Es gibt jedoch einen großen Unterschied zwischen einer Betriebssystem- und Speicherzuweisung. Die dynamische Speicherzuweisung, die dem Programmierer zur Verfügung gestellt wird, ist Teil der Bibliothek und hat wenig mit dem Betriebssystem zu tun (außer als Speicherquelle). Linux selbst verwendet einen Slab-basierten Speicherzuordner für seine eigenen internen Zwecke; Ich gehe davon aus, dass Embedded Linux das gleiche tut, bin mir aber nicht sicher.

+0

Was tun diese Leute bei Airbus, wenn sie auf eine Bibliothek stoßen, die dynamisches Gedächtnis verwendet? – waffleman

+1

AFAIK, dieser Umstand entsteht nie. – EmeryBerger

1

IMHO, in beiden Fällen können Sie nach Speicherzuordnungsalgorithmen suchen, die weniger Fragmentierung verursachen. Konfigurieren Sie diesen Algorithmus oder Ihre Speicherzuordnungsimplementierung, nachdem Sie Ihre Speicheranforderungen gemessen haben.

Ich kann TLSF als Start empfehlen.

1

Das hängt davon ab, wie Sie den Speicher verwenden.

Linux verwendet virtuellen Speicher für die meisten Fälle, in denen die Anwendung den Speicher als zusammenhängender Speicherblock sieht. Der zugrunde liegende Kernel übernimmt die gesamte manuelle Zuordnung zwischen dem virtuellen Speicher und dem physischen Speicher, so dass Sie sich nicht damit befassen müssen. Physikalisch könnte Ihr Speicher herumstreuen, aber Ihre Anwendungen sehen das nicht.

Nun, was ist, wenn Sie wirklich zusammenhängenden physischen Speicher wollen? Dies geschieht häufig, wenn Sie DMA oder andere Hardware-Anforderungen erfüllen möchten. In diesem Fall dürfen Sie eine Speicherseite zuweisen, die auf einen bestimmten physischen Speicher zeigt. Aber Sie müssen dies als eine andere Ausnahme als Norm machen.

Ich habe mein System so konzipiert, dass die meisten Treiber (außer "Echtzeit" -Treiber) auf den Userspace zugreifen. Auf diese Weise erhalten Sie alle Vorteile des Benutzerbereichs (mehr Bibliotheken, Sprachen), töten den Kernel nicht, wenn Sie einen Fehler haben, und verwenden den verfügbaren virtuellen Speicher.

+0

Können Sie weitere Informationen zum Zuweisen einer Speicherseite, die auf einen bestimmten physischen Speicher verweist, angeben? –

+0

"Ich habe mein System so konzipiert, dass die meisten Treiber (außer" Echtzeit "-Treiber) auf den Userspace zugreifen." klingt wie ein Tippfehler. Was meinen Sie? –

+0

Daryl, verwenden Sie/dev/mem, um auf die physische Adresse aus dem Benutzerbereich zuzugreifen. – KOkon