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