Системы файлов
Логическая организация директорий
Структуру директорий рекомендуется организовывать логически, т .е. в соответствии с логикой программы, хранения и использования данных. У такой организации директорий – две основные цели: эффективность (обеспечить быстрый поиск файла) и именование (обеспечить удобство для пользователей, например, в случае, если несколько пользователей называют два разных файла в своих директориях одним и тем же именем, в соответствии с его назначением). Директории позволяют осуществить логическую группировку файлов по их назначению, свойствам и т.д. (например, почта, документы, Java-код, игры).
В связи с этим, одноуровневая организация директорий для всех пользователей не рекомендуется, так как могут возникнуть проблемы с удобной группировкой файлов и с совпадением имен. Одноуровневая структура директорий изображена на рис. 19.4.
При двухуровневой организации директорий в многопользовательской системе появляется возможность иметь одинаковые имена файлов сходного назначения для различных пользователей. При такой организации создается главная директория, в которой хранятся персональные поддиректории пользователей. В каждой из них, в свою очередь, хранятся файлы конкретного пользователя. Двухуровневая схема изображена на рис. 19.5.
Однако данная организация не поддерживает возможность дальнейшей группировки файлов.
Наиболее общей и удобной, рекомендуемой читателям, является древовидная структура директорий ( рис. 19.6).
Именно древовидная структура директорий обеспечивает эффективный поиск, возможность группировки и поддержку уже рассмотренных понятий текущей (рабочей) директории и пути доступа к файлу.
Различаются абсолютный и относительный путь. Абсолютный путь указывает полный путь доступа к файлу, начиная от логического имени раздела, либо от корневой системной директории, например (в системе UNIX): /usr/bin/sh – путь доступа к файлу командного процессора Bourne Shell.Относительный путь указывает путь доступа к файлу относительно некоторой текущей директории. В том же примере, если считать, что текущая директория - /usr, то относительный путь к тому же файлу имеет вид: bin/sh. Недостаток абсолютных путей в том, что на разных компьютерах (например, заказчика и исполнителя) абсолютные пути к одному и тому же файлу или к одной и той же директории могут оказаться различными. В результате возникают ошибки при сборке проекта, его архивировании, разархивировании и др. Поэтому рекомендуется в системных файлах, например, в make-файлах для сборки проектов, указывать, по возможности, относительные пути, либо обозначать рабочую директорию один раз с помощью некоторого макроса и использовать это обозначение в путях, например: ${SYSDIR}/sh, где макрос SYSDIR задает конкретный путь к системной директории на данном компьютере.
Пример древовидной структуры директорий приведен на рис. 19.6.
Примеры операций над директориями (в обозначениях рис. 19.6):
cd /spell/mail/prog – установка текущей директории.
type list – вывод на консоль содержимого одного из ее файлов.
Если текущая директория /mail, то поддиректория count создается командой:
mkdir count
Структура директорий в виде ациклического графа ( рис. 19.7) возникает вследствие использования различными пользователями одних и тех же файлов и директорий.
При этом может возникнуть ситуация, когда у одного и того же файла (директории) два различных имени ( aliasing ).
В рис. 19.7, если в директории dict удалить ссылку list, то образуется подвисшая ссылка (dangling pointer).Возможные решения данной проблемы:
- хранение обратных ссылок из файла на директорию (с целью своевременного удаления всех ссылок);
- хранение cчетчиков ссылок на файл; при обнулении счетчика ссылок на файл последний считается не используемым, и его память перераспределяется.
Структура директорий в виде произвольного графа создает еще более серьезные проблемы, например, как гарантировать отсутствие циклов в графе директорий. Пример структуры директорий в виде произвольного графа приведен на рис. 19.8.
Циклические ссылки на файлы могут возникнуть из-за ошибок в программе, связанной с обработкой файлов. Если при этом она тестируется и многократно запускается, то это может привести к переполнению внешней памяти на диске (или в разделе диска), что и произошло у автора при отладке компилятора с языка CLU на МВК "Эльбрус" в 1980-х гг. Возможные решения проблемы циклических ссылок:
- Допускать только ссылки на файлы, а не на поддиректории; данное решение слишком ограничительно.
- Выполнять сборку мусора во внешней памяти; однако традиционные алгоритмы сборки мусора не делают проверок на наличие циклов, поэтому в цепочке циклически ссылающихся друг на друга файлов все они будут считаться используемыми.
- Каждый раз при создании новой ссылки запускать алгоритм проверки отсутствия циклов – по-видимому, слишком "дорогое" решение.