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

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

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

Аргументом в пользу деления сервисов есть тот факт, что они на самом деле слабо связаны, поэтому их раздельная реализация более гибкая. Например, можно реализовать сервер каталогов MS-DOS и сервер каталогов UNIX, что будут использовать тот самый файловый сервер для физической сохранности файлов. Низменность этих функций также упрощает программное обеспечение. Недостатком является то, что использование двух серверов увеличивает интенсивность сетевого обмена.

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

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

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

Рассмотрим эту проблему на примере файлового серверу, который имеет команды ОТВОРИТЬ, ПРОЧИТАТЬ, ЗАПИСАТЬ и ЗАКРЫТЬ файл. Открывая файлы, statefull-сервер должен запоминать, какие файлы отворил каждый пользователь. Обычно при открытии файла пользователю дается дескриптор файла или другое число, которое используется при следующих вызовах для его идентификации. При поступлении вызова, сервер использует дескриптор файла для определения, который файл нужен. Таблица, которая отображает дескрипторы файлов на самые файлы, является информацией о состоянии клиентов.

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

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

Преимущества обеих подходов можно обобщить таким способом:

Stateless-Серверы:

отказоустойчивы;

не нужны вызовы OPEN/CLOSE;

меньше памяти серверу тратится на таблице;

нет ограничений на число открытых файлов;

отказ клиента не создает проблем для серверу.

Statefull-Серверы:

более короткие сообщения при запросах;

лучше производительность;

  чтения , которые возможно опережает;

легче достичь идемпотентности;

возможное блокирование файлов.

 

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