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