Поделиться через


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 структуру.

При создании дескриптора потока можно явно указать ключ oplock (в IoCreateFileEx). Если вы явно не указываете ключ oplock при создании дескриптора, система обрабатывает дескриптор так, как если бы у него был уникальный ассоциированный с ним ключ oplock. Этот уникальный ключ отличается от любого другого ключа в любом другом дескрипторе.

При выполнении всех следующих условий опблокировка прерывается:

  • Операция с файлом поступает на дескриптор, отличном от того, на котором была предоставлена блокировка.
  • Ключ oplock, связанный с дескриптором oplock, отличается от ключа, связанного с дескриптором операции.
  • Операция несовместима с предоставленным в настоящее время оплоком.

Блокировка oplock прерывается, даже если тот же процесс или поток выполняет несовместимую операцию. Например, эксклюзивный оплок немедленно прерывается, когда:

  1. Процесс открывает поток, для которого предоставляется монопольная блокировка.
  2. Тот же процесс снова открывает тот же поток, используя другой ключ блокировки или без него.

Дополнительные сведения см. в разделе "Критические блоки".

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