Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Фреймы страниц Фреймы страниц



Рис. 4.6. Анатомия выделителя секций


4.4 Выделение секций



 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  cache_sizes                              
  cs_size      
cs.cachep       wСекция   Секция   Секция    
          U—   < ■ •••      
cs.dmacachep  
I color_off color_off color.off  
      kmem_cache_s list list list  
      I lists | s_mem s_mem s_mem  
       
  I slabs_partial p E^   free free free  
kmeme_cache_s   slabsjull Ь          
  H , DMA_ZONE эквивалент; csjanep   I slabsjree U    
                   
     
objsize  
flags  
num  
gfporder  
       
  gfpflags  
slabp.cache      
  описатель кеша для кеша, содержащего описатель секции    
ctor  
dtor  
name  
next      
  следующий описатель кеша    
   
     
         
                                 

Рис. 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;
264

265 /* принудительные GFP-флаги, т. е. GFP_DMA */

266 unsigned int gfpflags;
267

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);
275

276 /* функция-деструктор */

277 void (*dtor)(void *, kmem_cache_t *, unsigned long);
278

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; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.027 с.)
Главная | Случайная страница | Обратная связь