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


Служебная процедура sys_swapoff

Служебная процедура sys swapoff делает не активной область подкачки, идентифицируемую параметром speciaifiie. Она гораздо сложнее и требует больше времени, чем служебная процедура sys swapono, потому что раздел, переводимый в неактивное состояние, может содержать страницы, принадлежащие нескольким процессам. Функции приходится сканировать область подкачки и загружать в память все имеющиеся страницы. Поскольку каждая загрузка требует выделения нового страничного кадра, вся операция может закончиться неудачей, если свободных страничных кадров не окажется.

В таком случае функция возвращает код ошибки. Для достижения своих целей функция выполняет следующие действия:
1. Проверяет, есть ли у текущего процесса возможность cap sys admin.
2. Копирует строку, на которую указывает параметр speciaif iie, в пространство ядра.
3. Вызывает функцию fiip openo, чтобы открыть файл, на который ссылается параметр speciaifiie. Как обычно, эта функция возвращает адрес файлового объекта.
4. Сканирует список swap iist дескриптора области подкачки и сравнивает адрес файлового объекта, возвращенного функцией fiip openo, с адресами в полях swap fiie дескрипторов активных областей подкачки. Если совпадение не обнаружено, значит, функции был передан некорректный параметр, и она возвращает код ошибки.
5. Вызывает функцию cap_vm_enough_memory о для проверки, достаточно ли имеется свободных страничных кадров, чтобы загрузить все страницы, хранящиеся в области подкачки. Если их недостаточно, область подкачки не может быть переведена в неактивное состояние. Функция освобождает файловый объект и возвращает код ошибки. Это лишь приблизительная оценка, но она избавляет ядро от выполнения бесполезных операций с ДИСКОМ. При выполнении ЭТОЙ проверки функция cap_vm_enough_memoryучитывает страничные кадры, выделенные через slab-кэши, у которых флаг slab reclaim account установлен Количество таких страниц, считающихся утилизируемыми, хранится в переменной slab_reclaim_pages.
6. Удаляет дескриптор области подкачки из списка swap iist.
7. Обновляет переменные nr swap pages и totai swap pages, вычитая значение поля pages дескриптора области подкачки.
8. Сбрасывает флаг swp writeok в поле flags дескриптора области подкачки, тем самым запрещая алгоритму утилизации страничных кадров дальнейшую выгрузку страниц в эту область.
9. Вызывает функцию try_to_unuse, чтобы принудительно загрузить в оперативную память все страницы, оставшиеся в области подкачки и соответствующим образом обновить Таблицы Страниц процессов, обращающихся к этим страницам. Во время выполнения этой функции у текущего процесса, выдавшего команду swapoff, установлен флаг pf swapoff. Установка этого флага может иметь лишь один результат: в случае острой нехватки памяти функция seiect bad process о неизбежно выберет и уничтожит этот процесс!
10. Ждет, пока драйвер блочного устройства, которое содержит область подкачки, не будет откупорен Таким образом, запросы на чтение, выданные функцией try_to_unuse(), будут обработаны драйвером до перевода области подкачки в неактивное состояние.
11. Если функции try_to_unuse не удастся выделить все запрошенные страничные кадры, область подкачки нельзя будет перевести в неактивное состояние. Тогда описываемая функция выполнит следующие действия:
• вернет дескриптор области подкачки в список swap iist и установит его поле flags в значение swp_writeok;
• восстановит оригинальные значения переменных nr swap pages и totai swap pages, прибавив к ним значение поля pages дескриптора области подкачки;
• вызывает функцию fiip cioseO, чтобы закрыть файл, открытый на шаге 3 и возвращает код ошибки.
12. В противном случае содержимое всех использованных страничных слотов было успешно перенесено в оперативную память. Функция выполняет следующие действия:
• освобождает области памяти, использованные для хранения массива swap map и дескрипторов интервалов подкачки;
• если область подкачки находится в разделе диска, функция восстанавливает оригинальное значение размера блока, которое было сохранено в поле oid biock size дескриптора области подкачки. Кроме того, функция вызывает функцию bd re lease , чтобы подсистема подкачки больше не являлась держателем блочного устройства;
• если область подкачки находится в обычном файле, функция сбрасывает флаг s swapfile в индексном дескрипторе файла;
• дважды вызывает функцию fiip ciose о. Первый раз для файлового объекта swap f Не, а второй — для объекта, возвращенного функцией
f iip_open на шаге 3;
• возвращает 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 без проблем

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

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

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

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

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

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

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