Можете ли вы остановить обмен памяти на диск?

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

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

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

Не совсем, это вещь операционной системы.

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

Ответ 6

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

Ответ 7

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

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