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


Утилизация при дефиците памяти

Утилизация при дефиците памяти активизируется, когда попытка выделения памяти заканчивается неудачей. Как показано на рис. 17.3, ядро вызывает функцию fгее шоге шешогу при выделении буфера виртуальной файловой системы или головы буфера, а функцию try to free pages оно вызывает при выделении одной или нескольких страниц из buddy-системы.

Функция free_more_memory

Функция f гее шоге шешогу выполняет следующие действия:
1. Вызывает функцию wakeup_bdflush , чтобы активизировать поток ядра pdflush и запустить операции записи для 1024 грязных страниц в кэше. Запись грязных страниц на диск может, в конечном счете, позволить освободить страничные кадры, содержащие буферы, головы буферов и прочие структуры виртуальной файловой системы.
2. Вызывает служебную процедуру системного вызова sched yieido, чтобы предоставить потоку ядра pdflush возможность выполнения.
3. Запускает цикл по всем узлам памяти Для каждого узла функция вызывает функцию trytof reepages , передавая ей список дефицитных” зон памяти (в архитектуре 80x86 это zone dma и zone_normal).

Функция try_to_free_pages

Функция trytof reepages принимает три параметра:
- zones — список зон памяти, в которых должны быть утилизированы страницы;
- gfp mask— набор флагов, которые были использованы при неудавшейся попытке выделить память;
- order — не используется.
Цель этой функции состоит в том, чтобы освободить, как минимум, 32 страничных кадра, многократно вызывая функции shrink caches о и shrink siabo, каждый раз с приоритетом более высоким, чем при предыдущем вызове. Эти вспомогательные функции находят значение приоритета (как и другие параметры текущей операции сканирования) в дескрипторе типа scan controi Наименьший, первоначальный приоритет равен 12, в то время как самый высокий, конечный приоритет равен 0. Если функция try to f ree pages не сумеет утилизировать хотя бы 32 страничных кадра на ОДНОМ ИЗ 13 ВЫЗОВОВ функций shrink caches (и shrink siab , алгоритм утилизации страничных кадров окажется в затруднительном положении, и в его распоряжении останется последнее средство: уничтожить какой-нибудь процесс, чтобы освободить все его страничные кадры. Эта операция выполняется функцией out of memory

Функция выполняет следующие действия:

1. Выделяет и инициализирует дескриптор scan controi. В частности, сохраняет маску выделения gfp_mask В поле gfp_mask.
2. Для каждой зоны в списках zones функция записывает в поле temp priority дескриптора зоны первоначальное значение приоритета (12). Кроме того, она вычисляет суммарное количество страниц в списках LRU этих зон.
3. Выполняет цикл максимум из 13 итераций, соответствующих приоритетам от 12 до 0; при каждой итерации выполняет следующие действия:
• обновляет некоторые поля дескриптора scan controi. В частности, записывает в поле nr mapped суммарное количество страниц, которыми владеют процессы режима пользователя, а в поле priority— приоритет текущей итерации. Кроме того, функция записывает нули в поля
nr_s canned И nr_r eel aimed;
• вызывает функцию shrink caches , передавая ей в качестве аргументов список zones и адрес дескриптора scan controi. Эта функция сканирует неактивные страницы зон;
• вызывает функцию shrink siabo, чтобы утилизировать страницы из сокращаемых кэшей ядра
• если поле current->reciaim_state не содержит null, функция прибавля- ет К значению В поле nr_reclaimed дескриптора scan controi количество страниц, утилизированных из кэшей slab-аллокатора. Это значение хранится в небольшой структуре данных, на которую указывает поле
дескриптора процесса. Функция aiioc pages о устанавливает поле
current->reclaim_state перед ВЫЗОВОМ функции try to free pages И сбрасывает это поле сразу после завершения работы функции. Странно, но функция f гее шоге шешогу это поле не устанавливает;
• если цель достигнута (поле nr_reclaimed дескриптора scan control больше или равно 32), функция прерывает цикл и переходит к шагу 4;
• цель еще не достигнута. Если к этому моменту просканировано, как МИНИМУМ, 49 Страниц, фуНКЦИЯ ВЫЗЫВаеТ фуНКЦИЮ wakeup_bdflush , чтобы активизировать поток ядра pdflush и записать некоторые грязные страницы из кэша на диск (см. разд. "Поиск грязных страниц для записи на диск" в главе 15);
• если функция уже выполнила четыре итерации, не достигнув цели, она вызывает функцию bik congestion waitо, чтобы приостановить текущий процесс, пока очередь запросов write не перестанет быть переполненной, или пока не пройдет 100 мс
4. Записывает в поле prev priority каждого дескриптора зоны приоритет, использованный при последнем вызове функции shrink caches о. Значение приоритета хранится в поле temp priority дескриптора зоны.
5. Возвращает 1, если утилизация прошла успешно, и 0 в противном случае.

Предыдущая страница | 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 | Следующая страница




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

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

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

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

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

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

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

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

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