sched_yield замедляет другие темы - PullRequest
1 голос
/ 24 июля 2011

У нас есть код, который использует sched_yield внутри цикла.Когда мы делаем это, мы, кажется, получаем более медленную производительность других потоков, в частности тех, которые связаны с вызовами ядра (такими как IO и мьютекс / обработка событий).Я пытаюсь определить точную причину такого поведения.

Могут ли чрезмерные обращения к sched_yield привести к узкому месту в ядре?

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

1 Ответ

6 голосов
/ 24 июля 2011

Посмотрите справочную страницу sched_yield для Linux:

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

Вызов в узком цикле вызовет проблемы. Уменьшите скорость, с которой вы звоните.

(И убедитесь, что вам нужно сначала позвонить. Планировщик часто сам все делает правильно.)

Другие варианты, которые вы могли бы найти интересными, если у вас поток с низким приоритетом:

  • sched_setscheduler - с SCHED_IDLE или SCHED_BATCH возможно (влияет на весь процесс)
  • thread_setschedparam - на поток, но могут быть ограничения на то, какие политики вы можете использовать (не могу найти его сейчас).

Или старая добрая nice команда конечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...