Приємна вартість або акції CPU?
Зверніть увагу, що нині приємні значення можуть бути не настільки актуальними для загальної системи через автоматичне групування завдань, особливо при використанні systemd . Будь ласка, дивіться цю відповідь для отримання більш детальної інформації.
Різниця між потоками та процесами
Важливе питання щодо Linux, оскільки документація підтверджує сумніви (наприклад, у потоках немає власного PID).
Примітка: ця відповідь точно пояснює теми Linux.
Якщо коротко: ядро обробляє лише "запущені об'єкти", тобто те, що можна запустити і запланувати . Ядро, ці сутності називають процесами. Потік - це лише певний процес, який ділиться (принаймні) простором пам'яті та обробниками сигналів з іншим.
Кожен такий процес має загальносистемний унікальний ідентифікатор: PID (ідентифікатор процесу). Для так званих потоків його іноді називають TID (ідентифікатор теми), але з точки зору sysadmin (і ядро!), TID і PID - це одне і те ж (вони мають одне і те саме простір імен).
Як результат, ви можете renice
кожен "потік" окремо, оскільки у них є власний PID 1 .
Пошук усіх PID- renice
рекурсивно
Нам потрібно отримати ПІД усіх процесів ("нормальних" або "потокових"), які є нащадками (діти або в групі потоків) процесу, що має бути визначений. Це повинно бути рекурсивним (враховуючи дітей дітей).
Відповідь Антона Леонтьєва дає натяк на це: усі назви папок /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?