Frage

Ich versuche, herauszufinden, wie Memory-Mapped-Dateien auf einem Mac neu zuordnen (wenn ich den verfügbaren Speicherplatz erweitern möchten).

Ich sehe unsere Freunde in der Linux-Welt mremap haben, aber ich kann keine solche Funktion in den Headern auf meinem Mac finden. /Developer/SDKs/MacOSX10.6.sdk/usr/include/sys/mman.h hat die folgende:

  • mmap
  • mprotect
  • msync
  • munlock
  • munmap
  • aber keine mremap

man mremap bestätigt meine Befürchtungen.

Ich habe gerade munmap und mmmap wenn ich die Größe der abgebildeten Datei ändern möchten, die alle geladenen Seiten beinhaltet ungültig zu machen. Es muss einen besseren Weg geben. Sicher?

Ich versuche zu schreiben Code, der auf Mac OS X und Linux funktionieren. Ich konnte regeln für ein Makro, um die beste Funktion in jedem Fall zu verwenden, wenn ich had , aber ich würde lieber tue es richtig.

War es hilfreich?

Lösung

können Sie die Datei auf eine große Größe ftruncate (ein Loch zu schaffen) und alle davon mmap. Wenn die Datei persistent empfehle ich das Loch mit Schreib Anruf Füllung und nicht durch in der Mapping-Schreiben, da sonst die Blöcke der Datei unnötig auf der Festplatte fragmentiert erhalten können.

Andere Tipps

Wenn Sie die Karte schrumpfen müssen, munmap nur den Teil am Ende die Sie entfernen möchten.

Wenn Sie die Karte vergrößern müssen, können Sie die richtige mit mmap zu den Adressen-Offset MAP_FIXED knapp oberhalb der alten Karte, aber Sie müssen vorsichtig sein, dass man etwas Karte über nicht anderes, das ist schon da. ..

Der obige Text unter Ausstreichen ist eine schreckliche Idee; MAP_FIXED ist grundsätzlich falsch, wenn Sie bereits wissen, was an der Zieladresse ist und wollen es atomar ersetzen. Wenn Sie opportunistisch versuchen, etwas Neues zuordnen, wenn der Adressbereich frei ist, müssen Sie die Verwendung mmap mit einer angeforderten Adresse, aber ohne MAP_FIXED und sehen, ob es gelingt, und gibt Ihnen die gewünschte Adresse; wenn es gelingt, aber mit einer anderen Adresse werden Sie die neue Zuordnung unmap wollen Sie gerade erstellt haben und davon ausgehen, dass die Zuweisung an der angeforderten Adresse war nicht möglich.

Wenn Sie in groß genug Stücke erweitern (etwa 64 MB, aber es hängt davon ab, wie schnell es wächst), dann die Kosten für die alte Karte für unwirksam zu erklären ist vernachlässigbar. Wie immer Benchmark vor einem Problem anzunehmen.

Ich habe keine Erfahrung mit Memory-Mapping, aber es sieht aus wie Sie vorübergehend die gleiche Datei zweimal als Mittel zuordnen können die Zuordnung zu erweitern, ohne etwas zu verlieren.

int main() {
    int fd;
    char *fp, *fp2, *pen;

      /* create 1K file */
    fd = open( "mmap_data.txt", O_RDWR | O_CREAT, 0777 );
    lseek( fd, 1000, SEEK_SET );
    write( fd, "a", 1 );

      /* map and populate it */
    fp = mmap( NULL, 1000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0 );
    pen = memset( fp, 'x', 1000 );

      /* expand to 8K and establish overlapping mapping */
    lseek( fd, 8000, SEEK_SET );
    write( fd, "b", 1 );
    fp2 = mmap( NULL, 7000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0 );

      /* demonstrate that mappings alias */
    *fp = 'z';
    printf( "%c ", *fp2 );

      /* eliminate first mapping */
    munmap( fp, 1000 );

      /* populate second mapping */
    pen = memset( fp2+10, 'y', 7000 );

      /* wrap up */
    munmap( fp2, 7000 );
    close( fd );
    printf( "%d\n", errno );
}

Der Ausgang ist zxxxxxxxxxyyyyyy.....

Ich nehme an, wenn Sie Pfund auf diese, kann es möglich sein Adressraum laufen schneller als mit mremap. Aber nichts ist so oder so garantiert und es könnte auf der anderen Seite sein genauso sicher.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top