Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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