Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: weiОтветов: 2

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

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

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

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

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

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

linuxscheduling

Ответы

Ответ 1 · рейтинг 3 · Sunil Bojanapally

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

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.

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

Ответ 2 · рейтинг 4 · Zan Lynx

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

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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы