#c #linux #linux-kernel #real-time #sched-deadline
#c #linux #linux-ядро #в режиме реального времени #sched-крайний срок
Вопрос:
Я изучал алгоритмы планирования в реальном времени внутри ядра Linux и увидел, что было много вызовов функций, в которых буквально ничего не было определено:
(в ядре 3.15), например:
rt.c 1392 : dequeue_pushable_task(rq, p);
rt.c 365 : static inline void dequeue_pushable_task(struct rq *rq, struct task_struct *p)
{
}
rt.c 1394 : set_post_schedule(rq);
rt.c 365 : static inline void set_post_schedule(struct rq *rq)
{
}
Они также переопределяются в ifdef, который проверяет SMP. Я просто хотел убедиться, являются ли эти функции специфичными для SMP? или есть какая-либо причина для наличия этих пустых функций.
Ответ №1:
Согласно комментарию в sched / deadline: добавьте структуры данных SCHED_DEADLINE, связанные с SMP, и логику 1baca4ce16b8cc7d4f50be1f7914799af30a2861 commit.
Эти методы предназначены для хранения задач с истекшим сроком выполнения в очередях выполнения, специфичных для ЦП, концепция выдвигаемой или извлекаемой задачи с истекшим сроком выполнения требует, чтобы у них было несколько очередей выполнения ЦП для перемещения и перемещения задач между ними. Если параметр CONFIG_SMP не установлен, существует только одна очередь запуска процессора, и, следовательно, миграция задач не требуется.
Итак, да, реализация функции специфична для SMP, и причина наличия этих пустых функций заключается в том, чтобы код компилировался, но ничего не делал, когда CONFIG_SMP не определен, вместо того, чтобы реализовывать дополнительные проверки ifdef на каждом вызывающем сайте.
Комментарии:
1. разве компилятор не должен выдавать ошибку определения дублирующейся функции?
2. Нет, потому что определенная функция определяется макрокомандой препроцессора ifdef перед компиляцией файла.
3. О, понял, так что это объявление функции с использованием условий if else.