2013-08-30 6 views
7

Meine Frage ist ähnlich wie this, aber ich frage etwas ein bisschen anders.Sind std :: vector Elemente im physischen Speicher zusammenhängend?

Es ist klar, dass es möglich ist, die Adresse des ersten std::vector Elements als C Array zu verwenden. Das bedeutet, dass im virtuellen Speicher die Elemente std::vector zusammenhängend sind. Wenn jedoch physischer Speicher fragmentiert ist, ist es möglich, dass std::vector tatsächlich in viele Teile im physischen Speicher aufgeteilt ist.

Meine Frage ist: Sind std::vector Elemente zusammenhängend im physischen Speicher (sowie virtuellen Speicher)?

+4

@hsouza: Das ist, was er verbunden ist. Er scheint zu fragen, ob das Betriebssystem selbst die Zusammenhängigkeit "fälschen" kann, aber die "echte" Speicherspaltung hat; ehrlich gesagt verstehe ich es nicht. – GManNickG

+0

@hsouza Ich habe einen Link dazu in meiner Frage hinzugefügt. – ST3

+2

Unter der Haube malloc verwendet mmap, also die Frage wäre, wenn mmap Ihnen angrenzenden physischen Speicher geben kann. Haben Sie sich das angesehen: http://stackoverflow.com/questions/4401912/linux-continuous-physical-memory-from-userrspace – LarryPel

Antwort

14

Der Speicher, der zum Speichern der Daten in einem Vektor verwendet wird, muss sich an zusammenhängenden Adressen befinden, da diese Adressen für den Code sichtbar sind.

In einem typischen Fall auf den meisten modernen CPUs/Betriebssystemen bedeutet dies, dass die virtuellen Adressen zusammenhängend sein müssen. Wenn diese virtuellen Adressen eine Seitengrenze überschreiten, besteht eine gute Chance, dass die physischen Adressen nicht mehr zusammenhängend sind.

Ich sollte hinzufügen, dass dies nur selten ein Hauptanliegen ist. Moderne Systeme unterstützen zumindest eine solche fragmentierte Speichernutzung in vielen Fällen bis hin zur Hardwareebene. Zum Beispiel enthalten viele Netzwerk- und Festplatten-Controller eine "Scatter/Gather" -Fähigkeit, wobei das OS die Seitentabellen verwendet, um die virtuellen Adressen für den Puffer in physikalische Adressen zu übersetzen, und dann eine Anzahl von physikalischen Adressen direkt an den Controller liefert, der dann sammelt die Daten von diesen Adressen, wenn sie von dem Speicher zu dem Peripheriegerät übertragen werden oder die Daten zu diesen Adressen "streuen", wenn sie von Peripherie zu Speicher übertragen werden.

6

Nein, es gibt keine Garantie, dass Ihnen zusammenhängender physischer Speicher in der abstrakten Maschine von C++ zur Verfügung gestellt wird. Abstraktionen und Hardware unter malloc können frei verfügbaren Speicher verwenden.

Nur Ihre gezielte Implementierung könnte eine solche Garantie geben, aber die Sprache/das Modell ist nicht wichtig. Es verlässt sich auf das System, um seine Arbeit zu erledigen.

1

Die Zuordnung von virtuellem zu physischem Speicher wird hauptsächlich von der CPU übernommen, jedoch mit Kernel-Unterstützung. Ein Userland-Prozess kann nicht wissen, was diese Zuordnung ist: Ihr Programm, egal was die Programmiersprache, befasst sich ausschließlich mit virtuellen Speicheradressen. Sie können nicht erwarten, und es gibt auch keine Möglichkeit herauszufinden, ob zwei benachbarte virtuelle Speicheradressen, die eine Seitengrenze überspannen, im physischen Speicher benachbart sind, so dass es absolut keinen Sinn hat, sich darüber Gedanken zu machen.

+3

"noch gibt es keine Möglichkeit, sogar herauszufinden" - Nun, das ist im Allgemeinen nicht wahr, in der Regel bietet jedes Betriebssystem eine Möglichkeit, herauszufinden (obwohl es unklar sein kann oder benutzerdefinierte Treiber benötigen) http://stackoverflow.com/ Fragen/6252063/einfachste-Weg-zu-physische-Adresse-aus-dem-logisch-One-in-Linux-Kernel-Modul http://stackoverflow.com/questions/366602/how-to-translate-a -virtuelle Speicheradresse-zu-einer-physischen-Adresse; auf der anderen Seite stimme ich zu, dass es keinen Standard gibt, so etwas zu tun. –

+0

OK, @Matteo, können Sie mir sagen, wie ein Benutzerlandprogramm die physische Adresse bestimmen kann, die einem beliebigen Zeiger in C unter Linux entspricht, und welche Informationen verwendet werden? – Emmet

+1

Zum Beispiel die Abfrage eines benutzerdefinierten Treibers, der die oben im ersten Link beschriebenen Schritte ausführt und das Ergebnis an diesen zurückgibt; Für die Verwendung kann es das Frontend für einen Kernel-Debugger oder ein Hack-Tool oder was auch immer sein. Mein Punkt ist, dass das Sagen "es gibt keinen Weg es herauszufinden" nicht korrekt ist, einfach gibt es keinen * Standard * oder * einfachen * Weg. Ich weiß, dass es pingelig ist (und in der Tat, die +1, die du hier hast, gehört mir), aber ich mag keine absoluten Aussagen, die falsch sind. –

Verwandte Themen