
10.1.
Сетевая файловая система компании Sun 641
файловые системы, NFS реализует семантику сеансов. Это означает, что хотя сис-
тема NFS теоретически следует модели удаленного доступа, представленной на
рис.
10.1,
(2,
большинство ее реализаций использует локальное кэширование, под-
держивая тем самым модель загрузки-выгрузки, представленную на рис.
10.1,
б.
В случае семантики сеансов встает вопрос о том, что произойдет, если два
или более клиентов станут одновременно кэшировать и изменять один и тот же
файл. Одно из решений состоит в том, чтобы содержимое файла передавалось
обратно на сервер после закрытия файла. Итоговый результат будет зависеть от
того,
какой запрос на закрытие файла будет обработан сервером последним. Ме-
нее приятной, но более простой в осуществлении альтернативой является выбор
финального результата из нескольких кандидатов с отбрасыванием всех измене-
ний, внесенных в файл другими процессами.
Абсолютно другой подход к семантике совместного использования файлов
в
распределенных системах состоит в том, чтобы сделать все файлы неизменяе-
мыми. Это означает, что способа открыть файл на запись не существует. В ре-
зультате единственными файловыми операциями остаются создание и чтение.
Все,
что мы можем сделать в этом случае,
—
открыть абсолютно новый файл
и поместить его в систему каталогов под именем ранее существовавшего, кото-
рый с этого момента становится недоступным (по крайней мере, под прежним
именем). Таким образом, хотя изменить файл х нельзя, остается возможность ав-
томатически заменить х новым файлом. Другими словами, файлы изменять нельзя,
но каталоги изменять можно! Как только мы приходим к решению запретить из-
менять файлы вообще, проблема двух процессов, один из которых записывает
в файл, а другой читает из него, просто исчезает.
Остается проблема двух процессов, пытающихся одновременно заменить один
и тот же файл. Как и в семантике сеансов, наилучшим решением здесь кажется
выбор одного из этих новых файлов для замены старого
—
либо последнего из
пришедших, либо по какому-либо другому критерию.
Довольно типичная проблема
—
что делать, если файл заменяется в тот мо-
мент, когда другой процесс занимается его чтением. Одно из решений состоит
в том, чтобы как-нибудь обеспечить использование читающим процессом старо-
го файла, даже если его больше нет в каталогах, аналогично тому, как UNIX по-
зволяет процессам, открывшим файл, продолжать использовать файл даже после
того,
как он удален из всех каталогов. Другое решение состоит в том, чтобы об-
наруживать факт изменения файла и делать все последующие попытки чтения
из него невозможными.
Четвертый способ работы с разделяемыми файлами в распределенных систе-
мах
—
использование транзакций, о которых мы подробно говорили в главе 5.
Обобщим эту информацию. Для доступа к файлу или группе файлов процесс
должен сначала выполнить один из вариантов примитива BEGIN^TRANSACTION, ука-
зывая, что дальнейшие действия выполняются единым блоком. После этого сле-
дует несколько системных вызовов чтения и записи в один или несколько файлов.
Когда работа заканчивается, выполняется примитив
END_TRANSACTION.
Система га-
рантирует, что все вызовы в рамках транзакции будут выполнены в указанном
порядке без каких-либо пересечений с другими параллельными транзакциями.