Дескриптор кэша
Каждый КЭШ описывается структурой kmem_cache_t (что эквивалентно struct kmem cache s), поля которой перечислены в Мы опустили несколько полей, используемых для сбора статистической информации и для отладки.
Дескрипторы участков памяти могут храниться в двух местах:
- внешний дескриптор участка памяти— хранится вне участка памяти, в одном из кэшей общего назначения, не подходящем для операций ISA DMA; на кэш указывает элемент cache sizes;
- внутренний дескриптор участка памяти — хранится внутри участка памяти, в начале первого страничного кадра, присвоенного участку.
Slab-аллокатор выбирает второй вариант, когда размер объектов меньше 512 Мбайт, или когда внутренняя фрагментация оставляет в участке памяти достаточно места для дескриптора участка и для дескрипторов объектов (что обсуждается далее). Флаг cflgs off slab в поле flags дескриптора кэша установлен, если дескриптор участка памяти хранится внутри участка, и сброшен в противном случае.
основные взаимосвязи между дескрипторами кэшей и дескрипторами участков памяти. Заполненные, частично заполненные и свободные участки памяти образуют разные списки
Общие и специальные КЭШи
Кэши бывают двух типов — общие и специальные. Общие кэши используются только slab-аллокатором для его собственных целей, в то время как специальные кэши используются остальными компонентами ядра.
Общими кэшами являются следующие:
- первый КЭШ, называемый kmem_cache, объектами которого являются дескрипторы остальных кэшей, используемых ядром. Переменная cache cache содержит дескриптор этого кэша;
- несколько дополнительных кэшей, содержащих области памяти общего назначения. Диапазон размеров этих областей, как правило, заключает в себе 13 геометрически распределенных величин. Таблица, называемая maiioc sizes (элементы которой имеют тип cache sizes), указывает на 26 дескрипторов кэшей, ассоциированных с областями памяти размером 32, 64, 128, 256, 512, 1024, 2 048, 4 096, 8 192, 16 384, 32 768, 65 536 и 131 072 байтов. Для каждого размера имеется два кэша; один подходит для целей ISA DMA, а другой — для обычного выделения памяти.
Функция kmem cache init вызывается на этапе инициализации системы для установки общих кэшей.
Специальные кэши создаются функцией kmem_cache_create . В зависимости от параметров, она вначале определяет оптимальный способ управления новым кэшем (например, следует ли хранить дескриптор участка памяти внутри или вне участка). Затем функция выделяет дескриптор для нового кэша из общего кэша cache_cache И заносит этот дескриптор В список cache chain, являющийся списком дескрипторов кэшей (занесение выполняется после получения семафора cache chain sem, защищающего список от попыток одновременного обращения).
Существует возможность уничтожить кэш и удалить его из списка cache chain, ДЛЯ чего вызывается функция kmem cache destroy о . Эта функция в основном полезна модулям, создающим собственные кэши при загрузке и уничтожающим их при выгрузке. Во избежание непроизводительных расходов памяти, ядро должно уничтожить все объекты-участки памяти до уничтожения самого кэша. Функция kmem cache shrink уничтожает все участки в кэше, итеративно вызывая функцию slab destroy.
Имена всех общих и специальных кэшей могут быть прочитаны на этапе выполнения из файла /proc/slabinfo. Помимо прочего, в этом файле хранится количество свободных и количество выделенных объектов в каждом кэше.
Предыдущая страница | 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 | Следующая страница