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


Как распределять страницы в областях подкачки

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

Однако, когда имеется более одной области подкачки, ситуация усложняется. Быстрые области подкачки, т. е. те, что находятся на быстрых дисках, получают более высокий приоритет. При поиске свободного слота просмотр начинается с области подкачки, имеющей наивысший приоритет. Если таких областей несколько, области подкачки с одинаковым приоритетом выбираются циклически, чтобы ни одна из них не переполнилась. Если в областях с наивысшим приоритетом свободных слотов не окажется, поиск продолжается в областях, имеющих предыдущий по высоте приоритет и т. д.

Дескриптор области подкачки

Для каждой области подкачки в памяти хранится дескриптор swap info struct. Его поля перечислены в табл. 17.3.
Поле flags содержит три перекрывающихся подполя:
- swp used — 1, если область подкачки активна, и 0 в противном случае;
- swp writeok— 1, если существует возможность записи в область подкачки; 0, если область подкачки доступна только для чтения (то есть в данный момент она переводится в активное или неактивное состояние);
- swp active— это двухбитовое поле фактически является комбинацией swp used и swp writeok. Флаг установлен, когда оба предыдущих флага установлены.

Поле swap map указывает на массив счетчиков, по одному на каждый страничный слот области подкачки. Если счетчик равен нулю, значит, страничный слот свободен; если счетчик положителен, значит, слот содержит выгруженную страницу. По сути, счетчик страничного слота показывает количество процессов, совместно использующих выгруженную страницу. Если значение счетчика равно swap map max (то есть 32 767), то слот содержит "постоянную" страницу, которую нельзя из него удалить. Если счетчик равен swap map bad (32 768), он считается дефектным и непригодным к использованию8.

Поле prio содержит целое со знаком, определяющее порядок, в котором подсистема подкачки должна перебирать области подкачки.

Поле sdev iock является спин-блокировкой, которая защищает структуры области подкачки, в основном, дескриптор, от параллельного обращения в многопроцессорных системах.

Массив swap info содержит max swapfiles дескрипторов областей подкачки. Используются только области, у которых установлены флаги swp used, потому что эти области активны. На рис. 17.6 изображены массив swap info, одна область подкачки и соответствующий массив счетчиков.

Переменная nr swapfiies хранит индекс последнего элемента массива, который содержит или содержал использованный дескриптор области подкачки. Несмотря на свое название (количество файлов подкачки”), переменная не содержит количество активных областей подкачки.

Дескрипторы активных областей подкачки также занесены в список, отсортированный по приоритетам областей. Список реализован с помощью поля next дескриптора области подкачки, которое содержит индекс следующего дескриптора в массиве swap info. Такое использование поля в качестве индекса массива нетипично, поскольку большинство полей с именем next содержит указатели.

Переменная swap iist, имеющая тип swap iist t, состоит из следующих полей:
- head — индекс первого элемента списка в массиве swap infо;
- next — индекс в массиве swapinf о дескриптора следующей области подкачки, которая должна быть выбрана для выгрузки страниц. Это поле используется для реализации алгоритма циклического обхода областей подкачки с максимальным приоритетом при поиске свободных слотов.

Спин-блокировка swapiock защищает список от параллельного обращения в многопроцессорных системах.

Поле шах дескриптора области подкачки содержит размер области в страницах, а поле pages содержит количество страничных слотов, которые могут быть использованы. Эти два числа различны, потому что в поле pages не учитываются первый страничный слот и дефектные слоты.

Наконец, переменная nr swap pages содержит количество доступных (свободных и не дефектных) страничных слотов во всех активных областях подкачки, а переменная totai swap pages — суммарное количество не дефектных страничных слотов.

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