指定されたNice
レベルと子プロセスの関係は誰かに教えてもらえますか?
たとえば、0
のデフォルトのNice
があり、Nice 5
でスクリプトを開始すると、いくつかの子プロセスが開始されます(この場合は約20並列)。子プロセスのニースは何ですか?
子プロセスは、フォークされたときに親が保持しているNice
値(例では5
)を継承します。
ただし、子プロセスのフォーク後に親プロセスのNice
値が変更された場合、子プロセスは新しいNice
値を継承しません。
これは、監視ツールtop
を使用して簡単に確認できます。 Nice
フィールド(NI)がデフォルトで表示されない場合は、f
を押してI
を選択することで追加できます。これにより、NI
列がtop
表示に追加されます。
* I: NI = Nice value
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1937 root 20 0 206m 66m 45m S 6.2 1.7 11:03.67 X
man 2 fork
からの良い情報
fork()は、呼び出しプロセスを複製して新しいプロセスを作成します。子と呼ばれる新しいプロセスは、次の点を除いて、親と呼ばれる呼び出しプロセスの完全な複製です。
- 子には独自の一意のプロセスIDがあり、このPIDは既存のプロセスグループ(setpgid(2))のIDと一致しません。
- 子の親プロセスIDは、親のプロセスIDと同じです。
- 子は、親のメモリロック(mlock(2)、mlockall(2))を継承しません。
- プロセスリソースの使用率(getrusage(2))とCPU時間カウンター(times(2))は、子でゼロにリセットされます。
- 子の保留中のシグナルのセットは、最初は空です(sigpending(2))。
- 子は、その親からセマフォ調整を継承しません(semop(2))。
- 子は親(fcntl(2))からレコードロックを継承しません。
- 子は親からタイマーを継承しません(setitimer(2)、alarm(2)、timer_create(2))。
- 子は、未処理の非同期I/O操作を親(aio_read(3)、aio_write(3))から継承せず、非同期I/Oコンテキストを親から継承しません(io_setup(2)を参照)。