Во встроенной системе (ядро Linux 2.6.28 на процессоре ARM с использованием glibc 2.6.1) я запускаю приложение, состоящее из нескольких потоков. Мне бы хотелось, чтобы один из этих потоков получал больше процессорного времени, чем другие.
Один из вариантов установки приоритетов, по-видимому, заключается в использовании pthread
\ _setschedparam
с SCHED
\ _RR
(или SCHED
\ _FIFO
), однако это дает потоку слишком много ЦП (если только он спит, он разъедает весь процессор из других потоков, которые все еще используют SCHED_OTHER
).
Другим вариантом будет установка хорошего уровня потока. Однако, хотя это было бы именно то, что я искал (поток просто получает немного больше ресурсов процессора, но не может голодать другие потоки), я не могу заставить его работать правильно. Согласно man-страницам, «потоки не имеют общего полезного значения», которое я интерпретирую как то, что я могу устанавливать отдельные приятные значения для разных потоков в одном и том же процессе.
Вот мой код:
pid_t tid;
tid = syscall(SYS_gettid);
int ret = setpriority(PRIO_PROCESS, tid, priority);
Однако, похоже, что tid одинаков для всех потоков. Кроме того, установка отдельных уровней nice для потока все равно будет возвращать последний установленный уровень nice во всех потоках при вызове getpriority
. С точки зрения производительности это согласуется (т. Е. Запустить поток A и поток B с одной и той же задачей, затем установить A в -19 и B в 19, и оба будут завершены примерно в одно и то же время).
Тем не менее, если запустить поток A, установить его на -19, а затем запустить B и установить на +19, B будет работать на полную мощность (заканчивая путь впереди A).
Таким образом, кажется, что поток будет использовать хороший уровень, установленный во время работы, и не сможет впоследствии изменить его.
Я погуглил как сумасшедший за дополнительной информацией или каким-либо подтверждением, но все, что я нашел до сих пор, довольно расплывчато. Кто-нибудь здесь имеет какое-либо описание того, как хорошие уровни для потоков обрабатываются в Linux (2.6.28, glibc 2.6.1)? И как я мог изменить хороший уровень уже запущенного потока?