Навіщо зберігати посилання "власне та батьківське" (. І ..) у записі каталогу?


11

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

Чи є якась користь для зберігання посилання на саму директорію та на її батьківську в структурі даних на диску, що представляє каталог?

Більшість файлових систем Unix мають .і ..записи на диску. Цікаво, чому вони не обробляють ті, на рівні VFS (загальний драйвер файлової системи). Це історичний артефакт? Чи є вагомі причини, і якщо так, то саме, щоб я міг визначити, чи відповідає вона моїй вбудованій системі?


Я завжди вважав, що вони існують лише практично, щоб програми могли легко отримати доступ до поточного та батьківського каталогу. Цікаве запитання, але чи воно тут належить?
Рафаель

@Raphael Я можу зрозуміти, чи вважаєте ви моє питання занадто широким (→ "не справжнє запитання"), чи, можливо, "не конструктивним", оскільки воно дещо відкрите. Але я не погоджуюся, що це поза темою: мова йде про дизайн файлової системи, як це не застосовується інформатика? Якщо ви думаєте, що це поза темою, поясніть свої міркування щодо мета.
Жил "ТАК - перестань бути злим"

@Raphael Я відредагував своє запитання, сподіваюся, повинно бути зрозуміло, що моя точка зору - це вбудований дизайнер ОС. Дякуємо за ваші коментарі.
Жил "ТАК - перестань бути злим"

Відповіді:


2

Мати посилання на батьківський каталог має для мене сенс. Якби у вас їх не було, вам завжди потрібно було б працювати з цілим списком каталогів. Так, наприклад, /home/svick/Documents/треба було б представити як { /, /home/, /home/svick/, /home/svick/Documents }. Якщо ви цього не зробили, ви б взагалі не змогли знайти батьківський каталог (або це було б дуже дорого). Це не тільки неефективно, але й небезпечно. Якщо у вас є два таких списки, які перекриваються, вони можуть легко десинхронізуватися, якщо ви перемістите деякий каталог.

З іншого боку, якщо у вас є посилання на батьківський каталог, це більш ефективно та безпечніше.

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


2
Це ж зауваження: чому це потрібно робити у кожній файловій системі, а не на рівні VFS? У більшості файлових систем Linux є .і ..записи.
Жил "ТАК - перестань бути злим"

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

1
@svick: Жил не порівнює наявність батьківських посилань із відсутністю батьківських посилань. Він порівнює наявність їх у фактичній файловій системі з тим, що вони імітуються проміжним шаром коду (vfs) між фактичною файловою системою та користувальницьким простором.
rgrig

2

У вас виходить менше спеціальних випадків. У багатьох ситуаціях VFS може обробляти ".." так, як він обробляє будь-яке інше ім'я каталогу.


3
Якщо каталоги віртуальні, програма (usermode я припускаю) все ще може обробляти її, як і будь-який інший каталог. Вам не потрібні посилання для представлення на рівні пам’яті.
Ар'ябхата

1
Так, але чому б не впоратися з цим на рівні VFS? Навіщо існувати пов’язане сховище?
Жил "ТАК - перестань бути злим"

Чому люди реалізують пов'язані списки зі сторожовим, а не піклуються про порожній випадок списку у функціях додавання / видалення?
rgrig

@rgrig: Це трапляється лише тоді, коли інтерфейс до розглянутої реалізації пов'язаного списку написаний мовою, яка вкрай погана в обробці індуктивних структур даних (C, Java тощо). Тут ця проблема не є актуальною, оскільки рівень VFS не доступний безпосередньо з точки зору користувача.
Стефан Гіменез

@ StéphaneGimenez: Ця проблема є актуальною, так як VFS буде написаний на C.
rgrig

2

Єдиною причиною, яку я можу уявити, є такий сценарій:

  1. Оригінальна реалізація файлової системи існувала з тим самим форматом каталогів, але поняття файлових шляхів та підкаталогів тоді не розглядалися (див . Файлову систему PDP-7 Unix ).

  2. Тоді люди думали, що розв’язання шляхів та підкаталоги будуть корисними!

  3. Щоб зберегти деяку кількість зворотної сумісності зі старими реалізаціями, було вирішено, що .і ..зберігатиметься на диску, як і будь-який інший каталог.

То, може, ми залишилися з цими марними артефактами, просто задля відсталої сумісності з 40-річним програмним забезпеченням? Надійний сценарій?


Примітка. Крім того, не зовсім глупо було додавати ці записи до списку каталогів, оскільки потрібно зберігати номер inode вашого справжнього батьківського каталогу десь у будь-якому місці (пам’ятайте, що жорсткі посилання на каталоги були дозволені в цей час) та посилання на ваш власний номер inode може бути хорошою перевірною обставиною.


1

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.