Функция page_referenced
Функция page referenced , которая вызывается один раз для каждой страницы, просканированной алгоритмом утилизации страничных кадров, возвращает 1, если установлен либо флаг PG referenced, либо некоторые из битов Accessed в записях Таблицы Страниц. В противном случае она возвращает 0. Эта функция вначале проверяет флаг PGref erenced дескриптора страницы и, если флаг установлен, сбрасывает его. Затем она приводит в действие механизм объектно-базированного обратного отображения, чтобы проверить и сбросить биты Accessed во всех записях Таблицы Страниц режима пользователя, которые ссылаются на страничный кадр. Для этого функция вызывает три служебные функции: page_referenced_anon, page_referenced_ file И page referenced one , которые аналогичны функциям trytounmapxxx , описанным в разд. "Обратное отображение” ранее в этой главе. Функция pageref erenced также принимает во внимание жетон защиты от выгрузки Функция pageref erenced о никогда не переносит страницы из активного списка В неактивный; эту работу выполняет функция refill inactive zone . В действительности, она делает гораздо больше, чем простой перенос стра
ниц из активного списка в неактивный, так что мы опишем ее более подробно.
Функция refill_inactive_zone
функция refiii inactive zone о вызывается функцией shrink zone , которая утилизирует страницы, находящиеся в кэше страниц и в адресном пространстве режима пользователя Функция принимает два параметра: указатель zone на дескриптор зоны памяти и указатель sc на структуру scan controi. Последняя структура активно используется алгоритмом утилизации страничных кадров и содержит информацию о текущей операции утилизации. Роль функции refiii inactive zone о чрезвычайно важна, поскольку перенос страницы из активного списка в неактивный делает страницу кандидатом на утилизацию, в конечном счете, алгоритмом PFRA. Если функция будет вести себя слишком агрессивно, она перенесет из активного списка в неактивный очень много страниц. Как следствие, алгоритм PFRA утилизирует большое количество страничных кадров, и система достигнет высокой производительности. С другой стороны, если функция будет слишком "ленивой”, неактивный список не будет пополняться достаточным количеством неиспользуемых страниц, и алгоритму PFRA не удастся утилизировать память. Таким образом, функция ведет себе адаптивно: поначалу она при каждом вызове сканирует небольшое количество страниц в активном списке. Однако, если у алгоритма PFRA возникнут проблемы с утилизацией страничных кадров, функция refiii inactive zone о станет увеличивать количество сканируемых страниц в активном списке при каждом вызове. Такое поведение управляется значением поля priority в структуре scan controi (чем меньше значение, тем выше приоритет).
Есть еще одно правило, регулирующее поведение функции refiii_inactive_ zone о. Списки LRU содержат два вида страниц: страницы, принадлежащие адресным пространствам режима пользователя, и страницы, включенные в кэш, но не принадлежащие ни одному процессу в режиме пользователя. Как было сказано ранее, алгоритм утилизации страничных кадров должен стараться ужимать” кэш страниц, оставляя в памяти страницы, принадлежащие процессам, работающим в режиме пользователя. Однако никакое зафиксированное золотое правило” не в состоянии обеспечить хорошую производительность В ЛЮбоЙ СИТуаЦИИ, И ПОЭТОМУ фуНКЦИЯ refill_inactive_zone ИС- пользует эвристическое значение тенденции к выгрузке. Это значение определяет, будет ли функция перемещать все виды страниц или только страницы, не принадлежащие адресным пространствам режима пользователя6. Значение тенденции к выгрузке вычисляется функцией по следующей формуле:
тенденция к выгрузке = отношение отображения /2 + степень неблагополучия + выгружаемость
Здесь отношение отображения— процентное отношение страниц из всех зон памяти, принадлежащих адресным пространствам режима пользователя (sс->nr_mapped), к общему количеству выделяемых страничных кадров. Высокое значение отношения отображения свидетельствует о том, что динамическая память используется, в основном, процессами, работающими в режиме пользователя; низкое значение говорит о том, что память преимущественно используется кэшем страниц.
Степень неблагополучия является мерой того, насколько эффективно алгоритм PFRA утилизирует страничные кадры в данной зоне. Это значение основано на приоритете сканирования зоны в предыдущем проходе алгоритма (приоритет хранится в поле prev priority дескриптора zone). Значение степени неблагополучия зависит от предыдущего приоритета зоны следующим образом:
Выгружаемость — это константа, определяемая пользователем. Обычно она равна 60. Системный администратор может непосредственно изменить это значение в файле /proc/sys/vm/swappiness или изменить его с помощью системного вызова syscti о.
Страницы будут отозваны из адресных пространств процессов для утилизации, только если тенденция к выгрузке из данной зоны станет больше или равной 100. Таким образом, если системный администратор приравняет выгружаемость к нулю, алгоритм PFRA не будет утилизировать страницы из адресных пространств режима пользователя, если предыдущий приоритет зоны не станет равным нулю (что маловероятно). Если же администратор установит выгружаемость в значение 100, алгоритм будет утилизировать страницы из адресных пространств режима пользователя при каждом вызове.
Приведем краткое описание действий, выполняемых функцией refiii_ inactive_zone
1. Вызывает функцию iru add draino, чтобы перенести в активный и неактивный списки все страницы, которые еще находятся в структурах
pagevec.
2. Получает спин-блокировку zone->lru_lock.
3. Выполняет первый цикл сканирования страниц в списке zone-> active iist, начиная с хвоста списка и двигаясь в обратном направлении. Продолжает, пока список не станет пустым или пока не будет просканировано sc->nr_to_scan страниц. Для каждой страницы, просканированной в этом цикле, функция увеличивает счетчик ссылок на единицу, удаляет дескриптор страницы из списка zone->active_iist и заносит его во временный локальный список l hoid. Однако, если счетчик ссылок страничного кадра был равен нулю, функция возвращает страницу в активный список. Дело в том, что страничные кадры с нулевым счетчиком ссылок должны принадлежать buddy-системе данной зоны. Для освобождения странично
го кадра следует вначале уменьшить его счетчик ссылок, а затем удалить страничный кадр из списков давно неиспользуемых страниц и занести его в список buddy-системы. Следовательно, у алгоритма PFRA есть небольшое "окно” времени, в течение которого он может увидеть свободную страницу в одном из списков LRU.
4. Прибавляет к значению zone->pages_scanned количество активных страниц, которые были просканированы.
5. Вычитает из значения zone->nr_active количество страниц, перенесенных
В ЛОКаЛЬНЫЙ СПИСОК l_hold.
6. Освобождает спин-блокировку zone->lru_lock.
7. Вычисляет значение тенденции к выгрузке.
8. Выполняет второй цикл для страниц в локальном списке l hold. Цель этого цикла состоит в разделении страниц из списка l hold на два подсписка: l active и l inactive. Страница, принадлежащая адресному пространству какого-либо процесса в режиме пользователя (то есть страница, у которой значение page->_mapcount не отрицательно), добавляется в список l active, если тенденция к выгрузке меньше ста, или если страница является анонимной, но никакая область подкачки не активна, или если функция page referencedo, примененная к странице, возвратила положительное число, означающее, что недавно произошло обращение к странице. Во всех остальных случаях страница заносится в список
l_mactive .
9. Получает спин-блокировку zone->lru_lock.
10. Выполняет третий цикл для страниц в локальном списке l inactive, чтобы перенести ИХ В СПИСОК zone->inactive_list, И обновляет поле zone-> nr inactive. При этом функция уменьшает счетчики обращений переносимых страничных кадров, чтобы компенсировать увеличение счетчиков, имевшее место на шаге 3.
11. Выполняет четвертый и последний цикл для страниц в локальном списке
l active, чтобы перенести их в список zone->active_iist, и обновляет поле zone->nr_active. При этом функция уменьшает счетчики обращений переносимых страничных кадров, чтобы компенсировать увеличение счетчиков, имевшее место на шаге 3.
12. Освобождает спин-блокировку zone->iru_iock и возвращает управление.
Следует отметить, что функция refiii_inactive_zone проверяет флаг PG referenced только у страниц, принадлежащих адресным пространствам режима пользователя В противном случае страницы находятся в хвосте активного списка (из чего следует, что к ним происходили обращения некоторое время тому назад, и маловероятно, что обращения к ним произойдут в ближайшем будущем). С другой стороны, функция не переносит страницу из активного списка, если ею владеет какой-либо процесс в режиме пользователя, и он недавно к ней обращался.
Предыдущая страница | 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 | Следующая страница