[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Что такое захват записи и файла?

Захват записей в ОС UNIX - это в основном средство синхронизации
процессов, осуществляющих доступ к одной и той же записи в файле, а не
средство защиты. Это средство обеспечивает последовательный доступ к
записи в файле. Процессы, обращающиеся к записи, выстраиваются ядром в
очередь.
Захват записи обеспечивается системным вызовом fcntl(2). Кроме того,
функция стандартной библиотеки lockf(3C) обеспечивает совместимость
захвата файла и записи с /usr/group, организацией пользователей ОС
UNIX.
При захвате записи используется следующая терминология:
.  Совместные  (cooperating)   процессы  работают   вместе,   выполняя
   определенным образом  одну задачу. Система управления продажи акций
   является  примером   этого.  Терминал  каждого  продавца  связан  с
   процессом, который  осуществляет доступ  к файлу  данных об акциях.
   Все программы,  которые осуществляют  доступ к  этому файлу, должны
   выполнять  определенные   правила  захвата  записи,  чтобы  система
   управления данными работала правильно.
.  Запись (record)  - это последовательный набор байтов в файле. Более
   точно запись  определяется в  контексте программы.  У  записи  есть
   начальная позиция  в файле и длина от этой позиции. Адрес структуры
   flock передается  как аргумент  системному вызову  fcntl(2),  чтобы
   определить эту информацию.
.  Захват  записи  по  чтению  (разделяемый  доступ)  не  дает  другим
   процессам установить захват записи по изменению.
.  Захват записи  по изменению  (эксклюзивный доступ)  не дает  другим
   процессам установить  захват записи  по чтению/изменению, пока этот
   захват по изменению не будет снят.
.  Допустимое (advisory) захватывание не взаимодействует с подсистемой
   ввода/вывода.  Это  означает,  что  программы,  выполняющие  захват
   записи, должны  явно вызывать  fcntl(2), чтобы установить захват по
   чтению/изменению, а затем снять его (явный захват).
.    Обязательное захватывание взаимодействует с подсистемой
ввода/вывода. Это означает, что системные вызовы read(2) или write(2)
будут приостанавливаться (неявный захват), пока не будет снят захват
соответствующей записи. Обязательное захватывание осуществляется на
файловом уровне.
Ядро обеспечивает  определенную степень  обнаружения и  предотвращения
взаимных блокировок  (deadlock). Взаимные  блокировки возникают только
тогда, когда  ядро собирается  усыпить процесс,  выполняющий системный
вызов захвата  записи. При  установке захвата осуществляется проверка,
что не  создается цикл  процессов, каждый  из которых  ждет от  других
снятия захвата  записи/файла. Если такая ситуация обнаружена, fcntl(2)
немедленно возвращает  неуспех и  устанавливает errno.  Процесс  может
захватить  удаленный  файл  (RFS).  Однако  для  эффективности  работы
механизма   предотвращения   взаимных   блокировок,   процесс   должен
захватывать файлы  только в одной системе в каждый момент времен. Если
же процесс  собирается захватывать  файлы в нескольких системах, то он
должен избегать  использования fcntl(2)  или  lockf(3C)  с  параметром
F_SETLKW    (блокировка-когда-захват)     и    сделать     собственное
предотвращение взаимных  блокировок. Если  все-таки процесс использует
вызов  fcntl(2)   c  блокировкой-когда-захват,  тогда  процесс  должен
обеспечить механизм  тайм-аута так,  чтобы процесс  не подвешивался  в
ожидании, когда  будет снят  захват.  Смотри  Руководство  прикладного
программиста для  более детального объяснения механизмов обнаружения и
предотвращения взаимных блокировок.