1

「ファイバー」の概念について、1) スレッドと 2) カーネルから見たものとの関係について、少し混乱しています。

私の理解では、ファイバーはスレッドによって作成されたスレッドであり、そのスレッドを作成するスレッド (つまり、おそらくスケジューラ?) によって管理されます。ただし、すべての集中的な目的のために、それはまだ「スレッド」であり、カーネルからはそのように見なされると考えています。

私が同僚から受け取った説明によると、ファイバーはカーネルからは完全に見えず、完全にユーザー空間で実行され、決して「スレッド」ではありません。彼のメールによると:

スレッドは、ユーザー空間ライブラリに実装されることがあるため、ユーザー スレッドと呼ばれます。カーネルはそれらを認識しないため、ユーザー空間で管理およびスケジュールされます。一部の実装では、マルチプロセッサ マシン (M:N モデル) の利点を得るために、ユーザー スレッドを複数のカーネル スレッドの上に置きます。この記事では、「スレッド」という用語 (カーネルまたはユーザー修飾子なし) は、デフォルトでカーネル スレッドを指します。仮想マシンによって実装されるユーザー スレッドは、グリーン スレッドとも呼ばれます。一般に、ユーザー スレッドは高速に作成および管理できますが、マルチスレッドまたはマルチプロセッシングを利用することはできず、実行の準備ができているユーザー スレッドがいくつかある場合でも、関連するすべてのカーネル スレッドがブロックされるとブロックされます。

ファイバーは、協調的にスケジュールされるスケジューリングのさらに軽い単位です。実行中のファイバーは、別のファイバーを実行できるように明示的に「譲歩」する必要があります。これにより、カーネルまたはユーザースレッドよりも実装がはるかに簡単になります。ファイバーは、同じプロセス内の任意のスレッドで実行するようにスケジュールできます。これにより、アプリケーションはカーネル スケジューラ (アプリケーションに合わせて調整されていない可能性があります) に依存するのではなく、スケジューリング自体を管理することでパフォーマンスを向上させることができます。OpenMP などの並列プログラミング環境は、通常、ファイバーを介してタスクを実装します。コルーチンはファイバーと密接に関連しており、コルーチンは言語レベルの構造体であるのに対し、ファイバーはシステムレベルの構造体であるという違いがあります。

ファイバーが正確に何であるかという点で、もう少し良い説明を得たいと思っています(OS /カーネルに関する限り、実際のスレッドであり、作成するスレッドによって単純に管理されますか?)。

Google 検索で広範囲に調査しましたが、ここを含め、どこを見ても単純な答えが 1 つしか見つかりませんでした。「ファイバーは、スレッドによって作成および管理されるスレッドです。」

誰かが共有したり、私に指摘したりできる情報があれば、それは大歓迎です. 私の同僚の主張は、Golang のゴルーチンは「ファイバー」を使用し、それらのファイバーは OS からは見えないというものです。したがって、ファイバーの「正しい」実装です。個人的には、ゴルーチンはコルーチンとより密接に関連していると感じており、ファイバー/スレッドのシナリオをまったく実装していません...

4

0 に答える 0