Фиксирование страниц виртуальной памяти
Вирутальная память по сравнению с физической оперативной памятью обладает одним существенным недостатком - невысоким быстродействием. Это из-за того, что файл страниц расположен на диске. В том случае, когда вы, например, создаете драйвер периферийного устройства, обрабатывающий аппаратные прерывания, вам могут потребоваться области памяти, гарантированно размещенные в физической оперативной памяти.
В программном интерфейсе Microsoft Windows NT есть функция VirtualLock, с помощью которой нетрудно зафиксировать нужное вам количество страниц в физической памяти.
Прототип функции VirtualLock представлен ниже:
BOOL VirtualLock(
LPVOID lpvAddress, // адрес начала фиксируемой
// области памяти
DWORD cbSize); // размер области в байтах
Через параметр lpvAddress вы должны передать адрес фиксируемой области памяти, расположенной в страницах, готовых к использованию.
Параметр cbSize, задающий размер фиксируемой области памяти, может иметь значение, которое не кратно размеру страницы. В результате вызова функции будет зафиксировано столько страниц, сколько нужно для размещения указанной области.
Для расфиксирования страниц памяти следует вызвать функцию VirtualUnlock, имеющую аналогичное назначение параметров:
BOOL VirtualUnlock(
LPVOID lpvAddress, // адрес начала расфиксируемой
// области памяти
DWORD cbSize); // размер области в байтах
Сколько страниц памяти можно зафиксировать функцией VirtualLock?
Не очень много. По умолчанию приложение может зафиксировать не более 30 страниц виртуальной памяти. И это сделано не зря - фиксирование большого количества страниц одним приложением уменьшает объем физической памяти, доступной для других приложений и может отрицательно сказаться на производительности всей системы в целом. Однако при необходимости вы можете увеличить это значение при помощи функции SetProcessWorkingSetSize, описанной в SDK.
Отметим, что обычным приложениям, не занимающимся обработкой аппаратных прерываний или решением других задач реального времени, не следует фиксировать страницы памяти, чтобы не мешать работе других приложений и операционной системе.