2010-01-16 8 views
7

Wo kann ich etwas über sbrk() in einigen Details lesen?Wie funktioniert sbrk() in C++?

Wie funktioniert es genau?

In welchen Situationen möchte ich sbrk() statt der umständlichen malloc() und new() verwenden?

BTW, was ist die Erweiterung für sbrk()?

Antwort

8

Werfen Sie einen Blick auf the specification for brk/sbrk.

Der Aufruf fordert das Betriebssystem grundsätzlich auf, mehr Speicher für die Anwendung zuzuweisen, indem der vorherige "Unterbrechungswert" um einen bestimmten Betrag erhöht wird. Dieser Betrag (der erste Parameter) ist die Menge an zusätzlichem Speicher, die Ihre Anwendung erhält.

Die meisten rudimentären malloc-Implementierungen bauen auf dem sbrk-Systemaufruf auf, um Speicherblöcke zu erhalten, die sie aufteilen und verfolgen. Die mmap Funktion wird allgemein als eine bessere Wahl akzeptiert (weshalb mallocs wie dlmalloc beide mit einem #ifdef unterstützen).

Wie bei „wie es funktioniert“, ein sbrk an seinem einfachsten Ebene wie folgt aussehen könnte:

uintptr_t current_break; // Some global variable for your application. 
         // This would probably be properly tracked by the OS for the process 
void *sbrk(intptr_t incr) 
{ 
    uintptr_t old_break = current_break; 
    current_break += incr; 
    return (void*) old_break; 
} 

Moderne Betriebssysteme würden weit mehr, wie Kartenseiten in den Adressraum tun und Hinzufügen von Verfolgungsinformationen für jeden zugewiesenen Speicherblock.

+0

Beachten Sie, dass die Funktionen in der Referenz mit "LEGACY" gekennzeichnet sind; Wenn Sie zu der aktuellen SUS-Spezifikation gehen (http://www.opengroup.org/onlinepubs/9699919799/toc.htm), sind sie (brk, sbrk) nicht vorhanden. –

+0

Guter Punkt - die Verwendung solcher Funktionen kann zu Portabilitätsproblemen führen, wenn eine Implementierung beschließt, sich nicht um die Abwärtskompatibilität zu kümmern. –

4

sbrk ist ziemlich veraltet, heutzutage würden Sie mit mmap einige Seiten aus/dev/zero abbilden. Es ist sicherlich nicht etwas, das Sie anstelle von Malloc und Freunden verwenden, es ist eher ein Weg, diese zu implementieren. Es existiert natürlich auch nur auf posix-basierten Betriebssystemen, die auf Abwärtskompatibilität zu altem Code achten.

Wenn Sie Malloc und New zu umständlich finden, sollten Sie stattdessen in die Garbage-Collection schauen ... aber Vorsicht, es besteht ein potenzieller Performancekosten, also müssen Sie verstehen, was Sie tun.

0

Das hängt davon ab, was Sie unter Malloc "Umständlich" verstehen. sbrk wird normalerweise nicht mehr direkt verwendet, es sei denn, Sie implementieren Ihren eigenen Speicherzuordner: IE, der Operator überschreibt "neu". Selbst dann würde ich möglicherweise malloc benutzen, um mir meine erste Erinnerung zu geben.

Wenn Sie sehen möchten, wie malloc() auf sbrk() zu implementieren, überprüfen Sie http://web.ics.purdue.edu/~cs354/labs/lab6/, die eine Übung ist, die durch.

Auf einem modernen System sollten Sie diese Schnittstelle jedoch nicht berühren. Da Sie malloc anrufen und neu umständlich sind, habe ich den Verdacht, dass Sie nicht über die erforderliche Erfahrung verfügen, um sbrk sicher und ordnungsgemäß für Ihren Code zu verwenden.

1

Sie möchten nie sbrk anstelle von malloc oder free verwenden. Es ist nicht portierbar und wird normalerweise nur von Implementierern der Standard-C-Bibliothek oder in Fällen, in denen es nicht verfügbar ist, verwendet.Es wird beschrieben, ziemlich gut in seinem man page:

Beschreibung

BRK() setzt das Ende des Datensegment auf den angegebenen Wert von end_data_segment, wenn dieser Wert vernünftig ist, wobei das System tut haben genug Speicher und der Prozess nicht überschreiten seine maximale Datengröße (siehe setrlimit (2)).

sbrk() erhöht die Daten des Programms Leerzeichen um Inkrementbytes. sbrk() ist nicht ein Systemaufruf, es ist nur eine C-Bibliothek Wrapper. Das Aufrufen von sbrk() mit einem Inkrement von 0 kann verwendet werden, um die aktuelle Position des Programmausbruchs zu finden.

Rückgabewert

Bei Erfolg brk() gibt Null und sbrk() gibt einen Zeiger auf den Beginn des neuen Bereichs. Bei einem Fehler wird -1 zurückgegeben und errno wird auf ENOMEM gesetzt.

Schließlich malloc und free nicht umständlich sind - sie der normale Weg sind zuzuweisen und freigeben Speicher in C. Auch wenn Sie Ihre eigene Speicherzuordner implementieren möchten, ist es am besten, nur malloc und free als Grundlage zu verwenden - ein gemeinsamer Ansatz ist es, einen großen Teil zu einer Zeit mit malloc zuzuteilen und Speicherzuweisung von ihm zur Verfügung stellen (das ist, was suballocators oder Pools implementieren in der Regel)


Re den Ursprung des Namens sbrk (oder sein Cousin brk), kann es h Es hat etwas mit der Tatsache zu tun, dass das Ende des Heaps durch einen Zeiger namens "break" gekennzeichnet ist. Der Heap beginnt unmittelbar nach den BSS-Segmenten und wächst normalerweise zum Stack hin an.

1

Sie haben dieses C++ markiert, also warum sollten Sie 'sperriges' malloc() statt neu verwenden? Ich bin mir nicht sicher, was Malloc auf jeden Fall umständlich ist; Innerlich vielleicht, aber warum interessiert es dich? Und wenn es Sie interessiert (aus Gründen der Deterministik zum Beispiel), könnten Sie einen großen Pool zuweisen und Ihren eigenen Zuordner für diesen Pool implementieren. In C++ können Sie natürlich den neuen Operator überladen.

sbrk wird verwendet, um die C-Bibliothek an die Betriebssystemspeicherverwaltung des zugrunde liegenden Systems anzubinden. Also mach OS-Aufrufe statt sbrk(). Wie das funktioniert, hängt vom System ab. Wenn Sie zum Beispiel die Newlib C-Bibliothek verwenden (die normalerweise auf eingebetteten Bare-Metal-Systemen mit dem GNU-Compiler verwendet wird), müssen Sie implement sbrk yourself, so wie es unter diesen Umständen funktioniert, bleibt Ihnen überlassen, solange es seine Anforderungen erfüllt Verhalten beim Erweitern des Heap oder Fehler.

Wie Sie den Link sehen können, ist es nicht viel zu tun, und wäre extrem umständlich direkt zu bedienen - Sie würden wahrscheinlich am Ende-up in allen Funktionen Verpackung, die malloc und neu in jedem Fall zur Verfügung stellen.