Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Фреймы страниц Фреймы страниц
Рис. 4.6. Анатомия выделителя секций 4.4 Выделение секций
Рис. 4.7. Структура выделителя секций Описатель кеша Каждый кеш имеет собственный описатель кеша типа kmem_cache_s, хранящий о нем информацию. Большинство этих значений устанавливается или рассчитывается во время создания кеша в kmem_cache_create () (mm/slab. с). )Мы обсудим эту функцию в следующем разделе.) Для начала давайте посмотрим на поля описателя кеша и попытаемся понять, что он хранит. mm/slab.с 246 struct kmem_cache_s { 252 struct kmem_list3 lists; 2 54 unsigned int objsize; Глава 4 • Управление памятью 255 unsigned int flags; /* флаги констант */ 256 unsigned int num; /* количество объектов в секции */ 263 unsigned int gfporder; 265 /* принудительные GFP-флаги, т. е. GFP_DMA */ 266 unsigned int gfpflags; 268 size_t color; /* диапазон раскраски кеша */ 269 unsigned int color_off; /* цветовой отступ */ 270 unsigned int color_next; /* раскраска кеша */ 271 kmem_c ache_t * s1abp_cache; 272 unsigned int dflags; /* динамические флаги */ 273 /* функция-конструктор */ 274 void (*ctor)(void *, kmem_cache_t *, unsigned long); 276 /* функция-деструктор */ 277 void (*dtor)(void *, kmem_cache_t *, unsigned long); 279 /* 4) создание, уничтожение кеша */ 280 const char *name; 281 struct list_head next; 282 301 }; Lists Поле lists - это структура, хранящая головы трех списков, соответствующих трем состояниям, в которых может находиться секция: частично заполненному, полному или свободному. Кеш может иметь одну или несколько секций в любом из этих состояний. Именно таким образом эта структура данных связана с секциями. Сам список является двусвязным списком, поддерживаемым полем описателя секции list. Он описывается в подразделе «Описатель секции» далее в этой главе. mm/slab.с 217 struct kmeiti_list3 { 218 struct list_head slabs_partial; 219 struct list_head slabs_full; 220 struct list_head slabs_free;
223 unsigned long next_reap; 224 struct array__cache * shared; 225 }; Выделение секций lists.slabsjpartial lists. slabs_partial - это голова списка секций, с лишь частично выделенными объектами. Поэтому секция в частичном состоянии имеет несколько выделенных объектов и несколько свободных, готовых к использованию. lists, slabsJull lists. slabs_full -это голова списка секций, с полностью выделенными объектами. Эти секции не содержат доступных для выделения объектов. lists, slabsJree lists. slabs_f гее - это голова списка секций, с полностью свободными для выделения объектами. Ни один из объектов не выделен. Поддержание этих списков снижает время, требуемое для нахождения свободных объектов. Когда из кеша затребывается объект, ядро имеет частично заполненную секцию. Если список частично заполненных секций пуст, поиск производится в списке свободных секций. Если список свободных секций пуст, создается новая секция. lists.next_геар Секции имеют фреймы выделенных для них страниц. Если эти страницы не используются, лучше вернуть их в общий пул памяти. Пригодные для этого кеши уничтожаются. Это поле хранит время уничтожения следующего кеша. Оно устанавливается в kmem_cache_create () (mm/slab.с) в момент создания кеша и обновляется в cache_reap () (mm/slab. с) при каждом вызове. Objsize Поле obj size хранит размер (в байтах) объектов в кешах. Определяется во время создания кеша на основе требуемого размера и размещения кеша. Flags Поле flags хранит маску флагов, описывающую отдельные характеристики кеша. Возможные флаги определены в include/linux/slab. с и приведены в табл. 4.4. Таблица 4.4. Флаги секции Флаг Описание SLAB_POISON Запрос, тестирующий запись шаблона а5а5а5а5 в секцию во время создания. Может использоваться для проверки инициализированной памяти SLAB_NO_REAP Когда запрос памяти встречает недостаток памяти, менеджер памяти начинает уничтожать области памяти, которые больше не используются. Этот флаг устанавливается для того, чтобы быть уверенным, что этот кеш не будет автоматически уничтожен Глава 4 • Управление памятью Таблица 4.4. Флаги секции (Окончание) SLAB_HWCACHE_ALIGN Запрос на то, чтобы объект был выровнен в аппаратной линии кеша процессора для увеличения производительности с помощью сокращения циклов памяти SLAB_CACHE_DMA Означает, что следует использовать DMA-память. При запросе нового фрейма страницы флаг GFP_FLAG передается системе близнецов CLAB_PANIC Означает, что следует вызывать панику, если по какой-либо причине вызов kmem_cache_create () оказался неудачным Пит Поле пит хранит количество объектов в каждой секции кеша. Это поле определяется во время создания кеша [также в kmem_cache__create () ] на основе значения gf porder (см. следующее поле), размера создаваемых объектов и требуемого размещения. Gfporder gf porder - это порядок (на основе 2) количества последовательных фреймов страниц, находящихся в секторе кеша. По умолчанию имеет значение 0 и устанавливается при создании кеша с помощью вызова kinem_cache__create (). Gfpflags Флаги gfpflags определяют тип фреймов страниц, требуемых для секции данного кеша. Они определяются на основе требуемых флагов области памяти. Например, если область памяти предназначена для использования с DMA, поле gfpflags устанавливается в GFP_DMA и передается далее при запросе фрейма страницы. 4.4.1.7 slabs_cache Описатель секции хранится внутри самого кеша или снаружи его. Если описатель секции для секции в этом кеше хранится вовне по отношению к кешу, поле slabp_cache хранит указатель на описатель кеша, хранящего объект типа описателя секции. (См. более подробную информацию о хранении описателя секции в подразделе «Описатель секции».) Ctor Поле ctor хранит указатель на конструктор1, связанный с кешем, если он существует. Если вы знакомы с объектно-ориентированным программированием, для вас не будет новостью концепция конструкторов и деструкторов. Поле описателя кеша ctor позволяет запрограммировать функцию, которая будет вызываться каждый раз, когда создается новый описатель кеша. Аналогично поле dtor хранит указатель на функцию, которая будет вызываться каждый раз, когда описатель кеша уничтожается. Выделение секций Dtor Практически так же, как и поле с tor, поле dtor хранит указатель на деструктор, связанный с кешем, если такой существует. Конструктор и деструктор определяются во время создания кеша и передаются в качестве параметров kmem_cache_create (). Name Поле name хранит читабельную для человека строку с именем, отображаемым при открытии /proc/slabinf о. Например, для кеша, хранящего файловый указатель, значением этого поля будет f ilp. Проще всего это понять, если выполнить cat /proc/ slabinf о. Поле секции name должно хранить уникальные значения. Во время создания имя требуемой секции сравнивается с именами всех остальных секций в списке. Повторения не допускаются. Если существует еще одна секция с тем же именем, создание секции завершается ошибкой. Next next - это указатель на следующий описатель кеша в односвязном списке описателей кешей. Популярное:
|
Последнее изменение этой страницы: 2016-03-25; Просмотров: 677; Нарушение авторского права страницы