Почему модель вытеснения Linux нельзя изменить с помощью параметра ядра?

Почему модель вытеснения Linux нельзя изменить с помощью параметра ядра?

Ядро 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 и точках входа ядра. Изменение этого так, чтобы вытеснение можно было изменить во время выполнения, означало бы, что все конфигурации должны были бы проверять настройку вытеснения, по крайней мере, при загрузке, и нести некоторые издержки даже в лучшем случае (например, даже если бы вытеснение было настройкой времени загрузки, а настройка «без вытеснения» могла бы исправить соответствующие места вызовов, вы все равно получили бы ничего не делающий код, занимающий драгоценное место в кэшах кода).

Связанный контент