Блокировка файлов - File locking

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

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

  1. Процесс A считывает запись клиента из файла, содержащего информацию об учетной записи, включая баланс счета и номер телефона клиента.
  2. Теперь процесс B читает ту же запись из того же файла, поэтому у него есть собственная копия.
  3. Процесс A изменяет баланс счета в своей копии записи о клиенте и записывает запись обратно в файл.
  4. Процесс B, который все еще имеет исходное устаревшее значение баланса счета в его копии записи клиента, обновляет баланс счета и записывает запись клиента обратно в файл.
  5. Теперь процесс B записал в файл устаревшее значение остатка на счете, в результате чего изменения, внесенные процессом A, будут потеряны.

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

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

В мэйнфреймах

IBM впервые применила блокировку файлов в 1963 году для использования в мэйнфреймах с OS / 360 , где это было названо «исключительным контролем».

В Microsoft Windows

Microsoft Windows использует три различных механизма для управления доступом к общим файлам:

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

Windows наследует семантику средств управления общим доступом из системы MS-DOS , где совместное использование было введено в MS-DOS 3.3. Таким образом, приложение должно явно разрешать совместное использование при открытии файла; в противном случае он имеет эксклюзивный доступ для чтения, записи и удаления к файлу до закрытия (разрешены другие типы доступа, например, для получения атрибутов файла).

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

Для приложений, использующих API-интерфейсы чтения / записи файлов в Windows, блокировки диапазона байтов применяются (также называемые обязательными блокировками ) файловыми системами, которые выполняются в Windows. Для приложений, использующих API сопоставления файлов в Windows, блокировки байтового диапазона не применяются (также называемые рекомендательными блокировками ) . Блокировка байтового диапазона может также иметь другие побочные эффекты в системе Windows. Например, механизм совместного использования файлов Windows обычно отключает кэширование файла на стороне клиента для всех клиентов, когда какой-либо клиент использует блокировки диапазона байтов . Клиент будет наблюдать более медленный доступ, потому что операции чтения и записи должны быть отправлены на сервер, где хранится файл.

Неправильная обработка ошибок в прикладной программе может привести к сценарию, когда файл заблокирован (либо с использованием общего доступа, либо с блокировкой файла с байтовым диапазоном) и не может быть доступен другим приложениям. Если это так, пользователь может восстановить доступ к файлу, вручную завершив работу неисправной программы. Обычно это делается с помощью утилиты диспетчера задач .

Параметр режима совместного использования (dwShareMode) CreateFileфункции (используется для открытия файлов) определяет совместное использование файлов. Можно указать режим совместного использования, чтобы разрешить общий доступ к файлу для чтения, записи или удаления, или любую их комбинацию. Последующие попытки открыть файл должны быть совместимы со всеми ранее предоставленными правами общего доступа к файлу. Когда файл закрывается, ограничения общего доступа корректируются, чтобы удалить ограничения, налагаемые открытием этого конкретного файла.

Тип блокировки байтового диапазона определяется dwFlagsпараметром LockFileExфункции, используемой для блокировки области файла. Windows API , функция LockFileтакже может быть использована и приобретает исключительную блокировку на области файла.

Любой файл , содержащий исполняемый файл программы , который в настоящее время работает на компьютере системы в программе (например EXE, COM, DLL, CPLили другой формат файла двоичной программы) , как правило , блокируется самой операционной системы, предотвращая любое приложение от изменения или удаления. Любая попытка сделать это будет отклонена из-за ошибки нарушения совместного доступа, несмотря на то, что файл программы не открывается ни одним приложением. Однако некоторый доступ все же разрешен. Например, файл запущенного приложения можно переименовать или скопировать (прочитать) даже во время выполнения.

Доступ к файлам из приложений в Windows осуществляется с помощью дескрипторов файлов . Эти дескрипторы файлов можно просмотреть с помощью утилиты Process Explorer . Эту утилиту также можно использовать для принудительного закрытия дескрипторов без необходимости завершать удерживающее их приложение. Это может вызвать неопределенное поведение, поскольку программа получит неожиданную ошибку при использовании принудительно закрытого дескриптора и может даже работать с неожиданным файлом, поскольку номер дескриптора может быть повторно использован.

В редакциях Microsoft Windows XP и Server 2003 в NTFS появилась возможность создания моментальных снимков тома ( VSS) , что позволяет программам резервного копирования открывать файлы, несмотря на любые эксклюзивные блокировки. Однако, если программное обеспечение не будет переписано специально для поддержки этой функции, моментальный снимок будет только согласованным с аварийным завершением работы, в то время как должным образом поддерживаемые приложения могут помочь операционной системе в создании "транзакционно согласованных" моментальных снимков. Другое коммерческое программное обеспечение для доступа к заблокированным файлам в Windows включает диспетчер доступа к файлам и диспетчер открытых файлов . Они работают путем установки собственных драйверов для доступа к файлам в режиме ядра .

В Unix-подобных системах

Unix-подобные операционные системы (включая Linux и MacOS от Apple ) обычно не блокируют автоматически открытые файлы. В различных версиях Unix доступно несколько видов механизмов блокировки файлов, и многие операционные системы поддерживают более одного типа для совместимости. Самый распространенный механизм - это fcntl. Два других таких механизма - это flock(2)и lockf(3), которые могут быть отдельными или могут быть реализованы поверх fcntl. Хотя некоторые типы блокировок можно настроить как обязательные, блокировки файлов в Unix по умолчанию рекомендуются . Это означает, что взаимодействующие процессы могут использовать блокировки для координации доступа к файлу между собой, но не взаимодействующие процессы также могут игнорировать блокировки и обращаться к файлу любым способом по своему усмотрению. Другими словами, файловые блокировки блокируют только другие файловые хранилища, но не ввод-вывод.

Предлагаются два типа блокировок: общие блокировки и эксклюзивные блокировки. В случае fcntl, различные виды блокировок могут применяться к разным разделам (диапазонам байтов) файла или ко всему файлу. Общие блокировки могут удерживаться несколькими процессами одновременно, но эксклюзивная блокировка может удерживаться только одним процессом и не может сосуществовать с общей блокировкой. Чтобы получить разделяемую блокировку, процесс должен дождаться, пока ни один из процессов не будет удерживать эксклюзивные блокировки. Чтобы получить монопольную блокировку, процесс должен дождаться, пока ни один из процессов не установит блокировку любого типа. В отличие от блокировок, созданных с помощью fcntl, блокировки , созданные с помощью flock, сохраняются в forks, что делает их полезными при разветвлении серверов. Следовательно, более чем один процесс может удерживать монопольную блокировку одного и того же файла при условии, что эти процессы разделяют сыновние отношения и монопольная блокировка изначально была создана в одном процессе, а затем дублировалась в файле fork.

Совместно используемые блокировки иногда называют «блокировками чтения», а эксклюзивные блокировки - «блокировками записи». Однако, поскольку блокировки в Unix рекомендуются, это не применяется. Таким образом, для базы данных возможно использовать концепцию «совместно используемой записи» и «исключительной записи»; например, изменение поля на месте может быть разрешено при совместном доступе, тогда как для сбора мусора и перезаписи базы данных может потребоваться монопольный доступ.

Блокировки файлов применяются к фактическому файлу, а не к имени файла. Это важно, поскольку Unix позволяет нескольким именам ссылаться на один и тот же файл. Вместе с необязательной блокировкой это обеспечивает большую гибкость при доступе к файлам из нескольких процессов. С другой стороны, подход кооперативной блокировки может привести к проблемам, когда процесс записывает в файл, не подчиняясь блокировкам файлов, установленным другими процессами.

По этой причине некоторые Unix-подобные операционные системы также предлагают ограниченную поддержку обязательной блокировки . В таких системах файл, setgidбит которого включен, но бит выполнения группы отключен при открытии этого файла, будет подвергаться автоматической принудительной блокировке, если соответствующая файловая система поддерживает это. Однако нелокальные разделы NFS обычно игнорируют этот бит. Если файл подлежит обязательной блокировке, попытки чтения из области, которая заблокирована эксклюзивной блокировкой, или записи в область, которая заблокирована общей или монопольной блокировкой, будут блокироваться до тех пор, пока блокировка не будет снята. Эта стратегия впервые зародилась в System V, и сегодня ее можно увидеть в операционных системах Solaris , HP-UX и Linux. Однако он не является частью POSIX, и операционные системы, производные от BSD, такие как FreeBSD , OpenBSD , NetBSD и macOS от Apple, не поддерживают его. Linux также поддерживает обязательную блокировку с помощью специального -o mandпараметра для монтирования файловой системы ( mount(8)), но он используется редко.

Некоторые Unix-подобные операционные системы предотвращают попытки открыть исполняемый файл работающей программы для записи; это третья форма блокировки, отличная от тех, которые предусмотрены fcntlи flock.

Проблемы

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

Обязательные блокировки не влияют на unlinkсистемный вызов. Следовательно, некоторые программы могут эффективно обходить обязательную блокировку. Стивенс и Раго (2005) заметили, что edредактор действительно это сделал.

То, как и как flockработают блокировки в сетевых файловых системах, таких как NFS , зависит от реализации. В BSD системах, flockзвонки на файловом дескрипторе , открытые для файла на смонтированном с NFS раздела успешные нет-OPS . В Linux до 2.6.12 flockвызовы файлов NFS выполнялись только локально. Ядро 2.6.12 и выше реализуют flockвызовы файлов NFS с использованием блокировок байтового диапазона POSIX. Эти блокировки будут видны другим клиентам NFS, которые реализуют блокировки POSIX вfcntl стиле POSIX , но невидимы для тех, кто этого не делает.

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

Все fcntl блокировки, связанные с файлом для данного процесса, снимаются, когда какой-либо файловый дескриптор для этого файла закрывается этим процессом, даже если блокировка никогда не запрашивалась для этого файлового дескриптора. Кроме того, fcntlблокировки не наследуются дочерним процессом. В fcntlблизкой Семантике особенно нежелательна для приложений, вызов подпрограммы библиотеки , которые могут получить доступ к файлам. Ни одна из этих «ошибок» не возникает при использовании flockблокировок в реальном стиле.

Сохранение статуса блокировки дескрипторов открытых файлов, передаваемых другому процессу с использованием сокета домена Unix, зависит от реализации.

Проблемы с буферизованным вводом / выводом

Один из источников сбоя блокировки возникает, когда буферизованный ввод-вывод имеет буферы, назначенные в локальной рабочей области пользователя, а не в пуле буферов операционной системы. freadи fwriteобычно используются для буферизованного ввода-вывода, и как только раздел файла будет прочитан, другая попытка чтения этого же раздела, скорее всего, получит данные из локального буфера. Проблема в том, что другой пользователь, подключенный к тому же файлу, имеет свои собственные локальные буферы, и с ними происходит то же самое. fwriteДанных , полученных из буфера путем freadбудет не будет получать данные из самого файла, а какой - то другой пользователь мог изменить его. Оба могут использоваться flockдля монопольного доступа, что предотвращает одновременную запись, но поскольку операции чтения считываются из буфера, а не из самого файла, любые данные, измененные пользователем №1, могут быть потеряны пользователем №2 (перезаписаны). Лучшее решение этой проблемы - использовать небуферизованный ввод-вывод ( readи write) с flock, что также означает использование lseekвместо fseekи ftell. Конечно, вам придется внести изменения в параметры функции и возвращаемые результаты. Вообще говоря, буферизованный ввод-вывод небезопасен при использовании с общими файлами.

В AmigaOS

В AmigaOS блокировку файла (или каталога) можно получить с помощью Lockфункции (в файле dos.library). Блокировка может быть общей (другие процессы могут читать файл / каталог, но не могут изменять или удалять его) или эксклюзивной, так что только процесс, который успешно установил блокировку, может получить доступ к объекту или изменить его. Замок находится на объекте в целом, а не на его части. Блокировка должна быть снята с помощью UnLockфункции: в отличие от Unix, операционная система не разблокирует объект неявно, когда процесс завершается.

Заблокировать файлы

Сценарии оболочки и другие программы часто используют стратегию, аналогичную использованию блокировки файлов: создание файлов блокировки , которые представляют собой файлы, содержимое которых не имеет значения (хотя часто можно найти идентификатор процесса держателя блокировки в файле) и чьи единственная цель - сигнализировать своим присутствием о том, что какой-то ресурс заблокирован. Файл блокировки часто является лучшим подходом, если управляемый ресурс вообще не является обычным файлом, поэтому использование методов блокировки файлов не применяется. Например, файл блокировки может управлять доступом к набору связанных ресурсов, например к нескольким различным файлам, каталогам, группе разделов диска или выбранному доступу к протоколам более высокого уровня, таким как серверы или соединения с базой данных.

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

  • С помощью lockfileкоманды (создатель условного семафорного файла, входящий в состав procmailпакета).
  • Системные вызовы, которые создают файл, но не работают, если файл уже существует. (Системные вызовы доступны из таких языков, как C или C ++, а сценарии оболочки могут использовать noclobber )
  • Использование mkdirкоманды и проверка кода выхода на отказ

Файлы блокировки часто имеют ~префикс тильды ( ) перед именем файла, который они блокируют, или дубликат полного имени файла с суффиксом .LCK . Если они блокируют ресурс, отличный от файла, они могут называться более произвольно.

Некоторые продукты Mozilla (например, Firefox , Thunderbird, Sunbird) используют этот тип механизма блокировки файловых ресурсов (используя временный файл с именем "parent.lock").

Программа разблокировки

Разблокировщик - это утилита, используемая для определения того, какой процесс блокирует файл, и отображает список процессов, а также варианты того, что делать с процессом (задача уничтожения, разблокировка и т. Д.), А также список параметров файла, таких как удалить или переименовать. В некоторых Unix-подобных системах такие утилиты, как fstatи, lockfмогут использоваться для проверки состояния блокировок файлов по процессам, по имени файла или по обоим параметрам.

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

Системы контроля версий

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

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

использованная литература

внешние ссылки