10

プロセス ID とスレッド ID を混同しています。ここでスタックオーバーフローを含むいくつかのWeb投稿を行ってきました。

新しいプロセスを開始すると、新しい PID と新しい TGID が得られますが、新しいスレッドを開始すると、同じ TGID を維持しながら新しい PID が得られます。

プログラムを実行すると、プログラムから作成されたすべてのスレッドが異なる PID を持たないのはなぜですか?

プログラミングでは、通常、メインはスレッドであり、実行は main から開始すると言うことを知っています。したがって、メインから複数のスレッドを作成すると、すべてのスレッドがメインの PID と等しい同じ PID を持つことになります。

そこで私が聞きたかったことは以下の通りです。

1) プログラムを実行すると、プロセスまたはスレッドとして実行されますか?

2)スレッドを作成するメインスレッドとスレッドを作成するプロセス に違いはありますか?

3) Linux でスレッドとプロセスに違いはありますか? Linuxがスレッドとプロセスを区別しないことをどこかで読んだので。

4

5 に答える 5

14

少し単純化:

  1. PID はプロセス ID、TID はスレッド ID です。問題は、によって作成された最初のスレッドのfork()場合、PID=TID です。コマンドを使用してプロセス内にさらにスレッドを作成するとclone()、PID と TID は異なり、PID は常に TID よりも小さくなります。

  2. いいえ、違いはありませんが、メインが強制終了された場合、他のすべてのスレッドも強制終了される可能性があります。

  3. はい、スレッドは実際にスケジュールされるものです。技術的には、プロセスはコードのさまざまなセグメント (テキスト、bss、スタック、ヒープ、および OS) のメモリ マッピングにすぎません。

于 2013-10-30T09:57:37.507 に答える
4

この混乱は、Linux のタスクの概念に由来しています。

ただし、Linux では、タスクとスレッドの間にほとんど違いはありません。

すべてのプロセスは、少なくとも 1 つのタスクを実行する自己完結型の VM です。

各タスクは、プロセス スコープ内の独立した実行単位です。

プロセスのメイン タスクは、そのタスク ID (TID) をプロセス ID (PID) としてプロセスに渡します。

プロセス内で生成するすべての新しいスレッドは、その中に新しいタスクを作成します。カーネルで個別に識別するために、独自の個別のタスク ID (TID) が割り当てられます。

プロセス内のすべてのタスクは、同じタスク グループ ID (TGID) を共有します。

于 2013-10-30T09:59:02.437 に答える
1

あなたが示した投稿は、スレッドが別のプロセスとして作成されたLinux実装の古いバージョンであると思われるLinuxスレッド実装について説明しています。スレッドの POSIX 実装では、スレッドは別のプロセスとして作成されるのではなく、コードの並列実行の異なるストリームを作成します。コードには、並列実行とは異なるいくつかのコンポーネントがあり、その情報は、TID を格納するスレッド記述子によって格納されます。 . 複数のスレッドを作成するプロセスはマルチスレッド プロセスと呼ばれることがあるため、すべてのスレッドの PID は同じですが、TID は異なります。スレッドを作成するメイン プロセスは、メイン スレッドと呼ばれます。

于 2013-10-30T09:58:51.890 に答える
0

すべてのスレッドがプロセスであるプログラムデータを共有しているため、同じプロセスIDを取得するため、プロセスIDを呼び出すと同じになります。

于 2013-10-30T09:57:57.027 に答える