2 Stimmen

Wird mmap kontinuierlichen Speicher verwenden? (unter Solaris)

Ich habe mmap verwendet (versuche gerade zu verstehen, wie mmap funktioniert), um 96k anonymen Speicher zuzuweisen, aber es sieht aus wie es die 96k in 64k und 32k aufgeteilt. Aber wenn ich 960k alloziere, wird nur ein Chunk mit einer Größe von 960k zugewiesen. Wann wird Solaris den zugewiesenen Speicher in mehrere Teile aufteilen? Code:

#define PROT PROT_READ | PROT_WRITE
#define MAP  MAP_ANON  | MAP_PRIVATE
if ((src = mmap(0, 88304, PROT, MAP, -1, 0)) == MAP_FAILED)
    printf("mmap error for input");

if ((src = mmap(0, 983040, PROT, MAP, -1, 0)) == MAP_FAILED)
    printf("mmap error for input");

if ((src = mmap(0, 98304, PROT, MAP, -1, 0)) == MAP_FAILED)
    printf("mmap error for input");

Fachwerk:

mmap(0x00000000, 88304, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0)
    = 0xFFFFFFFF7E900000
mmap(0x00000000, 983040, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0)
    = 0xFFFFFFFF7E800000
mmap(0x00000000, 98304, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0)
    = 0xFFFFFFFF7E700000

Pmap:

FFFFFFFF7E700000         64     -          -          - rw---    [anon]
    ==> strange is that for 96k, it was broken into 2 part.
FFFFFFFF7E710000         32     -          -          - rw---    [anon]
FFFFFFFF7E800000        960     -          -          - rw---    [anon]
FFFFFFFF7E900000         64     -          -          - rw---    [anon]
FFFFFFFF7E910000         24     -          -          - rw---    [anon]
FFFFFFFF7EA00000         64     -          -          - rw---    [anon]
FFFFFFFF7EA10000         32     -          -          - rw---    [anon]

3voto

paxdiablo Punkte 809679

Das ist zusammenhängenden Speicher, können Sie an den Adressen erkennen (F...700000 + 64K = F...710000) Ich glaube also nicht, dass Sie sich darüber Sorgen machen müssen. Ich bin mir ziemlich sicher, dass mmap erforderlich ist, um Ihnen zusammenhängenden Speicher in Ihrem Adressraum zu geben. Ansonsten wäre es ziemlich nutzlos, da es Ihnen nur eine Basisadresse gibt. Mit zwei nicht zusammenhängenden Blöcken gäbe es keine Möglichkeit, den zweiten Block zu finden.

Ihre Frage lautet also: Warum werden zwei Blöcke in der pmap angezeigt?

Darauf würde ich antworten: "Keine Ahnung". Aber ich kann eine intelligente Vermutung anstellen, was das Beste ist, was man von mir um diese Zeit am Morgen (vor dem Kaffee) erwarten kann.

Ich würde vermuten, dass diese Blöcke zuvor einem anderen Prozess (oder zwei) zugewiesen und an den mmap-Speichermanager zurückgegeben worden waren. Ich sehe zwei Möglichkeiten, wie der Speichermanager Blöcke zusammenfasst, um größere freie Blöcke zu bilden:

  • sobald der Speicher freigegeben wird (was nicht der Fall ist, wie Ihre Ausgabe zeigt, die no geschieht).
  • er tut es regelmäßig und war noch nicht dazu gekommen, bevor Sie Ihren 96K-Block angefordert haben; oder
  • stört es überhaupt nicht, denn es ist schlau genug, dies während der Zuweisung eines Blocks an Sie zu tun.

Ich vermute, dass es das Letztere ist, weil der Speichermanager keine Probleme hatte, Ihnen zwei Blöcke für Ihre Anfrage zu geben, also ist er offensichtlich dafür ausgelegt. Der 960K-Block ist wahrscheinlich nicht segmentiert, weil er aus einem viel größeren Block stammt.

Denken Sie daran, dass dies eine (fundierte, aber dennoch spekulative) Vermutung ist. Ich habe schon einiges von den Interna von UNIX gesehen (echte UNIXe, nicht dieses neue Kind im Block :-), aber ich hatte noch nie das Bedürfnis, mich mit mmap zu beschäftigen.

3voto

Charlie Martin Punkte 106684

Ich kann mich nicht mehr an den Begriff dafür erinnern (Stripes? Slices? Wedges? argh), aber Solaris weist unterschiedliche Seitengrößen aus unterschiedlich großen Pools zu. Dies erweist sich als etwas effizienter als einheitliche Seitengrößen, weil es die Speicherzuordnung besser nutzt. Eine dieser Größen ist 32K, eine andere 64K, eine weitere ist 1024K, glaube ich. Um 96K zu erhalten, hat man 64 und 32, um 960 zu erhalten, hat man den größten Teil von 1024K.

Die wichtigste Ressource für diese Zauberei ist die Solaris Interna Buch. Meines liegt leider in einer Kiste in der Garage.

0voto

Robert Punkte 1

Die Antwort hängt davon ab, was Sie mit "zusammenhängend" meinen. Solaris und alle modernen Unix- und unixähnlichen Systeme (wahrscheinlich alle modernen Betriebssysteme) unterteilen den physischen Speicher in Seiten, und der Speicher innerhalb einer "Seite" ist auf der physischen Ebene zusammenhängend. Die meisten modernen Systeme verfügen über eine Hardware-MMU (Memory Management Unit), die eine virtuelle Adresse in eine physikalische Adresse umwandelt. Der Systemaufruf mmap gibt also einen zusammenhängenden virtuellen Adressraum zurück, aber diese virtuelle Adresse wird von einer MMU verwaltet, die je nach Größe der Seite(n) und der Größe der Speicherzuordnung mehrere Seiten verwenden kann.

Während alle virtuellen Adressen zusammenhängend sind (innerhalb der Abbildung) Die Adressen innerhalb der "Seiten" sind auch physisch zusammenhängend, aber die Seiten und die Übergänge zwischen den Seiten sind möglicherweise nicht einmal physisch nahe beieinander.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X