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


Вытеснение процессов

Процессы в Linux являются вытесняемыми. Когда процесс переходит в состояние task_running, ядро проверяет, превышает ли его динамический приоритет приоритет текущего процесса. Если это так, выполнение текущего процесса прерывается, и вызывается планировщик, который выбирает другой процесс для выполнения (как правило, выбирается процесс, только что ставший выполняемым). Конечно, процесс также может быть вытеснен, когда истечет его квант времени. Когда это происходит, устанавливается флаг tif need resched в структуре thread info текущего процесса, а планировщик вызывается по окончании работы обработчика прерываний.

Рассмотрим в качестве примера сценарий, в котором участвуют только две программы: текстовый редактор и компилятор. Редактор является интерактивной программой и поэтому имеет динамический приоритет выше, чем у компилятора. Тем не менее он часто приостанавливается, потому что пользователь делает паузы на размышление во время ввода данных. Кроме того, средний интервал времени между двумя нажатиями на клавиши достаточно велик. Однако как только пользователь нажимает на клавишу, возникает прерывание, и ядро "будит" процесс текстового редактора. Ядро определяет, что динамический приоритет редактора выше, чем у процесса current, выполняемого в данный момент (компилятора). Поэтому оно устанавливает флаг tif need resched у этого процесса, тем самым заставляя планировщик включиться после того, как ядро закончит обработку прерывания. Планировщик выбирает редактор и выполняет переключение процессов. В результате выполнение редактора возобновляется очень быстро, и символ, введенный пользователем, отображается на экране. Обработав символ, процесс текстового редактора сам себя переводит в состояние ожидания следующего нажатия на клавишу, и компилятор может возобновить свою работу.

Необходимо отдавать себе отчет, что вытесненный процесс не приостанавливается, потому что остается в состоянии task running; просто он не использует процессор. Кроме того, вспомним, что ядро Linux является вытесняемым. Это означает, что процесс может быть вытеснен, когда он выполняется в режиме ядра или в режиме пользователя.

Сколько должен длиться квант времени?

Продолжительность кванта времени исключительно важна для производительности системы: она не должна быть ни слишком большой, ни слишком малой.
Если средняя продолжительность кванта очень мала, накладные расходы, вызванные переключениями процессов, становятся непомерно высокими. Например, предположим, что переключение между процессами занимает 5 мс. Если квант тоже равен 5 мс, то как минимум половина циклов процессора уйдет на переключение процессов.

Если же средняя продолжительность кванта очень велика, исчезнет впечатление, что процессы выполняются параллельно. Например, предположим, что квант равен пяти секундам. Каждый выполняемый процесс будет работать около пяти секунд, а затем останавливаться на достаточно долгое время (как правило, равное пяти секундам, помноженным на количество выполняемых процессов).

Часто высказывается мнение, что большая продолжительность кванта ухудшает время отклика интерактивных приложений. Обычно это не соответствует действительности. Как было показано ранее в разд. "Вытеснение процессов”, интерактивные процессы имеют относительно высокий приоритет, и они быстро вытесняют пакетные процессы независимо от продолжительности кванта.

Однако в некоторых случаях слишком длинный квант ухудшает время отклика системы. Предположим, например, что два пользователя одновременно
вводят две команды в своих оболочках, причем одна команда запускает процесс, привязанный к процессору, а другая — интерактивное приложение. Обе оболочки ответвляют новые процессы и делегируют им выполнение пользовательских команд. Кроме того, предположим, что эти новые процессы имеют одинаковые начальные приоритеты (Linux заранее не знает, является ли программа пакетной или интерактивной). Теперь, если планировщик выберет процесс, привязанный к процессору, для выполнения в первую очередь, то другой процесс, возможно, будет ждать целый квант времени прежде, чем начнет выполняться. Если квант достаточно велик, пользователю, запустившему интерактивное приложение, система покажется слишком медлительной.
Выбор средней продолжительности кванта всегда является компромиссом. Правило, принятое в Linux, состоит в том, чтобы выбирать максимально большую продолжительность, стремясь поддерживать удовлетворительное время отклика.

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




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

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

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

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

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

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

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

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