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


Функция pageoutf

Функция pageout о вызывается функцией shrink list о, когда грязная страница должна быть записана на диск. Эта функция выполняет следующие операции:
1. Проверяет, находится ли страница в кэше страниц или в кэше подкачки (см. разд. "Кэш подкачки" далее в этой главе). Кроме того, убеждается, что страницей владеют только кэш страниц (или кэш подкачки) и алгоритм PFRA. Функция возвращает значение page keep, если проверка закончилась неудачей (нет смысла записывать страницу на диск, если shrink list не может ее утилизировать).
2. Проверяет, определен ли метод writepage объекта address space. Если не определен, возвращает page activate.
3. Проверяет, может ли текущий процесс выдавать запросы на запись в очереди запросов блочного устройства, ассоциированного с объектом address space. Дело в том, что только потоки ядра kswapd и pdflush всегда могут выдавать запросы на запись. Что касается нормальных процессов, они могут выдавать запросы, когда очередь запросов не переполнена, если только поле current->backing_dev_info не указывает на структуру backing dev info блочного устройства
4. Проверяет, является ли страница все еще грязной. Если нет, возвращает
PAGE CLEAN.
5. Устанавливает дескриптор writeback controi и вызывает метод writepage объекта address space, чтобы запустить операцию записи страницы обратно на диск
6. Если метод writepage возвратил код ошибки, функция возвращает значение PAGE_ACT IVATE.
7. Возвращает page_success.

Утилизация страниц сокращаемых кэшей диска

Из предыдущих глав мы знаем, что, помимо кэша страниц, ядро пользуется другими кэшами диска, например, кэшем элементов каталога и кэшем индексных дескрипторов Когда алгоритм PFRA пытается утилизировать страничные кадры, он должен также проверить, можно ли сократить размер каких-нибудь кэшей диска.

Каждый кэш диска, рассматриваемый алгоритмом утилизации страничных кадров, должен иметь сокращающую функцию, регистрируемую на этапе инициализации. Сокращающая функция принимает два параметра: количество страничных кадров, которое должно быть утилизировано, и набор флагов выделения GFP. Функция выполняет все, что необходимо для утилизации страниц из кэша диска, а затем возвращает количество утилизируемых страниц, оставшихся в кэше.

Функция set shrinker регистрирует сокращающую функцию для алгоритма утилизации страничных кадров. Эта функция выделяет дескриптор, имеющий тип shrinker, сохраняет адрес сокращающей функции в этом дескрипторе, а затем заносит дескриптор в глобальный список с корнем в глобальной переменной shrinker iist. Функция set shrinker о также инициализирует поле seeks дескриптора shrinker. Говоря неформально, это параметр, который показывает стоимость” восстановления одного элемента кэша, если он будет удален.

В Linux 2.6.11 не так уж много кэшей диска, зарегистрированных для алгоритма утилизации страничных кадров. Кроме кэша элементов каталога и кэша индексных дескрипторов, только слой квоты диска, кэш блоков метаинформации файловой системы (используемый, в основном, для расширенных атрибутов файловой системы) и журналируемая файловая система XFS регистрируют сокращающие функции.

Функция алгоритма PFRA, которая утилизирует страницы из сокращаемых кэшей диска, называется shrink siabo (название сбивает с толку, поскольку функция не имеет никакого отношения к кэшам slab-аллокатора). Эта функция вызывается функцией try to free pages о, как было сказано ранее в
разд. "Утилизация при дефиците памяти", и функцией baiance pgdat , которая будет описана позже, в разд. "Периодическая утилизация”.

Функция shrink siabo пытается сбалансировать стоимость утилизации страницы из сокращаемого кэша диска со стоимостью утилизации из списков LRU (выполняемой функцией shrink iist о). Если говорить коротко, функция проходит по списку дескрипторов shrinker, чтобы вызывать сокращающие функции и получить общее количество утилизируемых страниц в кэшах диска. Затем функция снова сканирует список дескрипторов shrinker. На этот раз она для каждого сокращаемого кэша диска эвристическим образом вычисляет количество страничных кадров, подлежащих утилизации (основываясь на количестве утилизируемых страниц в кэшах диска, на относительной стоимости восстановления страницы в кэше диска и на количестве страниц в списках LRU), и вызывает сокращающую функцию, чтобы попытаться утилизировать пакеты минимум по 128 страниц.

За недостатком места, мы ограничимся лишь кратким описанием сокращающих функций кэша элементов каталога и кэша индексных дескрипторов.

Предыдущая страница | 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 без проблем

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга для вас. А так как к книге прилагается компакт- диск с готовой к работе операционной системой Knoppix Live CD, то лишь достаточно вставить его в привод и перегрузить компьютер,...

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

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

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

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно неуклюже: получив системный вызов fork о, ядро в буквальном смысле дублировало все адресное пространство родителя и присваивало копию процессу-потомку. Такая операция...

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

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer head. Этот дескриптор содержит всю информацию, необходимую ядру для работы с блоком, так что перед обработкой блока ядро обязательно проверяет голову...