Что такое preemption / что такое preemtible ядро? Для чего он нужен?

объяснил своими словами, Что такое preemption и что это значит для ядра (linux)?

каковы преимущества и недостатки наличия упреждающего ядра?

5 ответов


упреждающая многозадачность-запуск нескольких процессов / потоков на одном процессоре, создавая иллюзию, что они работают одновременно, когда на самом деле каждому выделяются небольшие мультиплексированные временные срезы для запуска. Процесс "упреждается", когда он запланирован вне выполнения и ждет следующего выполнения среза времени.

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

основным преимуществом упреждающего ядра является то, что sys-вызовы не блокируют всю систему. Если системный вызов занимает много времени, это не значит, что ядро не может сделать ничего другого за это время. Основным недостатком является то, что это усложняет код ядра, вынуждая обрабатывать больше конечных случаев, выполнять более мелкозернистую блокировку или использовать структуры и алгоритмы без блокировки.


вы действительно должны использовать термин "упреждающий".- Есть разные виды упреждений. По сути, это очень просто, и вы, вероятно, понимаете это под другим именем. Упреждающая операционная система может переключать контексты между потоками пользовательского режима без какого-либо специального программирования в предваряемом приложении. Это позволяет выполнять многозадачность. ОС может переключаться и обратно в процесс, и это переключение по существу trasnparent. Существует также такая вещь, как preemptive kernel, которая позволяет потоки режима ядра должны быть вытеснены (большинство операционных систем не позволяют этого, но это необходимо для некоторых приложений, таких как в системах реального времени). Заметьте, это очень упрощенное объяснение.


другие адекватно объяснили, что такое упреждающее ядро.

для чего он хорош?

в основном преимущества:

  • более низкая латентность на системах без SMP-обычно используется в системах реального времени или для других вещей, где латентность важна (аудио, видео приложения, возможно)
  • обучение разработчиков ядра, у которых нет SMP-систем, как писать правильный код для SMP

с непустым ядром, на одном процессорная система разработчики ядра могут быть ленивыми и уйти без блокировки большую часть времени - конечно, это большой сбой на SMP. Операционных систем ядра позволяют им получить эту боль, не более ядер.


Preemption означает, что ОС поддерживает несколько задач (отдельный, автономный фрагмент кода) и будет переключаться между задачами по расписанию. Когда задача прерывается, она называется "упреждение". Современные ОС поддерживают это - но это не требуется для простых встроенных систем, например. Накладные расходы на поддержку переключения задач не всегда стоит.


Я думаю, что это в должности объясняет ваши вопросы:

Что такое preemption?

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

Что такое ядро preemption?

в Linux пользовательские космические программы всегда были упреждающими : ядро прерывает программы пользовательского пространства для переключения на другие потоки, используя обычный такт. Таким образом, ядро не ждет, пока программы пользовательского пространства явно выпустят процессор (что имеет место в случае совместной многозадачности). Это означает, что бесконечный цикл в пользовательской космической программе не может блокировать систему.

однако до 2.6 ядер само ядро не было preemtible: как только один поток вошел в ядро, он не мог быть preempted для выполнения другого нитка. Процессор может использоваться для выполнения другого потока при завершении syscall или когда текущий поток явно попросил планировщик запустить другой поток с помощью функции schedule (). Это означает, что бесконечный цикл в коде ядра заблокировал всю систему, но на самом деле это не проблема : код ядра разработан так, чтобы не было бесконечных циклов.

упреждение ядра было введено в ядрах 2.6, и можно включить или отключить его с помощью Параметр CONFIG_PREEMPT. Если CONFIG_PREEMPT включен, то код ядра может быть заменен везде, кроме случаев, когда код отключил локальные прерывания. Бесконечный цикл в коде больше не может блокировать всю систему. Если CONFIG_PREEMPT отключен, то поведение 2.4 восстанавливается.

плюсы и минусы?

плюсы: ядро preemption может улучшить латентность и масштабируемость, и оно может сделать задачу с высоким приоритетом и ответить своевременно.

минусы: это затрудняет написание кода в ядре preemption, особенно в SMP, и вы должны учитывать многие факторы.