web-dev-qa-db-ja.com

Pthreadライブラリは実際にはユーザースレッドソリューションですか?

実際の質問の定義方法がわからないため、タイトルが十分に明確でない場合があります。

私は、PthreadがPOSIX標準を満たすスレッドライブラリであることを理解しています(POSIXについては、wikipediaを参照してください: http://en.wikipedia.org/wiki/Posix )。 UnixライクなOSで利用可能です。

スレッドについて、私は3つの異なるモデルがあることを読みました:

ユーザーレベルのスレッド:カーネルはそれを知りません。ユーザー自身がスレッドを作成/実装/破棄します。

カーネルレベルのスレッド:カーネルは、プロセス内の複数の制御スレッドを直接サポートします。

軽量プロセス(LWP):はカーネルによってスケジュールされますが、ユーザースレッドとバインドできます。

私の混乱を見ましたか? pthread_create()を呼び出してスレッドを作成すると、ユーザーレベルのスレッドが作成されましたか?たぶんそうだ。つまり、Pthreadはスレッドに対してユーザーレベルのソリューションを提供していると言えるでしょうか。カーネル/ LWPを操作できませんか?

44
Mengfei Murphy

Q:PthreadはPOSIX標準を満たすスレッドライブラリであることを理解しています

A:はい。実際、「Pthreads」は「Posixスレッド」の略です: http://en.wikipedia.org/wiki/Pthreads

Q:UnixライクなOSで利用できます。

A:実際には、Windows、MacOSなど、さまざまなOSで利用できます。もちろん、Linux、BSD、Solarisでも利用できます。

Q:スレッドについて、3つの異なるモデルがあると読みました

今、あなたはぼやけています。 「スレッド」は非常に一般的な用語です。多くの異なるモデルがあります。そして、「スレッド」を特徴付けたり実装したりできる多くのさまざまな方法。 Javaスレッドモデル、またはAdaスレッドモデルのようなものを含みます。

Q:pthread_create()を呼び出してスレッドを作成すると、ユーザーレベルのスレッドが作成されましたか?

A:はい:ユーザースペースで行うほとんどすべてのことは、独自のプライベートな「ユーザースペース」で「保護」されます。

Q:ユーザーレベルのスレッド:カーネルはそれを知りません。

A:いいえ。カーネルはすべてを知っています:)

Q:カーネルレベルのスレッド:カーネルは、プロセス内の複数の制御スレッドを直接サポートします。

A:はい、「カーネルスレッド」のようなものがあります。

そして、Linuxはカーネルスレッドを大幅に利用しています。たとえば、Linuxシステムのすべてのプロセスは「カーネルスレッド」です。また、ユーザーが作成したすべてのpthreadも、新しい「カーネルスレッド」として実装されます。 「ワーカースレッド」と同様(ユーザーレベルのプロセスからは完全に見えません)。

ただし、これはpthreadを効果的に使用するために理解する必要のない高度なトピックです。これと、他の多くのトピックについて詳しく説明したすばらしい本があります。

Linuxカーネル開発、Robert Love

「Pthreads」はインターフェースです。実装方法はプラットフォームによって異なります。 Linuxはカーネルスレッドを使用します。 WindowsはWin32スレッドなどを使用します。

================================================== =========================補遺:

人々はまだこの古いスレッドにぶつかっているように見えるので、私はこの投稿を参照することが役立つと思いました:

https://stackoverflow.com/a/11255174/421195

Linuxは通常、pthreadの2つの実装を使用します。 LinuxThreads および Native POSIX Thread Library(NPTL) ですが、前者はほとんど使用されていません。 2.6のカーネルはNPTLを提供します。NPTLはSUSv3へのより厳密な準拠を提供し、特に多くのスレッドがある場合にパフォーマンスが向上します。

次のコマンドを使用して、シェルでのpthreadの特定の実装を照会できます。

getconf GNU_LIBPTHREAD_VERSION

The Linux Programming Interface で、より詳細な実装の違いを取得することもできます。

「Pthreads」は、Posix標準に基づいたライブラリです。 pthreadsライブラリの実装方法は、プラットフォームごと、およびライブラリごとに異なります。

18
paulsm4

@ paulsm4カーネルはあらゆることを知っているというあなたのコメントには疑問があります。ユーザーレベルのスレッドのこの特定のコンテキストでは、カーネルはそのようなことが起こっているという事実を認識していません。ユーザーレベルのスレッドのスケジューリングは、ユーザー自身が(ライブラリによって提供されるインターフェイスを介して)維持され、カーネルは最終的に、プロセス全体に単一のカーネルスレッドのみを割り当てます。カーネルはプロセスを単一のスレッドとして扱い、スレッドの1つによるブロッキング呼び出しは、そのプロセスのすべてのスレッドをブロックすることになります。 http://www.personal.kent.edu/~rmuhamma/OpSystems/Myos/threads.htm を参照してください

33
pareshverma91

pthreads自体は、実際にはスレッド化ライブラリではありません。 pthreadsは、特定のスレッド化ライブラリーが実装するインターフェースであり、そのプラットフォームで使用可能な並行性リソースを使用します。したがって、Linux、bsd、solarisなどにpthread実装があり、インターフェース(ヘッダーファイルと呼び出しの意味)は同じですが、それぞれの実装は異なります。

したがって、pthread_createが実際に行うことは、カーネルスレッドオブジェクトに関して、OSとpthreadライブラリの実装によって異なります。最初の概算では、知る必要はありません(これは、pthreadの抽象化によって知る必要のないものです)。最終的には「カーテンの後ろ」を見る必要があるかもしれませんが、ほとんどのpthreadユーザーにとっては必要ありません。

/ specific/pthread実装が何を行うかを知りたい場合、特定のOSで、質問を明確にする必要があります。たとえば、SolarisとLinuxの機能は大きく異なります。

14
FIn

Linuxでは、pthreadは 軽量プロセスとして実装 です。カーネル(v2.6 +)は実際には [〜#〜] nptl [〜#〜] で実装されています。ウィキの内容を引用させてください:

NPTLはいわゆる1x1スレッドライブラリであり、ユーザーが(pthread_create()ライブラリ関数を介して)作成したスレッドは、カーネル内のスケジュール可能なエンティティ(Linuxの場合はタスク)と1-1で対応しています。これは、可能な限り最も単純なスレッディング実装です。

したがって、Linuxカーネルのpthreadは、実際にはカーネルスレッドとして実装されます。

10
Junji Zhi

私は以前の答えが私が望んでいたほど満足または明確ではないので、ここに行きます:

あなたが電話するとき

pthread_create(...)

常に新しいユーザーレベルのスレッドを作成します。そして、OSがあると仮定すると、常に1つ以上のカーネルスレッドが存在します...しかし、さらに深く掘り下げましょう:

「オペレーティングシステムの概念」第10版によると、(スレッドライブラリに関して)実際に確認する必要がある分類は、ユーザーレベルのスレッドがカーネルスレッドにどのようにマップされるかです(そして、それが実際に意味するところです)。

モデルは1対1(単一プロセス内の各ユーザーレベルのスレッドは別のカーネルスレッドにマップされます)、多対1(スレッドライブラリは「ユーザーレベル」です"したがって、単一のプロセス内のすべての異なるスレッドは、単一のカーネルスレッドにマップされ、スレッドのデータ構造、コンテキストの切り替えなどは、OSではなくユーザーレベルで処理されます。 O呼び出し、プロセス全体が潜在的にブロックする可能性があります])、および多対多(その間の何か、明らかに、ユーザーレベルのスレッドの数は、マップされているカーネルスレッドの数以上です。上に)。

現在、pthreadsは仕様であり、実装ではありません。実装は、それが書き込まれるOSに依存します。それはそれらのモデルのいずれかである可能性があります(「多対多」は非常に柔軟であることに注意してください)。

そのため、例として、LinuxおよびWindows(ここ数年で最も人気のあるOS、モデルは「1対1」)での実装は「1対1」です。

1
Yoni Keren

Pthreadsは、ライブラリをスレッド化するための単なる標準化されたインターフェースです。 OSスレッドと軽量スレッドのどちらを作成するかは、使用するライブラリによって異なります。それにもかかわらず、私の最初のゲストは、あなたのスレッドが「実際の」OSレベルのスレッドであることです。

0
Eser Aygün