Linuxのスレッドはプロセスとして実装されていますか?

Linuxのスレッドはプロセスとして実装されていますか?

私は苦しんでいますこの本、Mark Mitchell、Jeffrey Oldham、Alex Samuelによる「高度なLinuxプログラミング」。 2001年の作品だからちょっと古い内容ですね。しかし、それでもかなり大丈夫だと思います。

しかし、私はこれが私のLinuxがシェル出力で生成されたものと異なることを発見しました。 92ページ(ビューアでは116)から、4.5章のGNU / Linuxスレッド実装は、次の文を含む段落で始まります。

GNU / LinuxのPOSIXスレッド実装は、1つの重要な方法で、他の多くのUNIXシリーズシステムのスレッド実装とは異なります。 GNU/Linux では、スレッドはプロセスとして実装されます。

これは重要なポイントと思われ、後でCコードで説明します。本の結果は次のとおりです。

main thread pid is 14608
child thread pid is 14610

私のUbuntu 16.04では、次のようになります。

main thread pid is 3615
child thread pid is 3615

ps出力はこれをサポートします。

2001年から今まで何かが変わったようです。

次のページの次のサブセクションである4.5.1信号処理は、前の説明に基づいています。

シグナルとスレッド間の相互作用は、UNIXシリーズシステムによって異なります。 GNU/Linux では、スレッドがプロセスとして実装されるという事実によって、動作が決まります。

この本の後半では、これがより重要になるようです。何が起こっているのかを説明できる人はいますか?

私はこれを見たことがあるLinuxカーネルスレッドは実際にカーネルプロセスですか?、しかしあまり役に立ちませんでした。混乱しています。

Cコードは次のとおりです。

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>

void* thread_function (void* arg)
{
    fprintf (stderr, "child thread pid is %d\n", (int) getpid ());
    /* Spin forever. */
    while (1);
    return NULL;
}

int main ()
{
    pthread_t thread;
    fprintf (stderr, "main thread pid is %d\n", (int) getpid ());
    pthread_create (&thread, NULL, &thread_function, NULL);
    /* Spin forever. */
    while (1);
    return 0;
}

ベストアンサー1

私の考えでは、clone(2)マニュアルページ違いを取り除くことができます。 PID:

CLONE_THREAD(Linux 2.4.0-test8以降)
CLONE_THREAD が設定されると、子プロセスは呼び出しプロセスと同じスレッドグループに配置されます。
スレッドグループは、単一のPIDを共有するスレッドグループのPOSIXスレッドの概念をサポートするためにLinux 2.4に追加された機能です。内部的には、この共有PIDはいわゆるスレッドグループのスレッドグループ識別子(TGID)です。 Linux 2.4からgetpid(2)を呼び出すと、呼び出し元のTGIDが返されます。

「スレッドがプロセスとして実装される」という語句は、過去のスレッドが別々のPIDを持っていた問題を意味します。デフォルトでは、Linuxには最初はプロセス内にスレッドがなく、仮想メモリやファイル記述子などの共有リソースを所有できる別のプロセス(別々のPIDを含む)しかありませんでした。プロセスID (*)CLONE_THREADとスレッドIDを分離すると、Linuxは他のシステムと同様に動作し、その意味でPOSIXの要件と似ています。技術的に言えば、オペレーティングシステムはまだスレッドとプロセスの別々の実装を持っていません。

信号処理は、以前の実装の別の問題領域でした。@FooFは以下を指します。彼らの答えに

コメントで述べたように、Linux 2.4もこの本と同じ年である2001年にリリースされたので、ニュースが公開されていないのは驚くべきことではありません。

おすすめ記事