VirtualLock

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

function VirtualLock(
  lpAddress: Pointer;  // начальный адрес фрагмента памяти
  dwSize: DWORD        // размер фрагмента памяти
): BOOL; stdcall;

Параметры

lpAddress [in]
Указывает на начальный адрес диапазона, который будет зафиксрован в памяти.

dwSize [in]
Задает размер региона, который будет зафксирован в памяти. При этом в памяти будут зафиксированы все страницы, в которых присутсвует хотя бы один байт из указанного диапазона от lpAddress до (lpAddress + dwSize). Это означает, в частности, что при попытке зафиксировать в памяти диапазон длиной 2 байта, который берет начало на одной странице, а заканчивается на другой, в памяти будут зафиксированы две страницы памяти (8192 байт).

Возвращаемое значение

В случае удачного завершения функция возвращает значение True.

В случае возникновения ошибки возвращаемым значением функции будет False. Для получения расширенной информации об ошибке следует сделать вызов GetLastError.

Описание

Все страницы памяти в указанном диапазоне должны иметь под собой физическую память. Данный вызов не следует применять к функциям, имеющий атрибут защиты PAGE_NOACCESS.

Фиксация страниц в памяти может привести к уменьшению производительности системы, поскольку уменьшает количество оперативной памяти, которое имеется в распоряжении системы и косвенно заставляет систему производить более часто сброс других критических страниц в файл подкачки. По умолчанию процесс может зафиксировать в памяти не более 30-ти страниц. Это значение по умолчанию специально выбрано таким небольшим, чтобы избежать чрезмерного уменьшения производительности системы. Приложение может зафиксировать в памяти и большее число страниц, но для этого ему необходимо первоначально произвести вызов функции SetProcessWorkingSetSize для увеличения минимального и максимального рабочего размера памяти, используемого процессом. Максимально число страниц памяти, которое может зафиксировать приложение, равно числу страниц минимального рабочего размера приложения минус небольшой заголовок.

Страницы, зафиксированные процессом в физической памяти, сохранются в ней до тех пор, пока процесс сам не снимет с них фиксацию, либо пока процесс не завершиться.

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

Не следует путать указанную функцию с функциями GlobalLock и GlobalLock, которые служат для увеличения числа блокировок, а также для перевода дескриптора в указатель. При фиксации страниц в физической памяти не используется счетчики, поэтому для снятия фиксации со страниц нет необходимости выполнять столько же вызовов VirtualUnlock, сколько раз был произведен вызов VirtualLock.

Windows 95/98 Функция VirtualLock реализована как заглушка, вызов которой не производит никакого эффекта. Результатом вызова всегда является значение True.1

Требования

Windows NT/2000: Требуется Windows NT 3.1 или более поздняя версия
Windows 95/98: Не поддерживается
Бибиотека: Kernel32.dll
Подключаемый модуль: Windows

Смотри также:

  • виртуальная память,
  • работа с виртуальной памятью,
  • список функций для работы с виртуальной памятью,
  • SetProcessWorkingSetSize,
  • VirtualUnlock
  • НазадVirtualFreeEx VirtualProtectВперед

    © Mystic, 2002

    Сноски

    1)  В книге Джеффри Рихтера "Windows для профессионалов" (3-е издение) указано, что функция VirtualLock под операционными системами Windows 95/98 всегда возвращает False. Кто прав (Рихтер или MSDN), я пока не проверял.