Шрифт:
Состояние элементов каталога
Действительный объект элемента каталога, может быть в одном из трех состояний: используемый (used), неиспользуемый (unused) и негативный (negative).
Используемый объект соответствует существующему файловому индексу (т.е. поле
Неиспользуемый объект типа dentry соответствует существующему объекту inode (поле
Негативный объект dentry [72] не связан с существующим файловым индексом (поле
72
Это название несколько сбивает с толку. В таких объектах нет ничего негативного или отрицательного. Более удачным было бы, наверное, название invalid dentry или несуществующий элемент каталога.
Объект dentry может быть освобожден, оставаясь в слябовом кэше объектов, как обсуждалось в предыдущей главе. В таком случае на этот объект нет ссылок ни в коде VFS, ни в коде файловых систем.
Кэш объектов dentry
После того как подсистема VFS преодолела все трудности, связанные с переводом всех элементов пути в объекты элементов каталогов, и был достигнут конец пути, то было бы достаточно расточительным выбрасывать на ветер всю проделанную работу. Ядро кэширует объекты в кэше элементов каталога, который называют dcache.
Кэш объектов dentry состоит из трех частей.
• Список "используемых" объектов dentry, которые связаны с определенным файловым индексом (поле
• Двухсвязный список неиспользуемых и негативных объектов dentry "с наиболее поздним использованием" (last recently used, LRU). Вставки элементов в этот список отсортированы по времени, поэтому элементы, которые находятся в начале списка, — самые новые. Когда ядро должно удалить элементы каталогов для освобождения памяти, то эти элементы берутся из конца списка, потому что там находятся элементы, которые использовались наиболее давно и для которых меньше шансов, что они понадобятся в ближайшем будущем.
• Хеш-таблица и хеш-функция, которые позволяют быстро преобразовать заданный путь в объект dentry.
Указанная хеш-таблица представлена с помощью массива
Значение ключа определяется функцией
Поиск в хеш-таблице выполняется с помощью функции
В качестве примера рассмотрим редактирование файла исходного кода в вашем домашнем каталоге,
Кэш dcache также является интерфейсом к кэшу файловых индексов icache. Объекты inode связаны с объектами dentry, поскольку объект dentry поддерживает положительное значение счетчика использования для связанного с ним индекса. Это в свою очередь позволяет объектам dentry удерживать связанные с ними объекты mode в памяти. Иными словами, если закэширован элемент каталога, то соответственно оказывается закэшированным и соответствующий ему файловый индекс. Следовательно, если поиск в кэше для некоторого имени пути прошел успешно, то соответствующие файловые индексы уже закэшированы в памяти.