Frage

Beeinflusst Schutzflag den Austausch zwischen Prozessen? Wenn ich PROT_READ haben | PROT_WRITE -geschützter mmapped Speicherbereich, ist es immer noch voll, so lange geteilt, da ich nicht in sie geschrieben haben,

?
int prot = PROT_READ|PROT_EXEC;
image = mmap(NULL, filesize, prot, MAP_PRIVATE, fildes, 0);

vs:

int prot = PROT_READ|PROT_WRITE|PROT_EXEC;
image = mmap(...)

Ich möchte eine kleine Änderung an kleinen Teil des Speicherbereichs machen, nachdem ich es kartiert haben, dann wieder mprotect sie alle, weil es einfacher ist als mprotecting kleine Portionen, wenn ich so tun müssen.

Die Frage ist, ob es die gesamte Datei pro Prozess kopiert zwingt endet oder nur die Teile I pro Prozess geändert?

War es hilfreich?

Lösung

Nach dem mmap (2) Mann-Seite auf einem aktuellen Linux-System ordnet MAP_PRIVATE den Speicher mit Copy-on -Schreiben (COW). Das bedeutet, Ihr Gedächtnis wird nicht dupliziert werden, wenn Sie Änderungen vornehmen. Als KUH eine effiziente Methode, dies zu implementieren, gehe ich davon aus es auf diese Weise auch in andere * NIX-Systemen durchgeführt wird.

Der Speicher für mmap wird in gleich große Stücke organisiert, so genannten Seiten. Speicher wird immer ein Vielfaches der Seitengröße abgebildet werden, das heißt ganze Seiten. Jede Seite kann unabhängig ausgetauscht werden. Also, wenn Sie etwas zu diesem mmap'ed Speicherbereich schreiben, nur mindestens eine Seite hat kopiert werden.

Die Seitengröße hängt von Ihrem System, auf x86 es in der Regel 4096 Bytes ist. Wenn Sie Interesse an der Seitengröße Ihres Systems sind, können Sie sysconf (3) .

   #include <unistd.h>
   long pagesize = sysconf(_SC_PAGESIZE);

Der Zeiger Sie von mmap () erhalten wird darauf bereits auf ein Vielfaches der Seitengröße und Sie sollten mprotect () eine Adresse ausgerichtet ist an einer Seitengrenze passieren.

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