Ответ 1
Функция schedule()
просто вызывает планировщик - не требуется никаких специальных мер для упорядочения того, что вызывающий поток будет заменен другим. Если текущий поток по-прежнему является наивысшим приоритетом в очереди выполнения, он будет снова выбран планировщиком.
Звучит так, как если бы ваш поток ядра делал очень мало работы в своем занятом цикле и вызывал schedule()
каждый раз. Поэтому он, вероятно, не использует много процессорного времени и, следовательно, не имеет своего приоритета. Отрицательные приятные значения несут более тяжелый вес, чем положительные, поэтому разница между -5 и 0 довольно выражена. Комбинация этих двух эффектов означает, что я не слишком удивлен тем, что процессы пользовательского пространства пропускают.
В качестве эксперимента вы можете попробовать называть планировщик каждую N-ю итерацию цикла (вам нужно поэкспериментировать, чтобы найти хорошее значение N для вашей платформы) и посмотреть, лучше ли ситуация - слишком часто называть schedule()
будет просто тратить много процессорного времени в планировщике. Конечно, это просто эксперимент - как вы уже указывали, избегая циклов занятости - это правильный вариант в производственном коде, и если вы хотите убедиться, что ваш поток заменен другим, тогда установите его как TASK_INTERRUPTIBLE
перед вызовом schedule()
удаленный из очереди выполнения (как уже упоминалось в комментариях).
Обратите внимание, что ваше ядро (2.6.18) использует планировщик O (1), который существовал до тех пор, пока в 2.6 не был добавлен Полностью справедливый планировщик.23 (планировщик O (1) был добавлен в 2.6 для замены еще более раннего O (n) планировщик). CFS не использует очереди запуска и работает по-другому, поэтому вы можете увидеть другое поведение - я менее знаком с ним, поэтому я не хотел бы точно предсказать, какие различия вы увидите. Я достаточно убедился, что "совершенно справедливо" - это не тот термин, который я бы использовал на сильно загруженных SMP-системах с большим количеством ядер и процессов, но я также согласен с тем, что писать планировщик очень сложно и это далеко не самое худшее, что я видел, и у меня никогда не было существенной проблемы с ним на 4-8-ядерном настольном компьютере.