Seite 1 von 1

Anonymes Memory-Mapping

Verfasst: Montag 20. März 2006, 23:38
von Deever
Hey Amigos, wie geht's?

Ich möchte in einem Programm zwecks effizienten Datenaustausches zwischen Threads Shared Memory verwenden. Da ich aber vor dessen Benutzung nie genau weiß, wieviel Daten darin abgelegt werden, möchte ich das ganze über anonymes Memory-Mapping realisiern, bei dem der Systemkern tatsächlich nur soviel physikalischen Speicher benutzt (allokiert), wie auch wirklich gebraucht wird. Es will mir allerdings nicht so recht gelingen:

Code: Alles auswählen

from mmap import mmap, MAP_ANONYMOUS
mm = mmap(-1, 1024, MAP_ANONYMOUS)
Dies (und anderes) wirft mir aber nur einen EnvironmentError("[Errno 22] Invalid argument") entgegen.
Die Idee, als ersten Parameter für das file Objekt -1 zu übergeben, habe ich Python2.5 entnommen, wo anonymes Memory-Mapping dann mit mmap(-1, SIZE) auch funktioniern soll. Wie ich es allerdings unter 2.4 erreiche, ist mir gänzlich unklar. Hat jemand hier das Wissen und wäre bereit, es zu teilen?

Vielen Dank für eure Antworten!
Gruß,
/dev

Verfasst: Montag 20. März 2006, 23:58
von modelnine
Humm... Warum eine geteilte MMAP? Warum nicht einfach eine globale Python-Variable, die zwischen Threads (eh schon) geteilt wird? Ein geteiltes MMAP bringt Dir keinerlei Vorzüge, weil Python die GIL hat, sprich eh immer nur ein Thread sich in der Ausführung befindet (wenn er Python-Code behandelt). Und Du hast noch den Vorteil bei einer globalen Variablen dass Du den GC von Python benutzt, und Dich um Serialisierung, etc. nicht kümmern brauchst. Interessant wirds erst wenn Du mehrere Prozesse hast, und mittels MMAP einen benannten shared memory-Bereich mappst (zwischen Prozessen).

Unabhängig davon: es sollte (ohne dass ich es ausprobiert hab) gehen wenn Du MAP_PRIVATE|MAP_ANONYMOUS draus machst. /dev/zero (was gemappt wird) ist nicht beschreibbar, deswegen muß eine private Kopie gemacht werden wenn das Objekt beschrieben wird. Ich denk der Fehler kommt schlicht und ergreifend daher dass Du kein MAP_PRIVATE benutzt hast (das ist nicht Standard, Python-Doku und mmap-Doku: "The default is MAP_SHARED."). Probier das mal. Und such mal nach einem shm_*-Modul für Python, die gibts auch, wenn Du wirkliche Gleichzeitigkeit zweier Python-Programme willst ist das genau das was Du brauchst, also zwei Python-Prozesse starten und dann mittels named-shared-memory zwischen den zwei Prozessen kommunizieren.

Dann willst Du aber auch semaphores, usw., was alles noch mal ein Thema für sich ist. ;-)