Удаление страницы
Функция remove f rom page cache удаляет Дескриптор Страницы ИЗ КЭШа
страниц. Она достигает этого следующим образом:
1. Получает спин-блокировку page->mapping->tree_iock и отключает прерывания.
2. Вызывает функцию radix tree deiete , чтобы удалить узел из дерева. Эта функция принимает в качестве параметров адрес корня дерева (page->mapping->page_tree) и индекс страницы, которую надо удалить. Она выполняет следующие действия:
• начиная с корня, совершает обход дерева в соответствии с индексом страницы, пока не достигнет нужного узла, как описано в предыдущем разделе. При этом она строит массив структур radix tree path, описывающих элементы пути от корня до листа, соответствующего удаляемой странице;
• в цикле перебирает узлы, собранные в массиве элементов пути, начиная с последнего узла, содержащего указатель на дескриптор страницы. У каждого узла эта функция записывает null в элемент массива слотов, указывающий на следующий узел (или на дескриптор страницы), и уменьшает значение поля count. Если это значение дошло до нуля, функция удаляет узел из дерева и возвращает структуру radix_tree_ node в кэш slab-аллокатора. Затем, на следующем шаге цикла, переходит к предыдущему узлу в массиве элементов пути. В противном случае, если поле count не равно нулю, функция сразу же переходит к следующему шагу цикла;
• возвращает указатель на дескриптор страницы, который был удален из дерева.
3. Устанавливает поле page->mapping в значение null.
4. Уменьшает на единицу счетчик кэшированных страниц page->mapping-> nrpages.
5. Освобождает спин-блокировку page->mapping->tree_iock, включает прерывания и завершает работу.
Обновление страницы
Функция read cache page обеспечивает хранение в кэше самой последней
версии заданной страницы. Ее параметрами являются:
- mapping — указатель на объект address_space;
- index — смещение, задающее нужную страницу;
- filler — указатель на функцию, которая читает данные этой страницы с диска (как правило, это функция, реализующая метод readpage адресного пространства);
- data — указатель, передаваемый функции filler (обычно равный null). Далее идет упрощенное описание действий этой функции:
1. Вызывает функцию find_get_page для проверки наличия страницы в кэше.
2. Если страницы нет в кэше, функция выполняет следующие дополнительные действия:
• вызывает aiioc pages , чтобы выделить новый страничный кадр;
• вызывает add to page cache , чтобы занести дескриптор страницы в кэш;
• вызывает функцию iru cache addo, чтобы вставить страницу в неактивный список давно неиспользуемых страниц этой зоны 3. На этом шаге страница присутствует в кэше. Функция вызывает mark page accessed , чтобы отметить факт обращения к странице.
4. Если страница устарела (флаг PG uptodate сброшен), функция вызывает функцию filler для чтения страницы с диска.
5. Возвращает адрес дескриптора страницы.
Предыдущая страница | 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 | Следующая страница