Каталоги. Логічна структура файлового архіву

Кількість файлів на комп'ютері може бути великою. Окремі системи зберігають тисячі файлів, що займають сотні гігабайтів дискового простору. Ефективне управління цими даними має на увазі наявність в них чіткої логічної структури. Всі сучасні файлові системи підтримують багаторівневе іменування файлів за рахунок наявності в зовнішній пам'яті додаткових файлів із спеціальною структурою - каталогів (або директорій).

Кожен каталог містить список каталогів і/або файлів, що містяться в даному каталозі. Каталоги мають один і той же внутрішній формат, де кожному файлу відповідає один запис у файлі директорії (див., наприклад, рис.11.3).

Число директорій залежить від системи. У ранніх ОС була тільки одна коренева директорія, потім з'явилися директорії для користувачів (по одній директорії на користувача). У сучасних ОС використовується довільна структура дерева директорій.

Рис. 13.3. Директорії

Таким чином, файли на диску утворюють ієрархічну деревовидну структуру (див. мал. 11.4).

Рис. 13.4. Деревовидна структура файлової системи

Існує декілька еквівалентних способів зображення дерева. Структура перевернутого дерева, приведеного на мал. 11.4, найбільш поширена. Верхню вершину називають коренем. Якщо елемент дерева не може мати нащадків, він називається термінальною вершиною або листом (в даному випадку є файлом). Нелистові вершини - довідники або каталоги містять списки листових і нелистових вершин. Шлях від кореня до файлу однозначно визначає файл.

Подібні деревовидні структури є графами, що не мають циклів. Можна вважати, що ребра графа направлені вниз, а корінь - вершина, що не має вхідних ребер. Як ми побачимо в наступній лекції, скріплення файлів, яке практикується у ряді операційних систем, приводить до утворення циклів в графі.

Усередині одного каталога імена листових файлів унікальні. Імена файлів, що знаходяться в різних каталогах, можуть збігатися. Для того, щоб однозначно визначити файл по його імені (уникнути колізії імен), прийнято іменувати файл так званим абсолютним або повним ім'ям (pathname), що складається із списку імен вкладених каталогів, по якому можна знайти шлях від кореня до файлу плюс ім'я файлу в каталозі, що безпосередньо містить даний файл. Тобто повне ім'я включає ланцюжок імен - шлях до файлу, наприклад /usr/games/doom. Такі імена унікальні. Компоненти шляху розділяють різними символами: "/" (слэш) в Unix або зворотними слэшем в MS-DOS (у Multics - ">"). Таким чином, використання деревовидних каталогів мінімізує складність призначення унікальних імен.

Указувати повне ім'я не завжди зручно, тому застосовують інший спосіб завдання імені - відносний шлях до файлу. Він використовує концепцію робочої або поточної директорії, яка зазвичай входить до складу атрибутів процесу, що працює з даним файлом. Тоді на файли в такій директорії можна посилатися тільки по імені, при цьому пошук файлу здійснюватиметься в робочому каталозі. Це зручніше, але по суті, те ж саме, що і абсолютна форма.

Для діставання доступу до файлу і локалізації його блоків система повинна виконати навігацію по каталогах. Розглянемо для прикладу шлях /usr/linux/progr.c. Алгоритм однаковий для всіх ієрархічних систем. Спочатку у фіксованому місці на диску знаходиться коренева директорія. Потім знаходиться компонент шляху usr, тобто в кореневій директорії шукається файл /usr. Досліджуючи цей файл, система розуміє, що даний файл є каталогом, і блоки його даних розглядає як список файлів і шукає наступний компонент linux в нім. З рядка для linux знаходиться файл, відповідний компоненту usr/linux/. Потім знаходиться компонент progr.c, який відкривається, заноситься в таблицю відкритих файлів і зберігається в ній до закриття файлу.

Відхилення від типової обробки компонентів pathname може виникнути у тому випадку, коли цей компонент є не звичайним каталогом з відповідним йому індексним вузлом і списком файлів, а служить точкою скріплення (прийнято говорити "точкою монтування") двох файлових архівів. Цей випадок розглянутий в наступній лекції.

Багато прикладних програм працюють з файлами, що знаходяться в поточній директорії, не указуючи явним чином її імені. Це дає користувачеві можливість довільним чином іменувати каталоги, що містять різні програмні пакети. Для реалізації цієї можливості в більшості ОС, що підтримують ієрархічну структуру директорій, використовується позначення "." - для поточної директорії і ".." - для батьківської.