2011-01-13 8 views
10

Ich frage mich, ob es möglich war zu verhindern, Speicher eines Objekts (Klasse oder Struktur) auf die Festplatte ausgetauscht werden?Können Sie verhindern, dass der Speicher auf die Festplatte ausgelagert wird?

Edit: Warum habe ich einige der Daten, mit denen ich arbeiten werde, kann nicht auf die Festplatte geschrieben werden.
Ich erwarte nicht, dass es lang genug für die Daten ausgetauscht wird, aber es ist eine Überprüfung wert.

+4

Warum tun Sie dies verhindern wollen? =) – Jens

+2

Du meinst es zu benutzen? Normalerweise ist es dem Betriebssystem überlassen, sich über solche Dinge Sorgen zu machen. Indem Sie es einfach verwenden, reduzieren Sie die Wahrscheinlichkeit, dass es in Ihrem Auslagerungsbereich platziert wird. Wenn Sie es in letzter Zeit nicht benutzt haben, ist es wahrscheinlich in Ordnung, es auf die Festplatte zu legen. Sehen Sie Objekte, die häufig verwendet werden, auf der Festplatte? – Crisfole

+2

Ich rieche eine Mikrooptimierung. Woher weißt du, dass das ein Problem für dich ist? –

Antwort

4

Sie suchen möglicherweise nach SecureString class, die nicht auf die Festplatte ausgetauscht werden.

+0

Ich bezweifle, dass es das ist, was der Fragesteller sucht, aber danke für den Link :) –

+3

Gibt es einen Verweis zur Verfügung, der beweist, dass SecureString nicht vertauscht wird? Ich sehe, dass es GCED, nicht gepoolt werden kann und implizit verschlüsselt ist. Wenn SecureString nicht vertauscht wird, kann die Implementierung einen Hinweis geben. – atamanroman

+1

Dies ist nicht korrekt. SecureString existiert speziell, um zu vermeiden, dass die Zeichenfolge in der Auslagerungsdatei wieder angezeigt wird. –

0

Nicht wirklich, das ist eine Betriebssystem-Sache.

Sie können sicher sein, dass die Paging-Strategie von Windows priorisiert, die am häufigsten aufgerufenen Seiten im Speicher zu belassen. Wenn also eine bestimmte Seite für Ihre Anwendung wichtig ist, wird sie so oft wie möglich angezeigt.

0

Um, gute Frage .. Sie können Swap in Windows vollständig deaktivieren (Größe = 0), aber idk, wenn das genug ist, um zu verhindern, dass .NET austauscht.

+0

zu halten, sieht es so aus, als ob dies der einzige Weg sein könnte :( – Dreaddan

3

Dies ist nur technisch möglich. Speicherseiten können mit der VirtualLock() - API-Funktion im RAM gesperrt werden. Problem ist, dass Sie die Adresse der Seite (n) angeben müssen, die Sie sperren möchten. Sie können diese Adresse nicht in einer dokumentierten Weise vom Garbage Collector abrufen. Es macht auch kein Versprechen, dass die gleiche Adresse für, sagen wir, den Gen # 0 Heap wiederholbar sein wird. Zum einen ist die Größe dieses Heaps dynamisch und liegt normalerweise zwischen 2 und 8 Megabyte, abhängig vom Zuweisungsmuster des Programms.

Nur zufällige Sperren einer großen Palette mit der Hoffnung, dass Sie die meisten von ihnen fangen, funktioniert auch nicht. Ein Prozess erhält eine Quote für abschließbare Seiten. Es ist nicht sehr groß, vor allem weil es für die Bedienung der Maschine so destabilisierend ist. Drachen leben hier.

+0

Sie hätten gedacht, ms hätte eine .net equiv von VirtualLock bereitgestellt. – Dreaddan

8

Ich bin immer noch nicht klar, warum Sie das tun wollen. Im Zusammenhang mit C# müssen Sie zwei Dinge tun: den Speicher "anheften", damit er nicht durch Garbage Collection verschoben werden kann, und ihn dann sperren, damit er nicht ausgelagert wird.

Hier ist ein schönes Blog-Post, die beschreibt, wie der erste Teil tun (Pinning):

http://www.matthew-long.com/2005/10/18/memory-pinning/

Nun müssen Sie die Adresse und die Ausdehnung des Objekts der Lage sein, VirtualLock aufzurufen:

http://msdn.microsoft.com/en-us/library/Aa366895

Beachten Sie, dass VirtualLock nur sperrt Seiten (Einheiten von 4K), so dass Ihr Speicherbereich muss mindestens so groß ist, und zu Beginn einer Seite ausgerichtet sein . Ich nehme an, dass es in einem unsafe Kontext aufgerufen werden muss, obwohl ich nicht sicher bin.

Vorheriger Eintrag zum Thema: Prevent an object from being paged out (VirtualLock equivalent)

Eine andere verwandte Blog-Post: http://geekswithblogs.net/robp/archive/2008/08/13/speedy-c-part-3-understanding-memory-references-pinned-objects-and.aspx

4

ich etwas ganz anderes tun würde:

Erstellen Ihnen eine schönen nativen Verpackung C++ DLL mit Ihrem gewünschte Funktionen/Zuweisungen/was auch immer , die auch sicherstellen, dass die Daten nicht vertauscht werden (VirtualLock wie jemand hier sagte). Benutze es von C#.

Schließlich ist es nativ möglich, nur dass Sie jetzt an C# gebunden sind. Also, komm herum!

0

Abhängig von Ihrer Umgebung können Sie dies auch auf Betriebssystemebene tun - verwenden Sie einfach eine wirklich bullige Maschine mit viel RAM und deaktivieren Sie Paging/Swap vollständig. Es bedeutet, dass Sie diesen RAM niemals überholen sollten, aber da kommt die Aufgabe auf C# zurück - Sie können die maximale Speichernutzung mit intelligentem Design einschränken.

https://www.howtogeek.com/126430/htg-explains-what-is-the-windows-page-file-and-should-you-disable-it/

Verwandte Themen