VirtualLock по умолчанию в спешке исчерпает квоту, даже если вы разрешите пользователю (по умолчанию параметр политики безопасности «Блокировать страницы в памяти» не имеет записей (даже для администратора)).
Если вы все же настроите это, вам также нужно будет установить «Настроить квоты памяти для процесса».
Этот вопрос немного неоднозначен: какую часть пространства виртуальной машины вы хотите предотвратить от выгрузки? Куча / стек / модули? ...?
В целом, одно из решений, которое я использовал в прошлом, - это создать DLL с большим разделом, который был READ + WRITE, неподвижным, вы также можете пометить его EXECUTE и SHARED, если это необходимо, но тогда я бы HeapCreate в разделе этого модуля , что позволяет мне использовать его как кучу.
Вы можете найти точный бит для установки здесь , IMAGE_SCN_MEM_NOT_PAGED
похоже, это поможет.
Если вы пройдете через процесс маркировки всех ваших модулей и разделов с помощью этого бита, загрузчик модулей Windows не будет взимать отдельную пользовательскую квоту или требовать изменения настроек политики в каждой системе, в которой вы развертываете свой код. Вам нужно будет ввести код в специальной прокладке, чтобы обеспечить доступ к HEAP, который вы создаете, в этих библиотеках NON_PAGEABLE.
Это немного поработало, но в прошлом у меня это сработало, у меня было дополнительное требование разделять память для нескольких процессов, которые базировались на одном и том же адресе.
Я думаю, что проще всего попробовать полностью отключить файл подкачки. Но до этого, если вы используете ОС Vista / 2008 +, подкачка, которую вы видите, может быть связана с суперфетчингом, который может упреждающе «настраивать» вашу систему с предположением, что в ближайшем будущем вам нужно будет использовать то или иное приложение. Некоторые другие простые задачи - остановить неиспользуемые службы, такие как поиск, который может индексировать огромное количество файлов, также вы должны войти в свой «планировщик задач», который настраивает системные задачи, по умолчанию в большинстве систем есть несколько десятков с настройками по умолчанию. действия, которые передадут все дампы Доктора Ватсона в MS, дефрагментируют ваш диск и ряд других, возможно, чрезвычайно интенсивных операций с памятью.
Вы могли бы ответить немного подробнее, чтобы получить более точные ответы ... но еще одно предложение - просто приобрести большой твердотельный накопитель и использовать его исключительно для подкачки, помните, что со временем они ухудшаются в общей производительности из-за размера из-за отображение плохих блоков, общее для всех существующих технологий SSD.
Недавно я наткнулся на проект codeplex под названием "non-paged clr host" со своей страницы:
Реализация С точки зрения реализации, невыгружаемый узел CLR использует SetProcessWorkingSetSize, SetProcessWorkingSetSizeEx (в Windows Server 2003 и более поздних версиях) и VirtualLock, чтобы гарантировать, что выделенная им память заблокирована в физической памяти. Обратите внимание, что использование вышеупомянутых API не не гарантирует с абсолютной уверенностью, что никакого разбиения на страницы не произойдет; вместо этого он сводит к минимуму вероятность того, что это произойдет в очень исключительных сценариях. В некоторых проведенных нами нагрузочных тестах, даже когда система в целом перегружалась из-за нехватки физической памяти, в процессе не было обнаружено ошибок страницы с использованием невыгружаемого Хост CLR.
person
RandomNickName42
schedule
02.07.2009