Планирование процессов Linux в режиме ядра

Вот описание, процитированное из Wiki

Ядро Linux обеспечивает упреждающее планирование при определенных условиях. До версии ядра 2.4 вытесняющими были только процессы, то есть помимо истечения кванта времени выполнение текущего процесса в пользовательском режиме прерывалось, если процессы с более высоким динамическим приоритетом переходили в состояние TASK_RUNNING. В Linux 2.6 была добавлена ​​возможность прерывания задачи, выполняющей код ядра, хотя при этом не все разделы кода ядра могут быть вытеснены.

Тогда он также говорит это:

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

Верно ли приведенное выше утверждение для текущего ядра Linux о том, что приоритетное отключение ядра является условным? например если процесс попадает в режим ядра из-за выполнения системного вызова, этот процесс не будет находиться в режиме упреждающего планирования?

Где я могу найти последние вводные статьи / книги о планировании Linux как в пользовательском режиме, так и в режиме ядра?


person wei    schedule 06.12.2012    source источник


Ответы (2)


Решения о планировании ЦП могут иметь место, когда процесс:

1. Switches from running to waiting state (e.g. I/O request)
2. Switches from running to ready state (e.g. Interrupt)
3. Switches from waiting to ready (e.g. I/O completion)
4. Terminates

Планирование под номерами 1 и 4 не является вытесняющим, а все остальное планирование является упреждающим, поэтому необходимо учитывать возможность того, что операции (системные вызовы) могут быть незавершенными.

Да, Linux обеспечивает упреждающее планирование при определенных условиях, в отличие от некоторых вариантов Unix, где ядро ​​планирует до завершения без прерывания. В Linux 2.6 ядро ​​было сделано для вытеснения задачи, выполняющейся до тех пор, пока она не удерживает блокировку и безопасна для перепланирования.

Older versions of the kernel had a so-called big kernel lock for synchronization 
across the entire kernel.

относится к каждому потоку уровня пользователя, отображаемому только в один поток ядра.

person Sunil Bojanapally    schedule 06.12.2012

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

Однако ядро ​​Linux делает все возможное, чтобы минимизировать эти условия, чтобы вытеснение происходило как можно быстрее.

Обратите внимание, что это приоритетное прерывание в ядре компилируется в ядро ​​только тогда, когда для параметра компиляции CONFIG_PREEMPT установлено значение yes. Существует также CONFIG_PREEMPT_VOLUNTARY, который выполняет переключение задач только тогда, когда ядро ​​явно проверяет это.

Вытеснение ядра требует определенных затрат. Чтобы быстро переключаться между задачами, вместо фактической работы нужно выполнять много бесполезной работы по дому. Это замедляет работу всей системы и снижает объем выполняемой работы. Вот почему существуют эти варианты компиляции. Ядро Linux, созданное для базы данных или веб-сервера, вообще не должно использовать приоритетное прерывание. Ядро, созданное для HPC, иногда модифицируется, чтобы переключать задачи только раз в секунду или реже.

Все это меняется для задач в реальном времени. Эти задачи зависят от быстрого реагирования в надежные сроки. Ядро Linux по умолчанию неплохо справляется с этим, но есть набор патчей, называемый «-rt patches», который делает его действительно хорошим. Набор исправлений выполняет всевозможные вещи, такие как приоритезация обработчиков прерываний и изменение блокировок ядра, чтобы блокировки можно было сбросить и перезапустить позже.

person Zan Lynx    schedule 06.12.2012