Функция shrinkJistQ
Мы добрались до сердцевины утилизации страниц. В то время как цель функций, описанных ДО ЭТОГО момента, ОТ try_to_free_pages ДО shrink cache , заключалась в составлении набора страниц-кандидатов на утилизацию, функция shrink iist о пытается выполнить фактическую утилизацию страниц из списка, переданного ей в качестве параметра page iist. Второй параметр sc, как обычно, является указателем на дескриптор scan controi. Когда функция shrink iist о возвращает управление, список page iist содержит страницы, которые не удалось освободить.
Эта функция выполняет следующие действия:
1. Если поле-флаг tif need resched текущего процесса установлено, функция вызывает функцию schedule .
2. Запускает цикл по всем дескрипторам страниц из списка page iist. При каждой итерации она удаляет дескриптор страницы из списка и пытается
утилизировать страничный кадр. Если это по какой-то причине не удается, функция заносит дескриптор страницы в локальный список.
3. На этом шаге список page iist пуст. Функция возвращает в него дескрипторы страниц из локального списка.
4. Увеличивает значение в поле sc->nr_reciaimed на количество страничных кадров, утилизированных на шаге 2, и возвращает это число.
Конечно, самой интересной частью функции shrink iist о является код, пытающийся утилизировать страничный кадр.
Существует только три возможных исхода у обработки каждого кадра функцией shrink_list():
- страница возвращается buddy-системе зоны при помощи функции free_coid_page Иными словами, страница успешно утилизируется;
- страница не утилизируется. Она будет заново занесена в список page iist, но функция shrink iist о предполагает, что в ближайшем будущем страницу удастся освободить. Поэтому функция оставляет сброшенным флаг PG active в дескрипторе страницы, чтобы страница была возвращена в неактивный список зоны памяти. Это событие соответствует прямоугольникам "НЕАКТИВНАЯ"
- страница не утилизируется. Она будет заново занесена в список page iist. Либо страница активно используется, либо функция shrink iist о предполагает, что страницу невозможно утилизировать в обозримом будущем. Тогда функция устанавливает флаг PG active в дескрипторе страницы, чтобы страница была занесена в активный список зоны памяти. Это событие соответствует прямоугольникам "АКТИВНАЯ"
Функция shrink iist о никогда не станет утилизировать заблокированную страницу (у которой установлен флаг PG iocked) или страницу, записываемую на диск (установлен флаг PG writeback). Чтобы проверить, были ли к странице обращения за последнее время, функция shrink iist о вызывает функцию
page ref erenced , описанную ранее в этой главе.
Чтобы утилизировать анонимную страницу, ее надо добавить в кэш подкачки, и для нее должен быть зарезервирован новый слот в области подкачки (подробности см. в разд. "Подкачка" далее в этой главе).
Если страница находится в адресном пространстве какого-либо процесса в режиме пользователя (поле mapcount дескриптора страницы больше или равно нулю), функция shrink iist вызывает функцию try to unmap , Чтобы найти все записи Таблицы Страниц в режиме пользователя, которые ссылаются на данный страничный кадр (см. разд. "Обратное отображение"ранее в этой главе). Конечно, утилизация может продолжаться, только если эта функция возвратит swap success.
Грязная страница не может быть утилизирована, если она не записана на диск. Чтобы сделать это, функция shrink_iis вызывает функцию
pageout о, описанную далее. Утилизация страничного кадра может продолжаться, только если функция pageout не должна выполнять операцию записи или если операция записи быстро заканчивается.
Если страница содержит буферы виртуальной файловой системы, функция shrinklist ВЫЗЫВает функцию trytoreleasepage о, чтобы освободить ассоциированные со страницей головы буферов Наконец, если все прошло гладко, функция shrink list о проверяет счетчик ссылок страницы. Если он равен двум, значит, у страницы всего два владельца — кэш страниц (или кэш подкачки, если страница анонимная) и сам алгоритм утилизации страничных кадров (счетчик ссылок был увеличен на шаге 3 функции shrink cache ). В этом случае страница может быть утилизирована при условии, что она все еще не грязная. Для утилизации страница вначале удаляется из кэша страниц или из кэша подкачки, в соответствии со значением флага PG swapcache дескриптора страницы, а затем выполняется функция free_cold_page.
Предыдущая страница | 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 | Следующая страница