Ответ 1
Возможно, вы ищете SecureString
класс, который не будет заменен на диск.
Мне было интересно, возможно ли предотвратить замену памяти объекта (класса или структуры) на диск?
Изменить: Что касается того, почему мне сказали, что некоторые из данных, с которыми я буду работать, не могут быть записаны на диск.
Я не ожидаю, что он останется достаточно длинным для того, чтобы данные были заменены, но считали, что стоит проверить.
Возможно, вы ищете SecureString
класс, который не будет заменен на диск.
Я все еще не понимаю, почему вы хотите это сделать. В контексте С# вам нужно сделать две вещи: "закрепить" память, чтобы она не могла быть перемещена сборкой мусора, а затем заблокировать ее, чтобы она не была заменена.
Вот хороший пост в блоге, в котором описывается, как сделать первую часть (пиннинг):
http://www.matthew-long.com/2005/10/18/memory-pinning/
Теперь вам нужно указать адрес и размер объекта, чтобы он мог вызвать VirtualLock
:
http://msdn.microsoft.com/en-us/library/Aa366895
Обратите внимание, что VirtualLock
блокирует только страницы (единицы измерения 4K), поэтому ваша область памяти должна быть, по крайней мере, такой большой, и выравниваться с началом страницы. Я предполагаю, что он должен быть вызван в контексте unsafe
, хотя я не уверен.
Предыдущая публикация на тему: Предотвратить выгрузку объекта (эквивалент VirtualLock)
Еще одно связанное сообщение в блоге: http://geekswithblogs.net/robp/archive/2008/08/13/speedy-c-part-3-understanding-memory-references-pinned-objects-and.aspx
Я бы сделал что-то совершенно другое:
Создайте красивую собственную оболочку С++ DLL с вашими желаемыми функциями/распределениями/независимо , которые также будут следить за тем, чтобы данные не менялись местами (VirtualLock, как кто-то сказал здесь). Используйте его с С#.
В конце концов, изначально это возможно, просто, что вы теперь связаны с С#. Итак, обойдите это!
Это технически возможно. Страницы памяти могут быть заблокированы в ОЗУ с помощью функции API VirtualLock(). Проблема заключается в том, что требуется указать адрес страницы (ов), которую вы хотите заблокировать. Вы не можете получить этот адрес любым документированным способом из сборщика мусора. И обещает, что один и тот же адрес, например, для кучи gen # 0, будет повторяться. Во-первых, размер этой кучи является динамическим, обычно в диапазоне от 2 до 8 мегабайт, в зависимости от шаблона распределения программ.
Просто случайная блокировка большого диапазона с надеждой, что вы поймаете большинство из них, тоже не работает. Процесс получает квоту блокируемых страниц. Он не очень большой, прежде всего потому, что он настолько дестабилизирует работу машины. Здесь живут драконы.
Не совсем, это вещь операционной системы.
Просто будьте уверены, что стратегия подкачки Windows будет приоритизировать сохранение в памяти наиболее часто используемых страниц, поэтому, если определенная страница важна для вашего приложения, она будет там как можно больше.
Ум, хороший вопрос.. вы можете полностью отключить swap в windows (size = 0), но idk, если этого достаточно, чтобы предотвратить обмен .NET.
В зависимости от вашей среды вы также можете сделать это на уровне ОС - просто используйте действительно мускулистую машину с большим количеством ОЗУ и полностью отключите подкачку/обмен. Это означает, что вам лучше никогда не перегружать эту оперативную память, но там, где задача возвращается на С#, вы можете ограничить использование максимальной памяти с помощью умного дизайна.