完全な特権で実行せずに、プロセス/スレッドに独自のナイス値を下げる権利を付与する最良の方法は何ですか? ソリューションは、プロセス自体の外部にある可能性があります(ulimit
またはsetcap
たとえば)。
ulimit
少なくとも最新の Linux と Mac OS X で移植可能なものを探しています (これが、またはで自分自身に返信しなかった理由ですsetcap
)。
完全な特権で実行せずに、プロセス/スレッドに独自のナイス値を下げる権利を付与する最良の方法は何ですか? ソリューションは、プロセス自体の外部にある可能性があります(ulimit
またはsetcap
たとえば)。
ulimit
少なくとも最新の Linux と Mac OS X で移植可能なものを探しています (これが、またはで自分自身に返信しなかった理由ですsetcap
)。
setpriority()
すべてのプロセスは、またはを使用してそれ自体をより良くすることができsched_setscheduler()
、スレッドはおよびpthread_setchedparam()
を使用してそれ自体をより良くすることができますpthread_setschedprio()
。どちらもPOSIX.1-2001で定義されているため、基本的にすべてのWindows以外のシステムで使用できるはずです。使用可能なスケジューラーのタイプと優先順位の詳細については、man2sched_setschedulerを参照してください。
数値の優先度の値が高いほど、プロセスが優れていることに注意してください。論理優先度が低くなります。値が大きいほど、取得するCPU時間は短くなります。特定のスケジューリングポリシーの最小値と最大値を見つけるには、とを使用する必要がありsched_get_priority_min()
ますsched_get_priority_max()
。
通常、プロセスまたはスレッドは常に優先度を下げる(より良いものにする)ことができ、それをより良くしないスケジューリングポリシーを使用する必要があります。ただし、2.6.12より前のLinuxカーネルでは通常のユーザーにはそれが許可されていなかったため、プログラムはおそらくそれまたはそのスレッドの一部をより良いものにしようとする必要がありますが、まれなアーキテクチャで許可されない場合でもあまり気にしないでください。 。最も重要なことは、アルゴリズム設計がスケジューリングに依存してはならないことです。それよりも堅牢なコードを目指してください。
nice 値を下げる (論理優先度を上げる) には、追加の特権が必要です。Linux では、これは root によって実行されるか、CAP_SYS_NICE 機能を持つことを意味します。どちらもバイナリ実行可能ファイルに設定できます (chown と chmod による setuid root、または setcap のいずれか)。前者はすべての Unix 系システムで動作します (ただし、インストール時に root 権限が必要です) が、後者は Linux 固有です。
最も受け入れられる移植可能な方法は、setuid root にインストールできるラッパー プログラムを作成することです。これは非常に単純で、数十行の C です。単純に sched_get_priority_min()、sched_get_priority_max()、sched_setscheduler()、および sched_setparam() を呼び出してナイス値を下げ (より多くの CPU 時間を取得)、次に seteuid を呼び出します。 (0); setregid(getgid(), getgid); setreuid(getuid(), getuid()); 余分な権限を削除し、最後に実際のプログラムを execv() します。注: インストール時に、実際のプログラムへのパスをハードコーディングすることをお勧めします。これは、すべての Linux および Unix 系システムで変更を加えることなく機能するはずです。
実際のプログラムでは、それほど重要ではないスレッドのナイスネスを単純に増やします。言い換えれば、プログラム内のスレッドのナイスネスを下げようとするのではなく、他のすべてのスレッドのナイスネスを上げようとするのです。setuid ルート ラッパー プログラムは、最低限のナイス レベルを下げる移植可能な方法です。最初に現在のナイスネスとスケジューラの詳細を確認して、調整するのに十分な範囲があるかどうかを確認できます。おそらく、ラッパー プログラムは、使用する優先度レベルを実際のプログラムに伝えるコマンド ライン パラメータまたは環境変数を設定できます。