Speicherverwaltung: eigene vs. System

27/04/2009 - 16:34 von Ole Streicher | Report spam
Hallo,

ich habe in einem Programm die Notwendigkeit, einige ziemlich große
Datenblöcke (ca. 2-4 Blöcke, jeweils ca. 1-2 GB) zu verwalten
(wahlfreier Zugriff).

Dafür sehe ich im Prinzip zwei Möglichkeiten:

1. Ich alloziere einfach genügend große Speicherbereiche und verwende
sie. Wenn der (physische) Speicher ausgeht, wird ja sowieso in den
Swap ausgelagert.

2. Ich lege für die Blöcke Temp-Dateien an und verwende mmap() für den
direkten Zugriff. Wenn noch genügend physischer Speicher vorhanden ist,
erfolgt das Datenkopieren sowieso im Cache.

Auf den ersten Blick erscheinen mir beide Möglichkeiten etwa
gleichwertig: solange nur genug physischer Speicher vorhanden ist,
erfolgen die Operationen potentiell eher im RAM als auf der
Festplatte.

Im ersten Fall bin ich aber in der Größe auf das limitiert, was der
(spàtere) Benutzer als Swap angelegt hat, wàhrend im zweiten Fall im
Grunde nur das Dateisystem ein Limit darstellt (?). Dafür wird man
wohl im zweiten Fall "gegen" das OS arbeiten, welches aus
Sicherheitsgründen immer mal (sinnlos) Daten auf die Platte schreiben
wird --> eigentlich erscheint mit die erste Lösung als einzig
sinnvolle und die zweite als (von absoluten Ausnahmen abgesehen)
unsinnig.

Was mich nur stutzig macht: warum legen dann Programme überhaupt
temporàre (auf den Programmlauf beschrànkte) Dateien an? Der einzige
Grund, der mit einfiele, wàre IPC, aber selbst da ist ein
Zwischenspeicher auf der Platte sicher keine gute Wahl.

Gibt es einen Grund, *nicht* malloc() zu nehmen, sondern mmap()?

Viele Grüße

Ole
 

Lesen sie die antworten

#1 Frank Mertens
27/04/2009 - 20:32 | Warnen spam
Auf den ersten Blick erscheinen mir beide Möglichkeiten etwa
gleichwertig: solange nur genug physischer Speicher vorhanden ist,
erfolgen die Operationen potentiell eher im RAM als auf der
Festplatte.



Das malloc() ist für viele kleine Allokationen optimiert und sollte
unter anderem auch defragmentieren. Könnte aber ein Problem
werden, wenn es dabei einen GB großen Block anfàngt zu schieben.


Im ersten Fall bin ich aber in der Größe auf das limitiert, was der
(spàtere) Benutzer als Swap angelegt hat, wàhrend im zweiten Fall im
Grunde nur das Dateisystem ein Limit darstellt (?). Dafür wird man
wohl im zweiten Fall "gegen" das OS arbeiten, welches aus
Sicherheitsgründen immer mal (sinnlos) Daten auf die Platte schreiben



Es lohnt sich evtl. via MAP_PRIVATE mmap() zu sagen, dass Änderungen
für andere Prozesse nicht sichtbar sein müssen. Daneben gibt es auch
systemspezifische Erweiterungen, die mehr feintüning erlauben.


Was mich nur stutzig macht: warum legen dann Programme überhaupt
temporàre (auf den Programmlauf beschrànkte) Dateien an? Der einzige
Grund, der mit einfiele, wàre IPC, aber selbst da ist ein
Zwischenspeicher auf der Platte sicher keine gute Wahl.




Bei IPC macht man es aus Sicherheitsgründen.
Es greifen die Zugriffsrechte, die durch das Datei-System abgebildet
werden. I-Nodes müssen dabei nicht unbedingt durch ein Fest-
Speichermedium getragen werden. Z.B. auf meinen Solaris ist /var/run
und /tmp mittels Swap-Dateisystem gemountet.

Gruesse,
Frank.

Ähnliche fragen