stringtranslate.com

Блокировка файлов

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

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

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

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

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

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

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

В Microsoft Windows

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Проблемы

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

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

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

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

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

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

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

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

В АмигаОС

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

Блокировка файлов

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

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

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

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

Программное обеспечение для разблокировки

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

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

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

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

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

Рекомендации

  1. ^ Операционная система IBM System/360: Справочник по языку управления заданиями (PDF) . ИБМ . Июнь 1971. стр. 162–164. GC28-6704-1.
  2. ^ ab «Функция CreateFileW». Набор инструментов для разработки программного обеспечения Windows. Документы Майкрософт . windows-sdk-content. Корпорация Майкрософт . Проверено 7 ноября 2018 г.
  3. ^ «Функция LockFileEx». Набор инструментов для разработки программного обеспечения Windows. Документы Майкрософт . windows-sdk-content. Корпорация Майкрософт . Проверено 7 ноября 2018 г.
  4. ^ «Функция LockFileEx». Набор инструментов для разработки программного обеспечения Windows. Документы Майкрософт . windows-sdk-content. Корпорация Майкрософт . Проверено 5 июля 2020 г.
  5. ^ «Функция LockFile». Набор инструментов для разработки программного обеспечения Windows. Документы Майкрософт . windows-sdk-content. Корпорация Майкрософт . Проверено 5 июля 2020 г.
  6. ^ «Обязательная блокировка файлов для операционной системы Linux». ядро.орг . Документация / Файловые системы . Проверено 8 октября 2011 г.
  7. ^ «Используйте Setuid, Setgid и Sticky Bits с сервером для NFS» . cc731734(WS.10) . Проверено 8 октября 2011 г.
  8. ^ Виега, Джон; Мессье, Мэтт (2003). «2.8 Блокировка файлов». Книга рецептов безопасного программирования для C и C++ (1-е изд.). Сабастополь, Калифорния: O'Reilly Media. п. 792. ИСБН 978-0-596-00394-4. Поддержка обязательных блокировок сильно варьируется от одного варианта Unix к другому. И Linux, и Solaris поддерживают обязательные блокировки, но Darwin , FreeBSD , NetBSD и OpenBSD этого не делают, хотя они экспортируют интерфейс, используемый Linux и Solaris для их поддержки. В таких системах этот интерфейс создает рекомендательные блокировки. Поддержка обязательной блокировки не распространяется на NFS.
  9. ^ Стивенс, В. Ричард; Раго, Стивен А. (27 июня 2005 г.). Расширенное программирование в среде UNIX (второе изд.). Аддисон-Уэсли Профессионал. п. 456. ИСБН 978-0201433074.
  10. ^ «Распространенные сообщения об ошибках» . nfs.sourceforge.net . Часто задаваемые вопросы по Linux NFS: D. Source Forge.
  11. ^ «Заблокируйте свой скрипт (от параллельного запуска)» .

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