すてきな値またはCPUシェア?
systemdを使用する場合は特に、自動タスクグルーピングにより、最近ではnice値はそれほど「システム全体」に関連しない場合があることに注意してください。詳細については、この回答をご覧ください。
スレッドとプロセスの違い
Linuxでの重要な質問。ドキュメントは疑念を永続化します(たとえば、スレッドが独自のPIDを持たないことについて)。
注:この回答は、Linuxスレッドを正確に説明しています。
要するに、カーネルは「実行可能なエンティティ」、つまり実行およびスケジュール可能なもののみを処理します。カーネルに関しては、これらのエンティティはプロセスと呼ばれます。スレッドとは、(少なくとも)メモリ空間を共有し、別のハンドラとハンドラをシグナルする一種のプロセスです。
このようなプロセスにはすべて、システム全体で一意の識別子であるPID(プロセスID)があります。いわゆるスレッドの場合、TID(スレッドID)と呼ばれることもありますが、sysadmin(およびカーネル!)の観点からは、TIDとPIDは同じものです(同じ名前空間を共有します)。
その結果、独自の PID 1を持つため、各「スレッド」を個別に実行でき ます。renice
すべてのPIDを再帰的に見つけるrenice
nic-to-nicedプロセスの子孫(子またはスレッドグループ内)であるすべてのプロセス(「通常」または「スレッド」)のPIDを取得する必要があります。これは再帰的でなければなりません(子供の子供を考慮して)。
アントン・レオンチェフの答えはそうするためのヒントを与えます:のすべてのフォルダー名は、潜在的な子プロセスをリスト/proc/$PID/task/
するchildren
ファイルを含むスレッドのPID です。
ただし、再帰性に欠けているため、それらを見つけるための簡単で汚いシェルスクリプトを次に示します。
#!/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)
スレッド内はなりませんあなたにこの実行可能なエンティティのシステム全体のユニークID(PID)を与えるのではなく、「スレッドグループ」内のメインプロセスのPID。gettid(2)
代わりに呼び出す必要があります。詳細については、この回答を参照してください。
man (7) pthreads
現在の(NPTL)実装について:「プロセス内のすべてのスレッドは同じスレッドグループに配置されます。スレッドグループのすべてのメンバーは同じPIDを共有します」および「スレッドは共通のnice値を共有しません」。それでは、renice
PIDを使用して独自のPIDを持たないスレッドをどのように変更できますか?