Пользователь A просит, чтобы система считала файл foo
и в то же время пользователь B хочет сохранить его данные на тот же файл. Как эта ситуация обрабатывается на уровне файловой системы?
Большинство файловых систем (но не все) используют блокировку для защиты одновременного доступа к одному и тому же файлу. Блокировка может быть эксклюзивной, поэтому первый пользователь, получивший блокировку, получает доступ - последующие пользователи получают ошибку "доступ запрещен". В вашем примере пользователь A сможет читать файл и получит блокировку файла, но пользователь B не сможет писать, пока пользователь A читает.
Некоторые файловые системы (например, NTFS) позволяют задавать уровень блокировки, чтобы, например, разрешить одновременное чтение, но без записи. Также возможны блокировки по диапазону байтов.
В отличие от баз данных, файловые системы обычно не транзакционные, не атомарные, и изменения от разных пользователей не изолированы (если изменения вообще можно увидеть - блокировка может это запретить)
Использование блокировок всего файла - это грубый подход, но он защищает от непоследовательных обновлений. Не все файловые системы поддерживают блокировки всего файла, поэтому в обычной практике используется файл блокировки - обычно пустой файл, наличие которого указывает на то, что связанный с ним файл используется. (Создание файла является атомарной операцией в большинстве файловых систем.)
Короткий ответ для Linux таков: вы можете получить некоторую странную информацию из файла, если существует одновременная запись.Ядро использует внутреннюю блокировку для последовательного выполнения каждой операции read () и write () . (Хотя я забываю, заблокирован ли файл целиком или он находится на уровне детализации по страницам.) Но если приложение использует несколько вызовов write () для записи информации в файл, выполняется чтение () мог произойти между любыми из этих вызовов, поэтому он мог видеть несогласованные данные. Это нарушение атомарности в операционной системе.
Как упоминалось в mdma, вы можете использовать блокировку файлов , чтобы убедиться, что одновременно есть только один читатель и один писатель. Похоже, NTFS использует обязательную блокировку , при которой, если одна программа блокирует файл, все другие программы получают сообщения об ошибках при попытке доступа к нему.
Программы Unix обычно вообще не используют блокировку, и когда они это делают, блокировка обычно рекомендательная . Консультативная блокировка не позволяет другим процессам получить консультативную блокировку того же файла; это не на самом деле предотвращает чтение или запись. (То есть он блокирует файл только для тех, кто проверяет блокировку.)