Хороший уровень для pthreads? - PullRequest
14 голосов
/ 24 мая 2009

Во встроенной системе (ядро 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)? И как я мог изменить хороший уровень уже запущенного потока?

1 Ответ

7 голосов
/ 24 мая 2009

Errm, как только я опубликовал этот вопрос, я внезапно осознал свою ошибку - я установил хороший уровень, вызвав функцию из основного потока, поэтому, конечно, все они имеют одинаковый идентификатор потока (как он выполняется в контексте основная тема). DOH !!!!

При использовании правильного тида все работает нормально.

Теперь, как мне удалить этот вопрос?

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