Можете ли вы помешать обмену памяти на диск? - PullRequest
11 голосов
/ 13 января 2011

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

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

Ответы [ 7 ]

8 голосов
/ 15 января 2011

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

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

http://www.matthew -long.com / 2005/10/18 / память пиннинга /

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

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

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

Предыдущая запись по теме: Предотвращение удаления объекта (эквивалент VirtualLock)

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

6 голосов
/ 13 января 2011

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

4 голосов
/ 15 января 2011

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

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

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

4 голосов
/ 13 января 2011

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

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

0 голосов
/ 30 июля 2017

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

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

0 голосов
/ 13 января 2011

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

0 голосов
/ 13 января 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...