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


Функция scan_swap_map

Функция scan swap mapO применяется для поиска свободного страничного слота в данной области подкачки. Она принимает один параметр, который указывает на дескриптор области подкачки, а возвращает индекс свободного страничного слота. Если область подкачки не содержит свободных страничных слотов, возвращается 0. Функция выполняет следующие действия:
1. Вначале пытается воспользоваться текущим кластером. Если значение поля ciuster nr дескриптора области подкачки положительно, функция перебирает элементы массива счетчиков swap map, начиная с элемента с индексом ciuster next, и ищет нулевой счетчик. Если функция его находит, она уменьшает значение в поле ciuster nr и переходит к шагу 4.
2. Если функция на этом шаге, значит, либо поле ciuster nr содержит ноль, либо поиск, начавшийся с индекса ciuster next в массиве swap map, не дал нулевой элемент. Нужно переходить ко второму этапу гибридного поиска. Функция инициализирует поле ciuster nr значением swapfile cluster и возобновляет перебор элементов массива, начиная с индекса lowest bit, пытаясь найти группу из swapfile cluster свободных страничных слотов. Если такую группу найти удается, функция переходит к шагу 4.
3. Группы из swapfile cluster свободных страничных слотов не существует. Функция возобновляет перебор элементов массива, начиная с индекса lowest bit, пытаясь найти один свободный страничный слот. Если ей это не удается, она записывает в поле lowest bit максимальный индекс в массиве, а в поле highest bit — ноль, после чего возвращает 0 (область подкачки заполнена).
4. Элемент с нулевым значением найден. Функция записывает в него единицу, уменьшает значение nr swap pages, обновляет поля lowest bit и highest bit, еСЛИ необходимо, увеличивает на единицу поле inuse_pages и записывает в поле ciuster next индекс только что выделенного страничного слота плюс 1.
5. Возвращает индекс выделенного страничного слота.

Функция get_swap_page

Функция get swap page применяется для поиска свободного страничного слота путем просмотра всех активных областей подкачки. Она возвращает идентификатор выгруженной страницы в выделенном страничном слоте, либо ноль, если все области подкачки заполнены. При этом функция учитывает различные приоритеты активных областей подкачки.

Функция выполняет два прохода, чтобы минимизировать время работы, когда найти страничный слот легко. Первый проход является неполным и затрагивает только области с одинаковым приоритетом: функция просматривает их по кругу в поисках свободного слота. Если свободного страничного слота не оказывается, функция выполняет второй проход, начав с начала списка областей подкачки. На этом проходе проверяются все области. Говоря более конкретно, функция выполняет следующие действия:
1. Если поле nr swap pages содержит ноль, или активных областей подкачки нет, функция возвращает 0.
2. Начинает с просмотра области подкачки, на которую указывает swap iist.next (вспомним, что список областей подкачки отсортирован по убыванию приоритетов).
3. Если данная область подкачки активна, функция вызывает функцию scan swap mapO для выделения свободного страничного слота. Если функция scan swap map возвращает индекс страничного слота, то, в принципе, все сделано. Однако описываемая функция должна еще подготовиться к своему следующему вызову. Поэтому она обновляет swap iist.next так, чтобы оно указывало на следующую область в списке областей подкачки, если последняя имеет тот же приоритет (тем самым продолжается циклическое использование этих областей подкачки). Если же следующая область подкачки имеет не тот приоритет, что данная, то функция записывает в swap iist.next указатель на первую область в списке (чтобы следующий поиск начался с областей подкачки, имеющих наивысший приоритет). Функция заканчивает работу, возвращая идентификатор выгруженной области в соответствии с только что выделенным страничным слотом.
4. Либо запись в область подкачки запрещена, либо в ней нет свободных страничных слотов. Если следующая область в списке областей подкачки имеет тот же приоритет, что и текущая, функция делает ее текущей и переходит к шагу 3.
5. На этом шаге следующая область в списке областей подкачки имеет приоритет, меньший, чем у предыдущей. Дальнейшие действия функции зависят от того, какой из двух проходов она выполняет.
• если это первый (неполный) проход, функция рассматривает первую область подкачки в списке и переходит к шагу 3, тем самым начиная второй проход;
• в противном случае она проверяет наличие следующего элемента в списке. Если таковой имеется, она рассматривает его и переходит к шагу 3.
6. К этому шагу список полностью просмотрен на втором проходе, и свободные страничные слоты найдены не были. Функция возвращает 0.

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