Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Блокировка касается только описателя, а не самого диапазона памяти, с которым он ассоциирован.
Глава 4 • Управление памятью 4.2.1.2 free_pages Поле f ree_pages хранит количество оставшихся в зоне свободных страниц. Это unsigned long-число увеличивается каждый раз, когда из зоны выделяется станица, и уменьшается после того, как страница освобождается. Общее количество свободной оперативной памяти, возвращаемое nr_f ree_pages (), рассчитывается с помощью сложения значений для всех трех зон. 4.2.1.3 pages_min, pagesjow и pagesjiigh Поля pages_min/ pages_low и pages_high хранят значения водяных знаков. Когда количество доступных станиц достигает каждого из этих водяных знаков, ядро отвечает на нехватку памяти соответствующим каждому из этих значений образом. Rujock Поле ru_lock хранит циклическую блокировку для списка свободных страниц. Acrtivejlst и inactivejist acrtive_list и inactive_list используются при перераспределении функциональности страниц. Первый - это список активных страниц, а второй - список страниц, годных для повторного использования. 4.2.1.6 all_unreaclaimable Поле all_unreaclaimable устанавливается в 1, если все страницы в зоне закреплены. Использовать повторно их можно только с помощью демона страниц kswapd. 4.2.1.7 pages_scanned, temp_priority и prev_priority Поля page s__s с armed, temp_priority и prev_priority связаны с функциональностью перераспределения памяти, выходящей за рамки рассмотрения данной книги. 4.2.1.8 free_area Дружественная система, использующая битовую карту f гее_агеа. 4.2.1.9 waiMable, wait_table_size и wait_table_bits Поля wait_table, wait_table_size и wait_table_bits связаны с запросами к зонам страниц из очереди ожидания процессов. Вспомогательные функции для работы с зонами памяти Когда к объекту применяется действие, обычно необходимо получить информацию об этом объекте. Проще всего такую информацию можно получить с помощью вспомогательных функций. Далее представлено несколько вспомогательных функций для манипуляции с зонами памяти. Зоны памяти Выравнивание кеша и заполнение зон памяти Выравнивание кеша выполняется для увеличения производительности при доступе к полю описателя. Выравнивание кеша увеличивает производительность за счет минимизации количества инструкций, необходимых для копирования части данных. Возьмем случай 32-битового значения, не выровненного по слову. Процессору придется выполнить две инструкции «загрузка слова» для получения данных из регистров вместо одного. ZONE_PUDDING показывает, как выполняется выравнивание в зоне памяти: include/linux/mmzone.h #if defined(CONFIG_SMP) struct zone_padding { int x; } ___ cacheline__maxaligned_in_smp; #define ZONE_PADDING(name) struct zone_padding name; #else #define ZONE_PADDING(name) #endif Если вы хотите узнать больше о выравнивании в Linux, см. файл include/linux/ cache. h. 4.2.2.1 for__each_zone() Макрос f or_each_zone () итерационно перебирает все зоны: include/linux/mmzone.h 2 68 #define for_each_zone(zone) \ 2 69 for (zone = pgdat_list-> node_zones; zone; zone = next_zone(zone) ) 4.2.2.2 is_highmem() и is_normal() Функции is__highmem() и is_normal() проверяют структуры зон в верхней или в нормальной зоне соответственно: include/linux/mmzone.h 315 static inline int is_highmem(struct zone *zone) 316 { 317 return (zone - zone-> zone_pgdat-> node_zones == ZONE_HIGHMEM); 318 } 32 0 static inline int is_normal(struct zone *zone) 321 ( Глава 4 • Управление памятью return (zone - zone-> zone_pgdat-> node_zones == ZONE_NORMAL); 323 } Фреймы страниц Фреймы страниц - это единицы памяти, хранящие страницы. Когда процессу требуется память, ядро вызывает фрейм страницы. Таким же образом, когда фрейм страницы больше не используется, ядро освобождает его и делает доступным для другого процесса. Для выполнения этих операций служат следующие функции. 4.3.1 Функции для затребования страниц фреймов Для запроса страниц фреймов можно использовать несколько функций. Мы можем раз f ree_page() и____ get_dma_pages(). Многие из них являются обычными обертками низ
Рис. 4.2. Граф вызова alloc_*0 Следующие макросы и функции ссылаются на число обработанных страниц (затребованных или освобожденных) в степени 2. Страницы выделяются и освобождаются последовательностями длины, равной степени двойки. Мы можем запросить 1, 2, 4, 16 и т. д. групп страниц1. 4.3.1.1 alloc_pages() и alloc_page() а11ос_раде () запрашивает одну страницу и поэтому не имеет параметра порядка (order). Эта функция выставляет этот параметр в 0 при вызове alloc_pages_node(); alloc_pages (), наоборот, позволяет затребовать несколько страниц (2 в степени order): 1 Группы запрашиваемых и освобождаемых страниц всегда являются последовательными. 4.3 Фреймы страниц include/linux/gfp.h 75 #define alloc_pages(gfp_mask/ order) \ 76 alloc_pages__node(numa_node_id(), gfp_mask# order) 77 #define alloc_page(gfp_mask) \ 78 alloc_pages_node(numa_node_id(), gfp_mask/ 0) Как вы можете видеть на рис. 4.2, далее оба макроса вызывают alloc_ pages_node (), передавая соответствующие параметры; alloc_pages_node()- это функция-обертка, используемая для проверки порядка требуемых фреймов страниц: include/linux/gfp.h 67 static inline struct page * alloc_pages_node (int nid, unsigned int gfp_mask/ unsigned int order) 68 { 69 if (unlikely(order > = MAX__ORDER) ) 70 return NULL; 72 return _ alloc_pages(gfp_mask/ order, NODE_DATA(nid)-> node_zonelists + (gfp_mask & GFP_ZONEMASK) ); 73 } Вы можете увидеть, что, если порядок требуемых страниц больше доступного максимума (MSX___ORDER), запрос на выделение страницы не проходит. В alloc _j? age() это значение всегда устанавливается в 0 и поэтому всегда проходит. MSX_ORDER определено в linux/mmzone. h и равно 11. Поэтому мы можем затребовать до 2048 страниц. Функция___ alloc_pages () выполняет основную работу по запросу страницы. Эта функция определена в mm/page_alloc. с и требует знания зон памяти, о которых говорилось в предыдущем разделе. 4.3.1.2 _getjree_page() и _get_dma_pages() Макрос__ get_f гее_раде () предполагает затребование только одной страницы. Как и в а11ос_раде (), в него передается 0 в качестве количества требуемых страниц для __ get_f гее_раде (), выполняющей основные действия. Рис. 4.3 иллюстрирует иерархию вызова этих функций. _get_free_page() _get_free_pages() _get_dma_page() Рис. 4.3. Иерархия вызова get_*_page() Глава 4 • Управление памятью include/linux/gfp. h 83 #define _____ get_free_page(gfp_mask) \ 84 __ get_free_pages ( (gfp_itiask), 0) Макрос__ ge t_dma_pages () указывает, что требуемые страницы будут выделены из ZONE_DMA с помощью добавления флага к маске флагов страницы. ZONE_DMA указывают на порцию памяти, зарезервированную для доступа DMA: include/linux/gfp. h 86 #define _ get_dma__pages (gfp_mask/ order) \ 87 ___ get_free_pages((gfp_mask) | GFP_DMA/(order)) Популярное:
|
Последнее изменение этой страницы: 2016-03-25; Просмотров: 856; Нарушение авторского права страницы