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


Функция swap_free

Функция swap fгее вызывается во время загрузки выгруженной страницы, чтобы уменьшить соответствующий счетчик swap map Когда счетчик достигает нуля, страничный слот становится свободным, поскольку его идентификатор больше не содержится ни в одной записи Таблицы Страниц. Однако в разд. "Кэш подкачки" далее в этой главе мы увидим, что кэш подкачки учитывается при подсчете количества владельцев страничного слота.

Функция принимает единственный параметр entry, задающий идентификатор выгруженной страницы, и выполняет следующие действия:
1. Извлекает индекс области подкачки и индекс страничного слота offset из параметра entry и получает адрес дескриптора области подкачки.
2. Проверяет, активна ли область подкачки, и немедленно возвращает управление, если неактивна.
3. Если значение счетчика swap map, соответствующего освобождаемому страничному слоту, меньше, чем swap map max, функция уменьшает его. Вспомним, что счетчики со значением swap map max считаются постоянными (не удаляемыми).
4. Если счетчик swap map достиг нулевого значения, функция увеличивает значение nr swap pages, уменьшает значение поля inuse pages и обновляет, если необходимо, поля lowest bit и highest bit дескриптора области подкачки.

Кэш подкачки

Перенос страниц в область подкачки и обратно является операцией, чреватой многочисленными конфликтами одновременного обращения. В частности, подсистема подкачки должна аккуратно обрабатывать следующие случаи:
- Множественные загрузки выгруженной страницы— два процесса могут одновременно пытаться загрузить одну и ту же совместно используемую анонимную страницу.
- Параллельные загрузки и выгрузки — процесс может пытаться загрузить страницу, выгружаемую в этот момент алгоритмом утилизации страничных кадров.

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

Рассмотрим, например, два процесса, использующих одну выгруженную страницу. Когда первый процесс пытается к ней обратиться, ядро запускает операцию загрузки. Самый первый шаг состоит из проверки наличия страничного кадра в кэше подкачки. Предположим, его там нет. Тогда ядро выделяет новый страничный кадр и заносит его в кэш. Затем оно запускает операцию чтения содержимого страницы из области подкачки. Тем временем второй процесс обращается к этой совместно используемой анонимной странице. Как и для первого процесса, ядро запускает операцию загрузки и проверяет, находится ли нужный страничный кадр в кэше подкачки. Сейчас он уже в кэше, и ядро просто обращается к дескриптору этого страничного кадра и приостанавливает текущий процесс, пока флаг PG iocked не будет сброшен, т. е. пока не закончится чтение данных.

Кэш подкачки также играет исключительно важную роль, когда имеют место параллельные операции загрузки и выгрузки. Как было сказано в разд. "Утилизация при дефиците памяти” ранее в этой главе, функция shrink iist о начинает выгрузку анонимной страницы, только если функция try to unmapO успешно удалила страничный кадр из Таблиц Страниц всех процессов режима пользователя, владеющих этой страницей. Однако один из этих процессов может обратиться к странице, что приведет к запуску операции загрузки, в то время как операция выгрузки (то есть записи) еще не завершилась.

Перед тем как она будет записана на диск, каждая страница, подлежащая выгрузке, сохраняется в кэше подкачки функцией shrink iist о. Рассмотрим страницу Р, совместно используемую двумя процессами: А и В. Изначально записи Таблицы Страниц обоих процессов содержат ссылки на страничный кадр, а у страницы два владельца. Этот а. Когда алгоритм PFRA выбирает страницу для утилизации, функция shrink iist о заносит страничный кадр в кэш подкачки. теперь у страничного кадра три владельца, в то время как на страничный слот в области подкачки ссылается только кэш подкачки. Затем
алгоритм PFRA вызывает функцию try_to_unmap5 чтобы удалить ссылки на страничный кадр из Таблицы Страниц процессов. Когда эта функция завершит работу, на страничный кадр будет ссылаться только кэш подкачки, а на страничный слот — оба процесса и кэш подкачки, Предположим, что пока содержимое страницы записывалось на диск, процесс В обратился к ней, т. е. попытался обратиться к ячейке памяти, пользуясь линейным адресом в пределах этой страницы. Тогда обработчик события "ошибка обращения к странице” найдет страничный кадр в кэше подкачки и вернет его физический адрес в запись Таблицы Страниц процесса В, И наоборот, если операция выгрузки закончится без параллельных операций загрузки, функция shrink iist о удалит страничный кадр из кэша подкачки и вернет страничный кадр buddy-системе Вы можете считать кэш подкачки транзитной областью, содержащей дескрипторы анонимных страниц, которые выгружаются или загружаются в настоящий момент. Когда операция выгрузки или загрузки завершается (в случае совместно используемой анонимной страницы выгрузка или загрузка должна быть выполнена для всех процессов, работающих с этой страницей), дескриптор анонимной страницы может быть удален из кэша подкачки.

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

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

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

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

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

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

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

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