Идентификатор выгруженной страницы
Выгруженная страница естественным и уникальным образом идентифицируется с помощью индекса области подкачки в массиве swap info и индекса страничного слота внутри области подкачки. Поскольку первая (с индексом 0) страница области подкачки зарезервирована для объединения swap header, описанного ранее, индекс первой полезной страницы равен 1. Функция swp entry(type,offset) строит идентификатор выгруженной страницы по индексу области подкачки type и индексу страничного слота offset. В противоположность ей, функции swp type и swp offset извлекают из идентификатора выгруженной страницы индекс области подкачки и индекс страничного слота соответственно.
Когда страница выгружается на диск, ее идентификатор заносится в Таблицу Страниц, чтобы страницу можно было найти, когда потребуется. Обратите внимание, что младший бит такого идентификатора, соответствующий флагу Present, всегда сброшен, чтобы отметить тот факт, что страница не находится в оперативной памяти. Тем не менее, хотя бы один из остальных 31 битов должен быть равен единице, поскольку нет страниц, хранящихся в слоте номер 0 области подкачки номер 0. Следовательно, можно идентифицировать три разные ситуации на основании значения записи в Таблице Страниц:
- Запись содержит null — страница не принадлежит адресному пространству процесса, либо соответствующий страничный кадр еще не был назначен процессу (выделение страниц по требованию).
- Не все из старших 31 битов равны нулю, а младший бит равен нулю — страница выгружена.
- Младший бит равен 1 — страница находится в оперативной памяти.
Максимальный размер области подкачки определяется количеством битов, доступных для идентификации слота. В архитектуре 80x86 двадцать четыре бита позволяют области подкачки иметь размер до 224 слотов (64 Гбайт).
Поскольку страница может принадлежать адресным пространствам нескольких процессов, она может быть выгружена из адресного пространства одного процесса, но оставаться в оперативной памяти. Следовательно, имеется возможность выгрузить одну страницу несколько раз. Конечно, страница физически выгружается и сохраняется на диске только один раз, но каждая последующая попытка выгрузить ее увеличивает счетчик swap map.
Функция swap dupiicateo обычно вызывается при попытке выгрузить уже выгруженную страницу. Она просто проверяет корректность идентификатора выгруженной страницы, переданного ей в качестве параметра, и увеличивает соответствующий счетчик swap map. Более подробно она выполняет следующие действия:
1. Вызывает функции swp type и swp offset, чтобы извлечь из аргумента номер области подкачки и индекс страничного слота.
2. Проверяет, активна ли идентифицированная область. Если нет, возвращает 0 (недопустимый идентификатор).
3. Проверяет допустимость страничного слота, и свободен ли он (счетчик swap map должен быть больше 0 и меньше swap map bad). Если нет, возвращает 0 (недопустимый идентификатор).
4. Если функция на этом шаге, значит, идентификатор выгруженной страницы определяет допустимую страницу. Функция увеличивает счетчик swap map страничного слота, если он еще не достиг значения swap map max.
5. Возвращает 1 (корректный идентификатор).
Перевод области подкачки в активное и неактивное состояние
После инициализации области подкачки суперпользователь (или, точнее, любой пользователь с cap sys admin; см. разд. "Права и возможности процесса" главы 20) может запускать программы swapon и swapoff, чтобы активизировать область подкачки или перевести ее в неактивное состояние, соответственно. Эти программы пользуются системными вызовами swapon о и swapoff , и мы кратко опишем их служебные процедуры.
Предыдущая страница | 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 | Следующая страница