Как файловые системы обрабатывают одновременное чтение / запись? - PullRequest
58 голосов
/ 02 мая 2010

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

Ответы [ 2 ]

46 голосов
/ 02 мая 2010

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

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

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

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

34 голосов
/ 02 мая 2010

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

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

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

...