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


Выделение страничных кадров с помощью кэшей страничных кадров процессора

Функция buf fered rmqueue выделяет страничные кадры в заданной зоне памяти. Она пользуется кэшами страничных кадров процессора при обработке запросов на одиночные страничные кадры.

Параметрами функции являются адрес дескриптора зоны памяти, порядок запроса на выделение памяти order и флаги выделения gfp fiags. Если в параметре gfp flags установлен флаг gfp_cold, значит, страничный кадр должен быть взят из холодного” кэша; в противном случае его следует брать из
"горячего" (этот флаг имеет смысл только при запросах на одиночные страничные кадры). Функция выполняет следующие действия:
1. Если значение параметра order не равно 0, кэш страничных кадров процессора не используется, и функция переходит к шагу 4.
2. Проверяет, нужно ли пополнить кэш локального процессора, расположенный в данной зоне памяти и идентифицируемый значением флага
gfp cold (поле count дескриптора per cpu pages меньше или равно полю
low). В таком случае функция выполняет следующие действия:
• выделяет batch одиночных страничных кадров из buddy-системы, многократно вызывая функцию rmqueue ;
• заносит дескрипторы выделенных страничных кадров в список кэша;
• обновляет значение поля count, прибавляя к нему количество фактически выделенных страничных кадров.
3. Если значение count положительно, функция получает страничный кадр из списка кэша, уменьшает count и переходит к шагу 5. (Заметьте, что кэш страничных кадров процессора мог оказаться пустым; это случается, когда
функции rmqueue , вызванной на шаге 2, не удается выделить ни одного страничного кадра.)
4. Если функция выполняет этот шаг, значит, запрос еще не был удовлетворен: либо потому, что для него требуется несколько смежных страничных кадров, либо потому, что выбранный кэш страничных кадров пуст. Функция вызывает функцию rmqueue о, чтобы выделить запрошенные страничные кадры в buddy-системе.
5. Если запрос на память удовлетворен, функция инициализирует дескриптор страничного кадра (первого или единственного), а именно: сбрасывает некоторые флаги, обнуляет поле private и записывает единицу в счетчик
ссылок страничного кадра. Кроме того, если флаг gpf zero в поле
gfp fiags установлен, функция заполняет нулями выделенную область памяти.
6. Возвращает адрес дескриптора, ассоциированного с (первым или единственным) страничным кадром, или null, если удовлетворить запрос на выделение памяти не удалось.


Освобождение страничных кадров для кэшей страничных кадров процессора

Чтобы освободить одиночный страничный кадр для кэша страничных кадров процессора, ядро вызывает функции free_hot_page И f ree cold page . Обе они являются всего лишь интерфейсными функциями для функции
free hot coid page , которая принимает в качестве параметров адрес раде дескриптора освобождаемого страничного кадра и флаг cold, определяющий "горячий” или "холодный” кэш.

Функция f ree hot coid page выполняет следующие действия:
1. Извлекает из поля page->fiags адрес дескриптора зоны памяти, содержащей данный страничный кадр.
2. Получает адрес дескриптора per cpu pages кэша, принадлежащего этой зоне и определяемого флагом cold.
3. Проверяет, следует ли почистить кэш. Если значение count больше или равно high, функция вызывает функцию free pages buiko передавая ей дескриптор зоны, количество страничных кадров, подлежащих освобождению (поле batch), адрес списка кэша и число ноль (для страничных кадров нулевого порядка). Что касается вызванной функции, она многократно вызывает функцию free pages buiko, чтобы освободить указанное количество страничных кадров (взятых из списка кэша) для buddy-системы данной зоны.
4. Добавляет в список кэша освобождаемый страничный кадр и увеличивает значение в поле count.
Следует заметить, что в текущей версии ядра Linux 2.6 страничные кадры ни в какой ситуации не освобождаются для холодного” кэша. Ядро всегда предполагает, что освобождаемый страничный кадр является горячим” по отношению к аппаратному кэшу. Конечно, это не означает, что холодный” КЭШ пуст. Он пополняется функцией buf f ered_rmqueue ПО ДОСТИЖеНИИ НИЖ- ней отметки.

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




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

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

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

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

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

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

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

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

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