как снизить приоритет потока в C / C ++ - PullRequest
1 голос
/ 09 июля 2019

Я хочу понизить приоритет потока.

Политика моего потока по умолчанию - SCHED_OTHER, а диапазон приоритетов в моей системе (Ubuntu) - [0,0] (я получаю диапазон на sched_get_priority_min(SCHED_OTHER) и sched_get_priority_max(SCHED_OTHER)), что означает, что все потоки с SCHED_OTHER будет иметь такой же приоритет.

Есть ли какой-нибудь подход к снижению приоритета с SCHED_OTHER? Я долго искал и нашел систему значений nice, но не уверен, что это правильный способ сделать это, так как man page говорит, что хорошим значением является процесс, а не поток Я в замешательстве ...

Может ли кто-нибудь дать правильное решение для этого, и, возможно, с коротким фрагментом кода? Спасибо!

Добавлено:

почему я хочу понизить приоритет потока:

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

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Предполагая, что вы работаете с достаточно свежей версией ядра Linux, вы можете попытаться установить для своего потока значение SCHED_IDLE, как показано на по этой ссылке , т. Е .:

void set_idle_priority() {                                              
   struct sched_param param;
   param.sched_priority = 0;
   if (pthread_setschedparam(pthread_self(), SCHED_IDLE, &m) != 0)
      perror("pthread_setschedparam");
} 

В этом режиме ваш поток будет работать только тогда, когда больше ничего в системе не хочет запускаться.

... тем не менее, я не уверен, что это действительно решит вашу проблему, так как из вашего описания у вас не должно быть этой проблемы, во-первых. В частности, наличие потока переключения процессора, работающего с нормальным приоритетом / приоритетом по умолчанию, не должен значительно замедлять работу вашей системы, поскольку планировщик должен автоматически определять его характер загрузки процессора и неявно удалять его, без каких-либо специальных действий. Это заставляет меня думать, что ваша проблема, вероятно, связана не с использованием процессора потоком, а с чем-то другим, например, может быть, ваш поток использует всю доступную память ОЗУ системы, в результате чего системе приходится перемещать память на диск. Это определенно приведет к значительному замедлению системы. Другой возможностью было бы, если бы ваш поток делал много дискового ввода-вывода (хотя это кажется менее вероятным, так как в этом случае это, вероятно, не будет закреплять ядро ​​процессора).

Вы можете попытаться временно заменить вычисления в вашем потоке тривиальным циклом записи ЦП, например ::11010.

void my_thread_entry_func()
{
   while(1) {/* empty */}
}

... и запустите его, чтобы посмотреть, не вызывает ли оно замедления Если нет, то не само использование ЦП вызывает замедление, а скорее что-то еще, что делает ваш поток, и вы захотите провести дополнительное тестирование, чтобы точно определить, какая часть (части) пути выполнения вашего потока виновники.

1 голос
/ 09 июля 2019

Действительно, ситуация с планированием приоритетов в Linux является огромной путаницей в отношении того, что относится к процессам против потоков. На уровне спецификации nice и setpriority применяются к процессам, но Linux на самом деле не поддерживает это, поэтому вместо этого интерпретирует аргумент как идентификатор потока уровня ядра (не то же самое, что pthread_t, и нет стандартный API пользовательского пространства для запроса уровня ядра потока!).

Вы можете достичь желаемого с помощью SCHED_IDLE или SCHED_BATCH, но они на самом деле тоже не работают.

...