
Ядро Linux имеет большой наборпараметрыкоторые позволяют пользователям настраивать поведение ядра без его перекомпиляции. Кажется, нет параметра для настройки модели вытеснения:
-*- Preemption Model
No Forced Preemption (Server) (PREEMPT_NONE)
--> Voluntary Kernel Preemption (Desktop) (PREEMPT_VOLUNTARY)
Preemptible Kernel (Low-Latency Desktop) (PREEMPT)
Почему разработчики ядра не добавили переключатель для выбора между ними?
решение1
Вытеснение реализовано с использованием (большого) количества явных точек вытеснения (ищите might_sleep
в ядре), многие из которых находятся в довольно горячих путях. Полное вытеснение ( CONFIG_PREEMPT
) имеет еще большее влияние; например, спин-блокировки проверяют счетчик вытеснений (по крайней мере, на не-SMP ядрах), как и IRQ.
В настоящее время выбранная модель вытеснения применяется во время компиляции; в результате, без принудительного вытеснения, никакой код вытеснения не выживает в ядре, и вы получаете максимальную пропускную способность. Аналогично, ядро с добровольным вытеснением не имеет никаких проверок вытеснения в IRQ и точках входа ядра. Изменение этого так, чтобы вытеснение можно было изменить во время выполнения, означало бы, что все конфигурации должны были бы проверять настройку вытеснения, по крайней мере, при загрузке, и нести некоторые издержки даже в лучшем случае (например, даже если бы вытеснение было настройкой времени загрузки, а настройка «без вытеснения» могла бы исправить соответствующие места вызовов, вы все равно получили бы ничего не делающий код, занимающий драгоценное место в кэшах кода).