web-dev-qa-db-ja.com

固有のPIDSを持つスレッドを表示するプログラムpstreeおよびhtop。これはどのようにして可能ですか?

次の出力を出力するプログラムpstree -p 31872を実行しました。

 Ruby(31872)─┬─{Ruby}(31906)         
             └─{Ruby}(32372)

Pstreeのmanページには、次のように書かれています。

プロセスの子スレッドは親プロセスの下にあり、中括弧で囲まれたプロセス名で表示されます。

       icecast2---13*[{icecast2}]

(上記は、圧縮を無効にする-pオプションがないため、異なって表示されます。)

-pなしでpstree 31872を実行すると、次のようになります。

Ruby───2*[{Ruby}] 

psを使用してそれらのPIDSを観察しようとすると、結果が見つかりません。ただし、pidは/ procにあります。

私の質問は、スレッドに異なるPIDがあるのはなぜですか?私はそれらがプロセスと同じ(31872)であることを期待します。 htopを実行すると、同じ動作が観察されます。

7
stantona

間違いは、それらの数値が実際にはTIDS(スレッドID)であるのにPIDSであると推定することでした。 Linux関数gettid(2)を参照してください。 clone(2)を読むと、追加の(そして興味深い)詳細がたくさん得られます。

8
stantona

多くの場合、スレッドは異なるプロセスです。少なくともLinuxでは、「スレッド」は多くの場合、親プロセスとメモリを共有しているプロセスのクローンです。

ただし、一部の言語では、スレッドは言語VMでシミュレートされる「グリーン」スレッドであるため、メインプロセスの一部のままになります。 Javaおよびpythonはこれで有名です。

1
Hack Saw