Jump to content

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

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

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

  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] функция, используемая для блокировки области файла. Функция API Windows LockFile[5] также может использоваться и получает эксклюзивную блокировку области файла.

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

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

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

В Unix-подобных системах [ править ]

Unix-подобные операционные системы (включая Linux от Apple и macOS ) обычно не блокируют открытые файлы автоматически. В различных версиях 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 , зависит от реализации. В BSD системах flock вызовы файлового дескриптора, открытого для файла в разделе, смонтированном по 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 будет не получать данные из самого файла, и какой-то другой пользователь мог их изменить. Оба могли бы использовать flock чтобы обеспечить монопольный доступ, который предотвращает одновременную запись, но поскольку чтение выполняется из буфера, а не из самого файла, любые данные, измененные пользователем №1, могут быть потеряны пользователем №2 (перезаписаны). Лучшим решением этой проблемы является использование небуферизованного ввода-вывода ( read и write) с flock, что также означает использование lseek вместо fseek и ftell. Конечно, вам придется внести коррективы в параметры функции и возвращаемые результаты. Вообще говоря, буферизованный ввод-вывод небезопасен при использовании с общими файлами.

В AmigaOS [ править ]

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

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

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

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

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

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

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

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

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

Системы контроля версий [ править ]

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

См. также [ править ]

Ссылки [ править ]

  1. ^ Операционная система IBM System/360: Справочник по языку управления заданиями (PDF) . ИБМ . Июнь 1971. стр. 162–164. GC28-6704-1.
  2. Перейти обратно: Перейти обратно: а б " CreateFileW function» . Набор средств разработки программного обеспечения для Windows. Microsoft Docs . windows-sdk-content. Microsoft Corporation . Проверено 07.11.2018 .
  3. ^ " LockFileEx function» . Набор средств разработки программного обеспечения для Windows. Microsoft Docs . windows-sdk-content. Microsoft Corporation . Проверено 07.11.2018 .
  4. ^ " LockFileEx function» . Набор средств разработки программного обеспечения для Windows. Microsoft Docs . windows-sdk-content. Microsoft Corporation . Проверено 5 июля 2020 г.
  5. ^ " LockFile function» . Набор средств разработки программного обеспечения для Windows. Microsoft Docs . windows-sdk-content. Microsoft Corporation . Проверено 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. ^ «Заблокируйте свой скрипт (от параллельного запуска)» .

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 3b9d3b6bd368ee82c8b7206481a48bc7__1712354220
URL1:https://arc.ask3.ru/arc/aa/3b/c7/3b9d3b6bd368ee82c8b7206481a48bc7.html
Заголовок, (Title) документа по адресу, URL1:
File locking - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)