Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Олифер. Сетевые операционные системы.docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
16.5 Mб
Скачать

Проверка достоверности кэша

Распространение модификаций решает только проблему согласования с клиентскими копиями главной копии файла, хранящейся на сервере. В то же время этот прием не дает никакой информации о том, когда должны обновляться данные, находящиеся в кэшах клиентов. Очевидно, что данные в кэше одного клиента становятся недостоверными, когда данные, модифицированные другим клиентом, переносятся в главную копию файла. Следовательно, необходимо ка­ким-то образом проверять, являются ли данные в кэше клиента достоверными. В противном случае данные кэша должны быть повторно считаны с сервера. Существует два подхода к рещению этой проблемы — инициирование проверки клиентом и инициирование проверки сервером.

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

  • Перед каждым доступом к файлу. Это способ дискредитирует саму идею кэширования, так как каждое обращение к файлу вызывает обмен по сети с сервером, зато он обеспечивает семантику разделения файлов Unix.

  • Периодические проверки повышают производительность, но делают семантику разделения неясной, зависящей от временных соотношений.

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

Совершенно другой подход к проблеме проверки достоверности кэша реализуется при инициировании проверки сервером, который также можно назвать методом централизованного управления. Когда файл открывается, то клиент, выполняющий это действие, посылает соответствующее сообщение файловому серверу, в котором указывает режим открытия файла — чтение или запись. Файловый сервер сохраняет информацию о том, кто и какой файл открыл, а также о том, открыт файл для чтения, для записи или для того и другого. Если файл открыт для чтения, то нет никаких препятствий для разрешения другим процессам открыть его для чтения, но открытие его для записи должно быть за­прещено. Аналогично, если некоторый процесс открыл файл для записи, то все другие виды доступа должны быть запрещены. При закрытии файла также необходимо оповестить файловый сервер для того, чтобы он обновил свои таблицы, содержащие данные об открытых файлах. Модифицированный файл также может быть выгружен на сервер в такой момент.

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

  • отвергнуть запрос;

  • поместить запрос в очередь;

  • запретить кэширование для данного конкретного файла, потребовав от всех клиентов, открывших этот файл, удалить его из кэша.

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

  • Он отклоняется от традиционной модели взаимодействия клиента и сервера, в которой сервер только отвечает на запросы, инициированные клиентами. Это делает код сервера нестандартным и достаточно сложным.

  • Сервер обязательно должен хранить информацию о состоянии сеансов клиентов, то есть работать по схеме stateful.

  • По-прежнему должен использоваться механизм инициирования проверки достоверности клиентами при открытии файлов.