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


Функции для работы с кэшем страниц

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

Поиск страницы

Функция find get page принимает в качестве параметра указатель на объект address space и значение смещения. Она получает спин-блокировку адресного пространства И вызывает функцию radix_tree_lookup для поиска листа базисного дерева, имеющего требуемое смещение. Эта функция, в свою очередь, начинает с корня дерева и проходит вниз в соответствии с битами смещения, как было объяснено в предыдущем разделе. Встретив указатель null, функция возвращает null. В противном случае она возвращает адрес узла, т. е. указатель на дескриптор требуемой страницы. Если запрошенная страница найдена, функция find get page увеличивает счетчик обращений, освобождает спин-блокировку и возвращает адрес страницы; в противном случае функция освобождает спин-блокировку и возвращает null.

Функция find get pages аналогична предыдущей, но выполняет поиск группы страниц с индексами, идущими подряд. Она принимает в качестве параметров указатель на объект address space, смещение в адресном пространстве, показывающее начало поиска, максимальное количество искомых страниц и указатель на массив дескрипторов страниц, который функция должна заполнить. При выполнении поиска функция f ind get pages опирается на функцию radix tree gang iookup , которая заполняет массив указателей и возвращает количество найденных страниц. Возвращенные страницы упорядочены по возрастанию индексов, хотя не исключено, что индексы идут не подряд, поскольку некоторых страниц может и не быть в кэше.

Существует ряд других функций, выполняющих поиск в кэше страниц. Например, функция find lock page аналогична функции find_get_page, НО она увеличивает счетчик обращений возвращенной страницы и вызывает функцию lock pageo, чтобы установить флаг PG iocked. Таким образом, когда функция возвратит управление, страница будет доступна только вызвавшему процессу. Функция lock pageo приостанавливает текущий процесс, если страница уже заблокирована. С этой целью она вызывает функцию
wait on bit iock для бита PG iocked. Эта последняя функция переводит текущий процесс в состояние task uninterruptible, сохраняет дескриптор процесса в очереди ожидания, выполняет метод syncpage объекта address space, чтобы откупорить очередь запросов блочного устройства, содержащего файл, и вызывает schedule о, чтобы приостановить процесс, пока у страницы не будет сброшен флаг PG iocked. Чтобы разблокировать страницу и возобновить выполнение процесса, находящегося в очереди ожидания, Ядро ВЫЗЫВаеТ фуНКЦИЮ unlock_page .

Функция find trylock page аналогична функции find_lock_page, НО Она никогда не блокирует процесс. Если запрошенная страница заблокирована, функция возвращает код ошибки. Наконец, функция find or create page вызывает f ind lock 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 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

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

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

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

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

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

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

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