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


Утилизация страниц из кэша индексных дескрипторов

Функция shrink icache memory вызывается для удаления неиспользуемых объектов индексный дескриптор” из кэша индексных дескрипторов. Здесь термин неиспользуемый” означает, что у индексного дескриптора больше нет контролирующего объекта элемент каталога”. Эта функция аналогична функции shrink dcache memory , описанной ранее. Она проверяет бит
GFP FS В параметре gfp mask, затем вызывает функцию prune_icache и,
наконец, возвращает значение, зависящее от количества неиспользуемых ин
дексных дескрипторов, оставшихся в кэше, и от значения переменной
syscti vfs cache pressure, как было описано ранее.

Что касается функции prune_icache , она сканирует СПИСОК inode_unused Чтобы освободить индексный дескриптор, функция освобождает любой закрытый буфер, ассоциированный с индексным дескриптором, делает недействительными чистые страничные кадры в кэше страниц, ссылающиеся на индексный дескриптор и более не используемые, а затем вызывает функции clear_inode И destroy_inode для уничтожения индексного дескриптора.

Периодическая утилизация

Алгоритм PFRA выполняет периодическую утилизацию, применяя два различных механизма: потоки ядра kswapd, которые вызывают функции
shrink zone И shrink slab , Чтобы утилизировать СТраНИЦЫ ИЗ СПИСКОВ LRU, и функцию cache reap , которая вызывается периодически для утилизации неиспользуемых участков памяти slab-аллокатора.

Потоки ядра kswapd

Потоки ядра kswapd являются еще одним механизмом ядра, который активизирует утилизацию страничных кадров. Зачем он нужен? Разве недостаточно вызвать функцию trytof reepages , когда возникнет реальная нехватка свободной памяти, и будет выдан очередной запрос на ее выделение?
К сожалению, все не так просто. Некоторые запросы на выделение памяти делаются обработчиками прерываний и исключений, которые не могут заблокировать текущий процесс в ожидании, пока не освободится какой- нибудь страничный кадр. Более того, иногда запросы на выделение памяти выдаются управляющими трактами ядра, которые уже получили монопольный доступ к критическим ресурсам и, следовательно, не могут активизировать операции ввода/вывода. В нечастой ситуации, когда все запросы на выделение памяти исходят от подобных частей ядра, оно никогда не будет в состоянии освободить недостающую память.

Потоки ядра kswapd благоприятно влияют на производительность системы, потому что освобождают память в те интервалы времени, когда компьютер все равно простаивал бы. Таким образом, процессы получают свои страницы гораздо быстрее.

Существует отдельный поток ядра kswapd для каждого узла памяти Каждый такой поток обычно спит” в очереди ожидания, голова которой находится в поле kswapd wait дескриптора узла. Однако если функция aiioc pages о обнаружит, что во всех зонах, подходящих для выделения
памяти, количество свободных страничных кадров ниже некоторого "предупреждающего" порога (значение которого зависит от значений полей pages iow и protection дескриптора зоны памяти), то она активизирует потоки ядра kswapd соответствующих узлов памяти. Ядро приступит к утилизации некоторых страничных кадров, чтобы избежать гораздо более опасной ситуации дефицита памяти.
Как было сказано в главе S, каждый дескриптор зоны имеет поле pages min, минимальное количество свободных страничных кадров, которое всегда должно быть наготове, и поле pages high, "безопасное" количество свободных страничных кадров, после достижения которого утилизацию страниц следует прекратить.

Поток ядра kswapd вызывает функцию kswapd . Она инициализирует поток ядра, связывая его с центральными процессорами, которые могут обратиться К узлу памяти. Для ЭТОГО функция сохраняет В поле current->reclaim_state дескриптора процесса адрес дескриптора и устанавливает флаги pf memalloc и pf kswap в поле current->flags (эти флаги показывают, что процесс утилизирует память и что ему разрешено использовать всю доступную память для его работы). Каждый раз, когда поток ядра kswapd активизируется, функция kswapd выполняет следующие действия:
1. Вызывает функцию finish wait , чтобы убрать поток ядра из очереди
kswapd wait данного узла
2. Вызывает функцию baiance pgdatо, чтобы выполнить утилизацию памяти в узле потока kswapd.
3. Вызывает функцию prepare to wait , чтобы перевести процесс в состояние TASK_INTERRUPTIBLE И ПОМеСТИТЬ еГО В очередь kswapd_wait данного узла.
4. Вызывает функцию schedule о, чтобы предоставить центральный процессор другим выполняемым процессам.
Вызванная функция baiance pgdat о выполняет следующие основные действия:
1. Устанавливает поля дескриптора scan controi
2. Записывает в поле temp priority каждого дескриптора зоны в узле памяти число 12 (наименьший приоритет).
3. Выполняет цикл максимум из 13 итераций, от значения приоритета 12 до нуля, и при каждой итерации делает следующее:
• сканирует зоны памяти, чтобы найти самую верхнюю зону (от zone dma до zone highmem), в которой недостаточно свободных страничных кад
ров. Каждая проверка выполняется с помощью функции zone_ watermark ok , описанной в главе 8. Если все зоны содержат большое количество свободных страничных кадров, функция переходит к шагу 4;
• снова сканирует зоны памяти, от зоны zone dma до зоны, найденной на предыдущем шаге. Для каждой зоны функция обновляет, если это необходимо, поле prev priority дескриптора зоны, записывая туда текущий приоритет, и последовательно вызывает функцию shrink zone о, чтобы утилизировать страницы зоны Затем функция вызывает функцию shrink siabo, чтобы утилизировать страницы из сокращаемых кэшей (см. разд. "Утилизация страниц сокращаемых кэшей диска"ранее в этой главе)\
• если утилизировано хотя бы 32 страницы, функция прерывает цикл и переходит к шагу 4.
4. Записывает в поле prev priority каждого дескриптора зоны значение, хранящееся в соответствующем поле temp priority.
5. Если остались еще зоны с дефицитом памяти, функция вызывает функцию schedule о при условии, что флаг tif need resched процесса установлен. При возобновлении выполнения функция переходит к шагу 1.

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