2011-01-13 2 views
10

Мне было интересно, возможно ли предотвратить замену памяти объекта (класса или структуры) на диск?Можете ли вы остановить обмен памяти на диск?

Редактировать: Что касается того, почему мне сказали, что некоторые данные, с которыми я буду работать, не могут быть записаны на диск.
Я не ожидаю, что он останется достаточно длинным для того, чтобы данные были заменены, но подумал, что стоит проверить.

+4

Почему вы хотите предотвратить это? =) – Jens

+2

Вы имеете в виду, кроме того, используя его? Обычно беспокойство по поводу такого рода вещей остается за операционной системой. Просто используя его, вы уменьшаете вероятность его размещения в вашем пространстве подкачки. Если вы не использовали его в последнее время, есть вероятность, что его можно разместить на диске. Вы видите объекты, которые часто используются на диске? – Crisfole

+2

Я чувствую запах микро оптимизации. Откуда вы знаете, что это проблема для вас? –

ответ

4

Возможно, вы ищете SecureString class, который не будет заменен на диск.

+0

Я сомневаюсь, что это то, что искал, но спасибо за ссылку :) –

+3

Есть ли какая-либо ссылка, которая доказывает, что SecureString не заменяется? Я вижу, что это может быть GCed, не получает пул и неявно зашифрован. Если SecureString не будет заменен, его реализация может дать подсказку. – atamanroman

+1

Это неточно. SecureString существует, особенно, чтобы не видеть строку в файле подкачки. –

0

Не совсем, это операционная система.

Просто будьте уверены, что стратегия пейджинга Windows будет определять приоритетность хранения наиболее часто используемых страниц, поэтому, если определенная страница важна для вашего приложения, она будет там как можно больше.

0

Ум, хороший вопрос .. вы можете полностью отключить swap в windows (size = 0), но idk, если этого достаточно, чтобы предотвратить обмен .NET.

+0

похоже, что это может быть единственный способ :( – Dreaddan

3

Это технически возможно. Страницы памяти могут быть заблокированы в ОЗУ с помощью функции API VirtualLock(). Проблема заключается в том, что требуется указать адрес страницы (ов), которую вы хотите заблокировать. Вы не можете получить этот адрес любым документированным способом из сборщика мусора. Также не имеет никакого обещания, что такой же адрес, скажем, куча gen # 0 будет повторяться. Во-первых, размер этой кучи динамический, обычно в диапазоне от 2 до 8 мегабайт, в зависимости от шаблона распределения программы.

Просто случайная блокировка большого диапазона с надеждой на то, что вы поймаете большинство из них, также не работает. Процесс получает квоту блокируемых страниц. Он не очень большой, прежде всего потому, что он настолько дестабилизирует работу машины. Здесь живут драконы.

+0

Вы бы подумали, что ms предоставил бы .net equiv VirtualLock. – Dreaddan

8

Я все еще не понимаю, почему вы хотите это сделать. В контексте C# вам нужно сделать две вещи: «привязать» память, чтобы она не могла быть перемещена сборкой мусора, а затем заблокировать ее, чтобы она не поменялась.

Вот хороший блог, который описывает, как сделать первую часть (пиннинга):

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

Теперь вам нужен адрес и размер объекта, чтобы иметь возможность ссылаться на VirtualLock:

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

Обратите внимание, что VirtualLock только блокирует страницы (единица 4K), так что ваша области памяти должна быть по крайней мере, большими, и выровнена к началу страницы , Я предполагаю, что он должен быть вызван в контексте unsafe, хотя я не уверен.

Предыдущее сообщение на тему: Prevent an object from being paged out (VirtualLock equivalent)

Другой связанный сообщение в блоге: http://geekswithblogs.net/robp/archive/2008/08/13/speedy-c-part-3-understanding-memory-references-pinned-objects-and.aspx

4

Я хотел бы сделать что-то совершенно другое:

Построить хороший родной оберточной C++ DLL с вашим желаемые функции/распределения/любые , которые также будут уверены, что данные не будут заменены (VirtualLock, как кто-то сказал здесь). Используйте его с C#.

В конце концов, изначально это возможно, это просто, что вы теперь связаны с C#. Итак, обойти это!

0

В зависимости от вашей среды вы также можете сделать это на уровне ОС - просто используйте действительно мускулистую машину с большим количеством ОЗУ и полностью отключите подкачку/обмен. Это означает, что вам лучше никогда не перегружать эту оперативную память, но именно здесь задача возвращается на C# - вы можете ограничить использование максимальной памяти с помощью умного дизайна.

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

Смежные вопросы