Oplocks и сетевые перенаправления
Сетевые перенаправления используют оппортунистические блокировки (oplocks) для оптимизации производительности доступа к файлам и уменьшения сетевого трафика в средах клиента-сервера.
Эта документация предназначена для разработчиков сетевого перенаправления, хотя некоторые сведения относятся к разработчикам клиентских приложений. Дополнительные сведения о документации по oplock, связанной с клиентскими приложениями, см. в статьях о оппортунистических блокировках пакета SDK для Windows.
Обзор oplock
Оплок (оппортунистическая блокировка) — это блокировка, помещенная клиентом на файл, который находится на сервере. В большинстве случаев клиент запрашивает оплок, чтобы кэшировать данные локально. Оплоки используются сетевыми перенаправлениями на клиентах с удаленными серверами и клиентскими приложениями на локальных серверах. Типы оплоков см. в описании различных текущих и устаревших оплоков.
Oplocks позволяет клиентам файлового сервера (например, клиентам с помощью протоколов SMB и SMB2) динамически изменять стратегию буферизации для заданного файла или потока согласованно. Использование оплоков повышает производительность и уменьшает использование сети. Чтобы повысить производительность сети для удаленных операций с файлами, клиент может буферировать данные файлов локально, что снижает или устраняет необходимость отправки и получения сетевых пакетов. Например:
- Клиенту может не потребоваться записывать данные в файл на удаленном сервере, если клиент знает, что другой процесс не обращается к данным.
- Клиент может буферифровать данные впереди чтения из удаленного файла, если клиент знает, что ни один другой процесс не записывает данные в удаленный файл.
Приложения и драйверы также могут использовать оплоки для прозрачного доступа к файлам без влияния на другие приложения, которые могут потребоваться использовать эти файлы.
Файловые системы, такие как NTFS, поддерживают несколько потоков данных для каждого файла. Система предоставляет оплоки в дескрипторах потоков, что означает, что операция предоставляется для заданного открытия потока файлов и операций, применяемых к этому потоку. За исключением нескольких исключений, операции с одним потоком не влияют на блокировки в другом потоке. Дополнительные сведения см. в разделе "Запрос и предоставление оплоков".
Для файловых систем, которые не поддерживают альтернативные потоки данных, например FAT, думайте о "файле", когда обсуждения oplock ссылаются на "поток".
Основная функция oplock пакета oplock реализована в ядре, в первую очередь с помощью подпрограмм FsRtlXxx, таких как FsRtlInitializeOplock. Файловые системы вызывают этот пакет для реализации функций oplock в файловой системе. В статьях о блокировке в этом разделе описывается взаимодействие файловой системы NTFS с пакетом oplock ядра. Другие файловые системы работают аналогичным образом, хотя могут быть незначительные различия.
Клавиши oplock
Дескриптор потока может быть связан с ключом oplock, который является значением GUID, которое определяет несколько дескрипторов, принадлежащих одному представлению кэша клиента. Более точно сказать, что ключ oplock связан с структурой FILE_OBJECT , к которому относится дескриптор потока. Это различие важно, если дескриптор дублируется, например с помощью DuplicateHandle. Каждая из повторяющихся дескрипторов ссылается на одну и ту же базовую FILE_OBJECT структуру.
При создании дескриптора потока ключ оплока можно явно указать (в IoCreateFileEx). Если при создании дескриптора не указан явным образом ключ oplock, система обрабатывает дескриптор как уникальный ключ oplock, связанный с ним. Этот уникальный ключ отличается от любого другого ключа в любом другом дескрипторе.
Оплок нарушается, когда:
- Операция файла получается на дескрипторе, отличном от того, на котором была предоставлена блокировка, И
- Ключ oplock, связанный с дескриптором oplock, отличается от ключа, связанного с дескриптором операции, И
- Операция несовместима с предоставленным в настоящее время оплоком.
Оплок прерывается, даже если это тот же процесс или поток, выполняющий несовместимую операцию. Например, монопольная блокировка немедленно нарушается, когда:
- Процесс открывает поток, для которого предоставляется монопольная блокировка.
- Затем этот же процесс снова открывает тот же поток с помощью другого (или нет) ключа оплока.
Дополнительные сведения см. в разделе "Критические блоки".
Помните, что ключи oplock существуют на дескрипторах, и они "помещаются" в дескриптор при создании дескриптора. Можно связать дескриптор с ключом oplock, даже если не предоставляются операции.