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


Уничтожение процессов из-за нехватки памяти

Несмотря на усилия алгоритма PFRA поддерживать резерв свободных страничных кадров, давление на подсистему виртуальной памяти может стать таким высоким, что вся доступная память будет исчерпана. Эта ситуация быстро повлечет за собой прекращение любой активности в системе: ядро будет пытаться освободить память, чтобы удовлетворить некоторые неотложные запросы, но у него ничего не получится, поскольку области подкачки будут переполнены, а все кэши диска уже будут сокращены. В результате ни один процесс не сможет продолжить выполнение и освободить, в конечном счете, страничные кадры, которые ему принадлежат.

Чтобы справиться с такой драматической ситуацией, алгоритм утилизации страничных кадров прибегает к помощи механизма уничтожения процессов из-за нехватки памяти, который выбирает процесс в системе и уничтожает его, чтобы освободить его страничные кадры. Механизм уничтожения процессов действует, как хирург, ампутирующий конечность, чтобы спасти жизнь человека. Потеря конечности ужасна, но иногда нет иного выбора.
Функция out of memory вызывается функцией aiioc pages о, когда свободной памяти становится очень мало, и алгоритму PFRA не удается утилизировать ни один страничный кадр Функция вызывает функцию seiect bad process , чтобы та выбрала жертву среди существующих процессов, а затем вызывает функцию oom kiii process о, уничтожающую процесс.

Конечно, функция seiect bad process о выбирает процесс не наугад. Он должен обладать определенными характеристиками:
- жертва должна владеть большим количеством страничных кадров, чтобы объем освобождаемой памяти был достаточно велик. (В качестве меры против излишне плодовитых” процессов функция учитывает объем памяти, занимаемой всеми потомками рассматриваемого процесса.);
- уничтожение процесса должно привести к минимальным потерям работы; не стоит уничтожать пакетные процессы, работающие по нескольку часов или дней;
- у жертвы должен быть невысокий статический приоритет, т. к. пользователи обычно назначают низкие приоритеты процессам, не представляющим большой ценности;
- у жертвы не должно быть привилегий пользователя root. Такие процессы обычно выполняют важную работу;
- жертва не должна напрямую обращаться к аппаратным устройствам (пример — сервер X Window), потому что аппаратура может оказаться в непредсказуемом состоянии;
- жертвами не могут быть swapper (процесс 0), init (процесс 1) и ни один другой поток ядра.
Функция seiect bad process о сканирует все процессы в системе и при помощи некоторой эмпирической формулы и перечисленных критериев определяет значение, характеризующее очередной процесс. Функция возвращает дескриптор процесса, наиболее подходящего для уничтожения. Затем функция out of memory вызывает функцию oom kiii process ДЛЯ ПОСЫЛКИ СИГнала на уничтожение потомка процесса или, если это невозможно, самого процесса. Функция oom kiii process о также уничтожает все клоны, которые использует тот же дескриптор памяти, что и выбранная жертва.

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