Структури даних файлової системи UNIX

Дисковий тім UNIX складається з наступних основних областей, показаних (не в масштабі) на рис. 3-5:

 

Рис. 1‑14

 

· Блок початкового завантаження (BOOT-сектор); його структура визначається не UNIX, а архітектурою використовуваного комп'ютера;

· Суперблок - містить основні відомості про дисковий томі в цілому (розмір логічного блоку і кількість блоків, розміри основних областей, тип файлової системи, можливі режими доступу), а також дані про вільне місце на диску;

· Масив індексних дескрипторів, кожен з яких містить повні відомості про один з файлів, що зберігаються на диску (окрім імені цього файлу);

· Область даних, яка складається з логічних блоків (кластерів), які використовуються для зберігання файлів і каталогів (в UNIX використовується сегментоване розміщення файлів).

На відміну від системи FAT, де основні відомості про файл містилися в каталожної записи, UNIX використовує більш витончену схему.

Запис каталогу не містить ніяких даних про файл, окрім тільки імені файлу і номери індексного дескриптора цього файлу.

У ранніх версіях UNIX кожен запис мала фіксовану довжину 16 байт, з яких 14 використовувалися для імені і 2 для номера. У більш сучасних версіях запис має змінний розмір, що дозволяє використовувати довгі імена файлів.

Як і в системі FAT, в кожному каталозі перші дві записи містять спеціальні імена «..» (посилання на батьківський каталог) і «.» (Посилання на даний каталог).

Точніше, це в FAT зроблено за прикладом UNIX.

Нульове значення номера відповідає віддаленої запису каталогу.

Всі відомості про файл, крім імені, містяться в його індексному дескрипторі (inode). Така схема робить можливими жорсткі зв'язки, описані вище: будь-яку кількість записів з одного каталогу або з різних каталогів може відноситися до одного і того ж файлу. Для цього треба тільки, щоб ці записи містили один і той же номер inode.

Індексні дескриптори зберігаються в масиві, який займає окрему область диска. Розмір цього масиву задається при форматуванні, цей розмір визначає максимальну кількість файлів, які можна розмістити на даному томі.

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

У дескрипторі містяться тип і атрибути файлу, описані вище. Нарешті, тут же містяться дані про розміщення файлу, що мають досить оригінальну структуру (див. рис. 3-6).

Розміщення блоків файлу задається масивом з 13 (в деяких версіях 14) елементів, кожен з яких може містити номер блоку в області даних. Нехай, для визначеності, блок дорівнює 1 Кб, а його номер займає 4 байти (обидві ці величини залежать від версії файлової системи). Перші 10 елементів масиву містять номери перших 10 блоків від початку файлу. Якщо розмір файлу перевищує 10 Кб, то в хід йде 11-й елемент масиву. Він містить номер непрямого блоку - такого блоку в області даних, який містить номери наступних 256 блоків файлу. Таким чином, використання непрямого блоку дозволяє працювати з файлами розміром до 266 Кб, використовуючи для цього один додатковий блок. Якщо файл перевищує 266 Кб, то в 12-му елементі масиву міститься номер вторинного непрямого блоку, який містить до 256 номерів непрямих блоків, кожен з яких ... Ну, ви зрозуміли. Нарешті, для дуже великих файлів буде задіяно 13-й елемент масиву, що містить номер третинного непрямого блоку, що вказує на 256 вторинних непрямих.

Підрахуйте, який максимальний розмір файлу може бути досягнутий при такій схемі адресації блоків.

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

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

Складніше йде справа з вільними блоками даних. Перший елемент розміщеного в суперблоці масиву номерів вільних блоків вказує на блок в області даних, який містить продовження цього масиву і, в першому елементі, покажчик на наступний блок продовження. Коли системі потрібні блоки дискової пам'яті, вона бере їх з основного масиву в суперблоці, а при вичерпанні масиву читає його продовження в суперблок. При звільненні блоків відбувається зворотний процес: їх номери записуються в масив, а при переповненні масиву весь його вміст переписується в один з вільних блоків, номер якого заноситься в перший елемент масиву як адреса продовження списку. 3-7 показана структура списку вільних блоків.

 

Рис. 1‑15

 

Як неважко зрозуміти, зі сказаного випливає, що блоки диска розподіляються «по стекового принципом»: блок, звільнений останнім, буде першим знову задіяний.