Операции подкачки выполняются процессом подкачки, swapper (процесс 0). Этот процесс является первым, который система создает при своем запуске. Политика подкачки swapper воплощена в процедуре scheduler(). Эта процедура подкачивает процессы обратно в память, когда она доступна и когда процессы готовы к запуску. В любое время планировщик подкачки (swapper) находится в одном из трех состояний.
1. Простой (idle): нет готовых к запуску выгруженных процессов. Простой является нормальным состоянием.
2. Подкачка (swapping in): по крайней мере один процесс выгружен и scheduler() пытается найти для него память.
3. Выгрузка (swapping out): система испытывает недостаток памяти или недостаточно памяти для подкачки процесса. В этих условиях scheduler() пробуждает демон выгрузки страниц, чтобы освободить страницы и выгружать остальные процессы до тех пор, пока недостаток памяти не ослабнет.
Если готово к запуску более одного выгруженного процесса, первой задачей swapper является решение вопроса о том, какой процесс загрузить. Это решение может повлиять на решение о том, нужно ли выгружать другой процесс. Каждому выгруженному процессу назначается приоритет, основанный на:
· продолжительности времени нахождения его в выгруженном состоянии;
· значении его относительного приоритета (nice);
· количестве времени, которое он провел в состоянии сна с момента последнего запуска.
Вообще процесс, который больше всего находился в выгруженном состоянии или был выгружен из-за того, что долго спал перед этим, будет закачан в первую очередь. Когда процесс выбран, swapper проверяет, достаточно ли свободной памяти, чтобы закачать процесс. Исторически система требовала такого количества доступной памяти, которое процесс занимал до своей выгрузки. Для FreeBSD это требование было снижено до требования, чтобы число страниц в свободном списке и списке кеша было равно по крайней мере минимальному порогу свободной памяти. Если есть достаточно свободной памяти, процесс загружается обратно в память. Сразу же подкачивается структура пользователя, но оставшуюся часть своего рабочего набора процесс загружает из резервного хранилища через подкачку по требованию. Таким образом, не вся память, которая нужна процессу, используется немедленно. Более ранние системы BSD отслеживали предстоящие запросы памяти и загрузили бы готовые к исполнению процессы, лишь когда для выполнения их ожидающихся потребностей становилось достаточно свободной памяти. FreeBSD разрешает подкачивать все выгруженные готовые к выполнению процессы, как только будет достаточно памяти для загрузки их структуры пользователя и стеков потоков.
Процедура подкачки процесса обратно процедуре его выгрузки.
1. Выделяется память для структуры пользователя и стека ядра для каждого из его потоков, и они считываются обратно из пространства подкачки.
2. Процесс помечается как резидентный, а его готовые в выполнению потоки возвращаются в очередь запуска (т. е. те потоки, которые не остановлены и не являются спящими).
После завершения подкачки процесс готов к запуску, как любой другой, за исключением того, что у него нет резидентных страниц. Он будет загружать нужные страницы, вызывая отказы страниц.
- 09/11/2010 09:04 - Операции, определенные пейджером
- 08/11/2010 13:50 - Выделение и освобождение отображения
- 06/11/2010 08:32 - Инициализация и запуск
- 04/11/2010 18:14 - Роль модуля pmap
- 02/11/2010 21:26 - Переносимость
- 01/11/2010 08:04 - Изменение защиты
- 31/10/2010 22:44 - Отображение файлов
- 29/10/2010 23:12 - Демон выгрузки страниц
- 29/10/2010 00:56 - Замещение страниц
- 28/10/2010 11:59 - Раскраска страниц (page coloring)