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


Функция cache_reap

Алгоритм утилизации страничных кадров должен также утилизировать страницы, принадлежащие slab-аллокатору При этом он полагается на функцию cache reap , запускаемую периодически (приблизительно раз в две секунды) из стандартной рабочей очереди events Адрес функции cache reapO хранится В ПОЛе func переменной reap_work типа work struct, имеющейся у каждого процессора.
Функция cache reap о выполняет следующие действия:
1. Пытается получить семафор cache_chain_sem, который защищает список дескрипторов slab-кэшей. Если семафор уже занят, функция вызывает функцию schedule_delayed_work, ЧТОбы запланировать СВОЙ Следующий вызов, и завершает работу.
2. В противном случае функция сканирует дескрипторы kmem_cache_t, собранные в списке cache chain. Для каждого найденного дескриптора функция выполняет следующие действия:
• если флаг slab no reap в дескрипторе кэша установлен, значит, утилизация страничных кадров была отключена, и функция переходит к следующему кэшу в списке;
• опустошает локальный slab-кэш Эта операция может привести к освобождению новых участков памяти;
• у каждого кэша есть "время уборки”, хранящееся в поле next reap структуры kmem_list3 внутри Дескриптора КЭШа. Если значение jiffies все еще меньше, чем next reap, функция переходит к следующему кэшу в списке;
• устанавливает следующее время уборки”, записывая в поле next reap значение, на четыре секунды большее, чем текущее время;
• в многопроцессорных системах функция опустошает совместно используемый slab-кэш. Эта операция может привести к освобождению новых участков памяти;
• если в кэш недавно был добавлен новый участок памяти, т. е. если флаг free touched Структуры kmem_list3 внутри дескриптора КЭШа установлен, этот кэш пропускается, и функция переходит к следующему кэшу в списке;
• пользуясь эвристической формулой, вычисляет количество участков памяти, подлежащих освобождению. Это значение зависит от верхнего предела свободных объектов в кэше и от количества объектов, упакованных в один участок памяти;
• многократно вызывает функцию siab destroy о для элементов списка свободных участков памяти кэша, пока список не станет пустым или пока не достигнуто целевое количество свободных участков памяти;
• вызывает функцию cond reschedO для проверки флага TIF_NEED_ RES СНЕ D текущего процесса И ДЛЯ выполнения функции schedule о, если флаг установлен.
3. Освобождает семафор cache_chain_sem.
4. Вызывает функцию scheduie_deiayed_work, чтобы запланировать свой
следующий вызов, и завершает работу.

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

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

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

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

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

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

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

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