私はLinuxがJava VMのすべてのユーザースレッドに対してカーネルスレッドを生成することをいくつかの場所で読みました。 (私は、「カーネルスレッド」という用語が2つの異なる方法で使用されるのを見ました。
- コアオペレーティングシステムタスクを実行するために生成されたスレッド
- オペレーティング・システムは、ユーザー操作を実行するためにスレッドを識別して予約します。
私は後者の種類について話しています。 )
Linuxプロセスは親プロセスと子プロセス間の共有メモリスペースをサポートしているので、カーネルスレッドはカーネルプロセスと同じですか、それとも実際には別のエンティティですか?
ベストアンサー1
ドキュメントは非常に混乱する可能性があるため、ここで説明します。本物「Linuxモデル:
- Linuxカーネルでは、実行(および予約)できることを「プロセス」といいます。
- 各プロセスには、システム固有のプロセスID(PID)とスレッドグループID(TGID)があります。
- 「正常」プロセスにはPID = TGIDがあり、他のプロセスはこのTGID値を共有しません。
- 「スレッド」プロセスは、TGID値が他のプロセスと共有されるプロセスです。
- 同じTGIDを共有する複数のプロセスは、少なくとも同じメモリ空間と信号ハンドラ(時にはそれ以上)も共有します。
- 「スレッド」プロセスのPIDがTGIDの場合は、「メインスレッド」と呼ぶことができます。
- すべてのプロセスで呼び出されると、対応する
getpid()
TGID(=「メインスレッド」PID)が返されます。 - すべてのプロセスで呼び出されると、
gettid()
対応するPID(!)が返されます。 - すべての種類のプロセスはシステムコールを介して作成できます
clone(2)
。 - プロセス間で共有される内容は、特定のフラグをに渡すことによって決定されます
clone(2)
。 - TGIDと
ls /proc
同様に、フォルダ名を数字で一覧表示できます。/proc/NUMBER
- フォルダの数字名は
/proc/TGID/task
PIDと同じです/proc/TGID/task/NUMBER
。 - 添付されている既存のPIDがすべて表示されていなくても、
ls /proc
これを行うことができますcd /proc/any_PID
。
結論として:カーネルの観点からは、それぞれ固有のPIDを持つプロセスのみが存在し、いわゆるスレッドは他の種類のプロセスにすぎません(少なくとも1つ以上の他のプロセスと同じメモリ空間と信号ハンドラを共有します)。 。
メモ:Linuxで「スレッド」の概念を実装すると、用語の混乱が発生しますが、getpid()
思うように動作しない場合は、 POSIX互換性(スレッドは共通のPIDを共有する必要があります)に従って動作するためです。