Хорошая стоимость или доля процессора?
Обратите внимание, что в настоящее время приятные значения могут быть не столь уместны для всей системы из-за автоматической группировки задач, особенно при использовании systemd . Пожалуйста, смотрите этот ответ для более подробной информации.
Разница между потоками и процессами
Важный вопрос по Linux, поскольку документация увековечивает сомнения (например, о потоках, не имеющих собственного PID).
Примечание: этот ответ объясняет потоки Linux точно.
Короче говоря: ядро обрабатывает только «выполняемые объекты», то есть то, что может быть запущено и запланировано . По сути, эти объекты называются процессами. Поток - это всего лишь процесс, который разделяет (по крайней мере) пространство памяти и обработчики сигналов с другим.
Каждый такой процесс имеет общесистемный уникальный идентификатор: PID (идентификатор процесса). Для так называемых потоков это иногда называется TID (Thread ID), но с точки зрения системного администратора (и ядра!) TID и PID - это одно и то же (они используют одно и то же пространство имен).
В результате вы можете renice
каждый «поток» индивидуально, потому что они имеют свои собственные PID 1 .
Поиск всех PID для renice
рекурсивного
Нам нужно получить PID всех процессов («нормальных» или «потоковых»), которые являются потомками (дочерние или в группе потоков) ожидаемого процесса. Это должно быть рекурсивным (учитывая детей детей).
Ответ Леонтьева дает подсказку: все имена папок в /proc/$PID/task/
PID потоков содержат children
файл со списком потенциальных дочерних процессов.
Однако ему не хватает рекурсивности, поэтому вот быстрый и грязный скрипт для их поиска:
#!/bin/sh
[ "$#" -eq 1 -a -d "/proc/$1/task" ] || exit 1
PID_LIST=
findpids() {
for pid in /proc/$1/task/* ; do
pid="$(basename "$pid")"
PID_LIST="$PID_LIST$pid "
for cpid in $(cat /proc/$1/task/$pid/children) ; do
findpids $cpid
done
done
}
findpids $1
echo $PID_LIST
Если процесс PID 1234 - это тот, который вы хотите сделать рекурсивно приятным, теперь вы можете сделать:
renice -n 15 -p $(/path/to/findchildren.sh 1234)
1 Обратите внимание, что для соответствия POSIX вызов getpid(2)
внутри потока не даст вам общесистемного уникального идентификатора (PID) этого запускаемого объекта, а скорее PID основного процесса в «группе потоков». Вам нужно будет позвонить gettid(2)
вместо этого. Смотрите этот ответ для получения дополнительной информации.
man (7) pthreads
говорит о текущей реализации (NPTL): «все потоки в процессе помещены в одну группу потоков; все члены группы потоков имеют один и тот же PID» и «потоки не имеют общего полезного значения». Затем, как вы можете арендовать поток, который не имеет своего собственного PID, когда для этогоrenice
используется PID?