Как файловые системы обрабатывают параллельное чтение-запись?

Пользователь A просит, чтобы система считала файл foo и в то же время пользователь B хочет сохранить его данные на тот же файл. Как эта ситуация обрабатывается на уровне файловой системы?

60
задан Matteo Riva 1 May 2010 в 22:15
поделиться

2 ответа

Большинство файловых систем (но не все) используют блокировку для защиты одновременного доступа к одному и тому же файлу. Блокировка может быть эксклюзивной, поэтому первый пользователь, получивший блокировку, получает доступ - последующие пользователи получают ошибку "доступ запрещен". В вашем примере пользователь A сможет читать файл и получит блокировку файла, но пользователь B не сможет писать, пока пользователь A читает.

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

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

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

46
ответ дан 24 November 2019 в 17:52
поделиться

Короткий ответ для Linux таков: вы можете получить некоторую странную информацию из файла, если существует одновременная запись.Ядро использует внутреннюю блокировку для последовательного выполнения каждой операции read () и write () . (Хотя я забываю, заблокирован ли файл целиком или он находится на уровне детализации по страницам.) Но если приложение использует несколько вызовов write () для записи информации в файл, выполняется чтение () мог произойти между любыми из этих вызовов, поэтому он мог видеть несогласованные данные. Это нарушение атомарности в операционной системе.

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

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

36
ответ дан 24 November 2019 в 17:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: