Приклади вирішення колізій і тупикових ситуацій

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

Розглянемо як приклад утворення потенційної безвиході при створенні зв'язку (link), коли дозволений сумісний доступ до файлу [Bach, 1986].

Два процеси, наступні функції, що виконують одночасно:

процес A: link("a/b/c/d","e/f/g");

процес B: link("e/f","a/b/c/d/ee");

можуть зайти в безвихідь. Припустимо, що процес A виявив індекс файлу "a/b/c/d" в той самий момент, коли процес B виявив індекс файлу "e/f". Фраза "в той же самий момент" означає, що системою досягнутий стан, при якому кожен процес отримав шуканий індекс. Коли ж тепер процес A спробує отримати індекс файлу "e/f", він припинить своє виконання до тих пір, поки індекс файлу "f" не звільниться. В той же час процес B намагається отримати індекс каталога "a/b/c/d" і припиняється в очікуванні звільнення індексу файлу "d". Процес A утримуватиме заблокованим індекс, потрібний процесу B, а процес B, у свою чергу, утримуватиме заблокованим індекс, необхідний процесу A.

Для запобігання цьому класичному прикладу взаємного блокування у файловій системі прийнято, щоб ядро звільняло індекс початкового файлу після збільшення значення лічильника зв'язків. Тоді, оскільки перший з ресурсів (індекс) вільний при зверненні до наступного ресурсу, взаємного блокування не відбувається.

Приводів для небажаної конкуренції між процесами багато, особливо при видаленні імен каталогів. Припустимо, що один процес намагається знайти дані файлу по його повному символічному імені, послідовно проходячи компонент за компонентом, а інший процес видаляє каталог, ім'я якого входить в шлях пошуку. Допустимо, процес A робить розбір імені "a/b/c/d" і припиняється під час отримання індексного вузла для файлу "c". Він може припинитися при спробі заблокувати індексний вузол або при спробі звернутися до дискового блоку, де цей індексний вузол зберігається. Якщо процесу B потрібно видалити зв'язок для каталога з ім'ям "c", він може припинитися з тієї ж самої причини, що і процес A. Хай ядро згодом вирішить відновити процес B раніше процесу A. Перш ніж процес A продовжить своє виконання, процес B завершиться, видаливши зв'язок каталога "c" і його вміст по цьому зв'язку. Пізніше процес A спробує звернутися до неіснуючого індексного вузла, який вже був видалений. Алгоритм пошуку файлу, перевіряючий насамперед нерівність значення лічильника зв'язків> нулю, повинен повідомити про помилку.

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