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


Операционные блокировки

Статьи о блокировках, приведенные в этом разделе, относятся в основном к перенаправителям сети, хотя некоторые сведения предоставляются для клиентских приложений. Дополнительные сведения о блокировке для клиентских приложений см. в статьях Windows SDK opportunistic Locks .

Обзор Oplock

Oplock (оппортунистическая блокировка) — это блокировка, наложенная клиентом на файл, который находится на сервере. В большинстве случаев клиент запрашивает блокировку, чтобы кэшировать данные локально. Блокировки используются перенаправителями сети на клиентах с удаленными серверами и клиентскими приложениями на локальных серверах. Описание различных текущих и устаревших блокировок см. в разделе Типы блокировок операций.

Операции блокировки позволяют клиентам файлового сервера (например, клиентам, использующим протоколы SMB и SMB2) динамически изменять стратегию буферизации для заданного файла или потока в согласованном режиме. Использование блокировок операций повышает производительность и сокращает использование сети. Чтобы повысить производительность сети для удаленных операций с файлами, клиент может локально буферистить файловые данные, что уменьшает или устраняет необходимость в отправке и получении сетевых пакетов. Пример:

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

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

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

Для файловых систем, которые не поддерживают альтернативные потоки данных, например FAT, следует думать о "файле", когда обсуждения oplock ссылаются на "поток".

Основные функции oplock пакета oplock реализуются в ядре, в основном с помощью подпрограмм FsRtlXxx , таких как FsRtlInitializeOplock. Файловые системы вызывают этот пакет для реализации функции oplock в своей файловой системе. В статьях в этом разделе описано, как файловая система NTFS взаимодействует с пакетом oplock ядра. Другие файловые системы работают аналогичным образом, хотя могут быть незначительные различия.

Клавиши oplock

Начиная с Windows 7 дескриптор потока может быть связан с ключом блокировки, который представляет собой значение GUID, используемое для идентификации нескольких дескрипторов, принадлежащих одному представлению кэша клиента. Точнее сказать, что ключ oplock связан с FILE_OBJECT структурой, на которую ссылается дескриптор потока. Это различие важно при дублировании дескриптора, например при использовании DuplicateHandle. Каждый из дублирующихся дескрипторов ссылается на одну и ту же базовую структуру FILE_OBJECT .

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

Блокировка не работает, если:

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

Операция oplock прерывается, даже если это тот же процесс или поток, выполняющий несовместимую операцию. Например, монопольная блокировка немедленно прерывается в следующих случаях:

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

Дополнительные сведения см. в разделе Нарушение блокировки.

Помните, что ключи oplock существуют на дескрипторов, и при создании дескриптора они "помещаются" в дескриптор. Вы можете связать дескриптор с ключом oplock, даже если никакие блокировки не предоставляются.