Linux Kernel (Ядро линукса) (часть 2)


Кэш элементов каталога

Поскольку чтение элемента каталога с диска и создание соответствующего объекта элемент каталога” требует значительного времени, имеет смысл хранить в памяти объекты элемент каталога”, с которыми вы уже не работаете, но которые могут понадобиться впоследствии. Например, пользователи часто редактируют файл, а потом компилируют его, либо редактируют и печатают файл, либо создают копию файла и редактируют ее. В таких случаях приходится неоднократно обращаться к одному и тому же файлу.

Чтобы обрабатывать элементы каталога максимально эффективно, в Linux используется кэш элементов каталога, в котором хранятся структуры двух типов:
- набор объектов элемент каталога”, используемых, неиспользуемых или отрицательных;
- хеш-таблица для быстрого нахождения объекта элемент каталога”, связанного с данным именем файла и данным каталогом. Как всегда, если требуемый объект не находится в кэше элементов каталога, функция поиска возвращает null.

Кэш элементов каталога также служит в качестве управляющего механизма для кэша индексных дескрипторов. Индексные дескрипторы в памяти ядра, связанные с неиспользуемыми элементами каталога, не уничтожаются, поскольку кэш элемента каталога помнит” о них. Таким образом, объекты индексный дескриптор” хранятся в оперативной памяти и могут быть быстро получены посредством соответствующих объектов элемент каталога”.
Все неиспользуемые” объекты элемент каталога” включены в двунаправленный список давно не используемых” объектов (список Least Recently Used, LRU), отсортированный по времени занесения объекта в список. Иными словами, объект элемент каталога”, освобожденный последним, ставится в начало списка, так что объекты, не используемые уже давно, находятся в конце списка. Когда возникает необходимость уменьшить размер кэша элементов каталога, ядро удаляет элементы из конца списка, сохраняя объекты, использованные недавно. Адреса первого и последнего элементов списка LRU хранятся в полях next и prev переменной dentry unused, имеющей тип list head. Поле d_LRu объекта элемент каталога” содержит указатели на соседние объекты элемент каталога” в списке.

Каждый используемый” объект элемент каталога” заносится в двунаправленный список, на который указывает поле i dentry соответствующего объекта индексный дескриптор” (список необходим, поскольку каждый индексный дескриптор может быть связан с несколькими жесткими ссылками). Поле d aiias объекта элемент каталога” содержит адреса соседних элементов СПИСКа. Оба ПОЛЯ ИМеЮТ ТИП struct list head.

Используемый” объект элемент каталога” может стать отрицательным”, когда будет удалена последняя жесткая ссылка на соответствующий файл. В этом случае объект элемент каталога” переносится в список LRU. Каждый раз, когда ядро уменьшает размер кэша элементов каталога, отрицательные объекты элемент каталога” перемещаются ближе к концу списка LRU, так что они постепенно освобождаются.

Хеш-таблица реализована в виде массива dentry hashtabie. Каждый его элемент является указателем на список объектов элемент каталога”, у которых хеш-значения равны. Размер массива обычно зависит от объема доступной оперативной памяти. Значением по умолчанию являются 256 элементов на каждый мегабайт памяти. Поле d hash объекта элемент каталога” содержит указатели на соседние элементы списка, связанного с одним хеш-значением. Хеш-функция вычисляет возвращаемое значение на основании объекта "элемент каталога” в каталоге и имени файла.

Спин-блокировка dcache iock защищает структуры данных кэша элементов каталога от попыток одновременного обращения к ним в многопроцессорных
системах. Функция d iookupO ищет в хеш-таблице родительский объект элемент каталога” и имя файла. Во избежание конфликтов она использует
seqlock-блокировку Функция d iookupO работает аналогично,
но исходит из предположения, что конфликты невозможны, и не применяет seqlock-блокировку.

Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

Linux Kernel (Ядро линукса) (ч...

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть...

Linux Kernel (Ядро линукса) (ч...

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

Linux Kernel (Ядро линукса) (ч...

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...