Когда два или более пользователи разделяют один файл, необходимо точно определить семантику чтения и записи, во избежание проблем. В централизованных системах, которые позволяют низменность файлов, таких как UNIX, обычно определяется, что, когда операция ЧТЕНИЯ вытекает за операцией ЗАПИСЬ, то читается только что обновленный файл. Аналогично, когда операция чтения вытекает за двумя операциями записи, то читается файл, измененный последней операцией записи. Тем самым система придерживается абсолютного временного упорядочивания всех операций, и всегда возвращает самое последнее значение. Будем называть эту модель семантикой Unix'а. В централизованной системе (и даже на мультипроцессоре с что разделяется памятью) ее легко и понять, и реализовать.

Семантика UNIX может быть обеспечена и в распределенных системах, но только, если в ней есть лишь один файловый сервер, и клиенты не кэшируют файлы. Для этого все операции чтения и записи направляются на файловый сервер, который обрабатывает их строго последовательно. На практике, однако, производительность распределенной системы, в которой все запросы к файлам идут на один сервер, часто становится неудовлетворительной. Эта проблема иногда решается путем разрешения клиентам обрабатывать локальные копии часто используемых файлов в своих личных кэшах. Если клиент сделает локальную копию файла в своему локальному кэше и начнет ее модифицировать, а в скором времени после этого другой клиент прочитает этот файл из серверу, то он получит неверную копию файла. Одним из средств устранения этого недостатка есть немедленное возвращение всех изменений в кэшированном файле на сервер. Такой подход хотя и концептуально простой, но не эффективный.

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

Такой подход к делению файлов заключается в том, чтобы сделать все файлы неизменными. Тогда файл нельзя отворить для записи, а можно выполнять только операции СОЗДАТЬ и ЧИТАТЬ. Тогда для изменения файла остается только возможность создать целиком новый файл и поместить его в каталог под именем старика файла. Итак, хотя файл и нельзя модифицировать, его можно заменить (автоматически) новым файлом. Другими словами, хотя файлы и нельзя обновлять, но каталоги обновлять можно. Таким образом, проблема, связанная с одновременным использованием файла, просто исчезнет.

Четвертый средство работы по что разделяются файлами в распределенных системах - это использования механизма неделимых транзакций, достаточно подробно описанного в делении 3.3.3.

Итак, было рассмотрено четыре разных подхода к работе по что разделяются файлами в распределенных системах.

Семантика UNIX. Каждая операция над файлом немедленно становится видимой для всех процессов.

Сессионная семантика. Изменения не значительные до тех пор, пока файл не закрывается.

Неизменные файлы. Модификации невозможные, низменность файлов и репликация упрощаются.

Транзакции. Все изменения делаются по принципу "все или ничего".

 

Возможно стоит прочитать: