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


Функция read_swap_cache_async

Функция read swap cache async вызывается, когда ядро должно загрузить
выгруженную страницу. Она принимает три параметра:
- entry — идентификатор выгруженной страницы;
- vma — указатель на область памяти, которая должна содержать страницу;
- addr — линейный адрес страницы.

Как мы знаем, перед обращением к области подкачки функция должна проверить, находится ли требуемый страничный кадр в кэше подкачки. Поэтому
она выполняет следующие действия:
1. Вызывает функцию radix tree iookupO, чтобы найти в базисном дереве объекта swapper space страничный кадр в позиции, заданной идентификатором выгруженной страницы entry. Если страница найдена, функция увеличивает ее счетчик ссылок и возвращает адрес ее дескриптора.
2. Страница отсутствует в кэше подкачки. Тогда функция вызывает функцию aiioc pages , чтобы выделить новый страничный кадр. Если свободных страничных кадров нет, функция возвращает 0 (свидетельствуя о дефиците памяти в системе).
3. Вызывает функцию add to swap cache , чтобы занести дескриптор нового страничного кадра в кэш подкачки. Как было сказано ранее в разд. "Вспомогательные функции кэша подкачки", эта функция тоже блокирует страницу.
4. Предыдущий шаг мог закончиться неудачно, если функция add_to_swap_ cache о нашла дубликат страницы в кэше подкачки. Например, процесс мог быть блокирован на шаге 2, что позволило другому процессу запустить операцию загрузки для того же страничного слота. В таком случае функция освобождает страничный кадр, выделенный на шаге 2, и возобновляет работу с шага 1.
5. Вызывает функцию iru_cache_add_active, чтобы занести страницу в активный список LRU
6. Дескриптор нового страничного кадра находится в кэше подкачки. Функция вызывает функцию swap readpage , чтобы прочитать содержимое
страницы из области подкачки. Вызванная функция аналогична функции swap writepage , описанной в разд. "Выгрузка страниц”ранее в этой главе. Она сбрасывает флаг PG uptodate дескриптора страницы, вызывает функцию get swap bio , чтобы выделить и проинициализировать дескриптор bio для операции ввода/вывода, и вызывает функцию submit bio , чтобы передать запрос на ввод/вывод слою работы с блочными устройствами.
7. Возвращает адрес дескриптора страницы.

Предыдущая страница | 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 без проблем

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга для вас. А так как к книге прилагается компакт- диск с готовой к работе операционной системой Knoppix Live CD, то лишь достаточно вставить его в привод и перегрузить компьютер,...

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

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

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

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно неуклюже: получив системный вызов fork о, ядро в буквальном смысле дублировало все адресное пространство родителя и присваивало копию процессу-потомку. Такая операция...

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

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