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


Функция shrink_caches

Функция shrinkcaches вызывается функцией trytof reepages . Она принимает два параметра: список зон памяти zones и адрес sc дескриптора
scan_control.

Цель этой функции заключается лишь в том, чтобы вызвать функцию shrink zone для каждой зоны из списка zones. Однако перед вызовом функции shrink_zone ДЛЯ данной ЗОНЫ фуНКЦИЯ shrink caches обновляет ПОЛе temp priority дескриптора зоны, пользуясь значением из ПОЛЯ sс—> priority — это текущий приоритет операции сканирования. Кроме того, если значение приоритета при предыдущем вызове алгоритма PFRA было выше текущего, т. е. утилизацию страничных кадров в этой зоне сейчас выполнить труднее, то функция shrink caches копирует текущий приоритет в поле prev priority дескриптора ЗОНЫ. Наконец, функция shrink caches не вызывает функцию shrink zone ДЛЯ данной ЗОНЫ, если флаг all unreclaimable В дескрипторе зоны установлен, а текущий приоритет меньше 12. Иными словами, функция shrink caches не вызывается при первой итерации цикла в функции trytof reepages . Алгоритм утилизации страничных кадров устанавливает флаг aii unreciaimabie, когда приходит к выводу, что в зоне так много неутилизируемых страниц, что сканирование их является пустой тратой времени.

Функция shrink_zone

Функция shrink zone принимает два параметра: zone, указатель на дескриптор struct zone, и sc, указатель на дескриптор scan controi. Цель этой функции заключается в том, чтобы утилизировать 32 страницы из неактивного списка зоны. Функция пытается добиться этого, многократно вызывая служебную функцию shrink cacheo, каждый раз для большего фрагмента неактивного списка зоны. Кроме того, функция shrink zone пополняет неактивный СПИСОК ЗОНЫ, многократно вызывая функцию refill_inactive_zone, описанную ранее в разд. "Списки давно неиспользуемых страниц (LRU) ".

Поля nr scan active И nr scan inactive дескриптора ЗОНЫ играют здесь особую роль. Из соображений эффективности функция работает с пакетами по 32 страницы. Таким образом, если она выполняется с низким уровнем привилегий (с высоким значением в поле sc->priority), а один из списков давно неиспользуемых страниц не содержит достаточное количество элементов, функция пропускает сканирование этого списка. Впрочем, количество пропущенных при этом активных или неактивных страниц записывается в поля nr scan active ИЛИ nr scan inactive, так ЧТО пропущенные страницы будут рассмотрены при следующем вызове функции.

Если говорить конкретно, функция shrink zone выполняет следующие действия:
1. Увеличивает поле zone->nr_scan_active на некоторую часть от общего количества элементов в активном списке (zone->nr_active). Фактическое значение приращения определяется текущим приоритетом и колеблется в диапазоне от zone->nr_active/212 до zone->nr_active/2° (то есть до общего количества активных страниц в зоне).
2. Увеличивает поле zone->nr_scan_inactive на некоторую часть от общего количества элементов в неактивном списке (zone->nr_inactive). Фактическое значение приращения определяется текущим приоритетом и колеблется В диапазоне ОТ zone->nr_inactive/212 ДО zone->nr_inactive.
3. Если значение в поле zone->nr_scan_active больше или равно 32, функция копирует его в локальную переменную nr active, а поле сбрасывает до нуля. В противном случае функция записывает ноль в переменную
nr_active.
4. Если значение в поле zone->nr_scan_inactive больше или равно 32, функция копирует его в локальную переменную nr inactive, а поле сбрасывает
до нуля. В противном случае функция записывает ноль в переменную
nr_inactive.
5. Записывает 32 в поле sc->nr_to_reciaim дескриптора scan controi.
6. Если оба поля nr active и nr inactive равны 0, ничего не надо делать, и функция завершает работу. Это бывает в маловероятной ситуации, когда процессам в режиме пользователя не выделено ни одного страничного кадра.
7. Если значение поля nr active положительно, функция пополняет неактивный список зоны:
sc->nr_to_scan = min(nr_active, 32); nr_active -= sc->nr_to_scan; refill_inactive_zone(zone, sc);
8. Если значение поля nr inactive положительно, функция пытается утилизировать хотя бы 32 страницы из неактивного списка:
sc->nr_to_scan = min(nr_inactive, 32); nr_inactive -= sc->nr_to_scan; shrink_cache(zone, sc);
9. Если функции shrink zone удается утилизировать 32 страницы (значение в поле sc->nr_to_reciaim теперь равно нулю или отрицательно), функция завершает работу. В противном случае она переходит к шагу 6.

Предыдущая страница | 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. Этот дескриптор содержит всю информацию, необходимую ядру для работы с блоком, так что перед обработкой блока ядро обязательно проверяет голову...