コンピューター サイエンスでは、ファイバーは特に軽量な実行スレッドです。
スレッドと同様に、ファイバーはアドレス空間を共有します。ただし、ファイバーは協調的マルチタスクを使用するのに対し、スレッドはプリエンプティブ マルチタスクを使用します。スレッドは、ビジー状態のスレッドをプリエンプトして別のスレッドを再開するためにカーネルのスレッド スケジューラに依存することが多く、ファイバーは実行中に別のファイバーを実行するために自分自身を明け渡します。
スレッド、ファイバー、コルーチン
ファイバーとカーネル スレッドの主な違いは、ファイバーではプリエンプティブなタイム スライスではなく、協調的なコンテキスト スイッチングが使用されることです。実質的に、ファイバーは並行性の分類を拡張します。
- 1台のコンピュータで複数のプロセスを実行できる
- 一つのプロセス内で複数のスレッドが実行できる
- 1本の糸の中に複数の繊維が通ることがある[1]
ファイバー(スタックフルコルーチンまたはユーザーモード協調スケジュールスレッドと呼ばれることもある)とスタックレスコルーチン(コンパイラ合成ステートマシン)は、パフォーマンスと機能に大きな違いがある2つの異なるプログラミング機能を表します。[2]
利点と欠点
ファイバーは協調的にマルチタスクを実行するため、プリエンプティブにスケジュールされたスレッドよりもスレッドの安全性の問題が少なく、ファイバー化されたコードを書くときには、スピンロックやアトミック操作などの同期構造は暗黙的に同期されるため不要です。ただし、多くのライブラリは、非ブロッキング I/O を実行する方法としてファイバーを暗黙的に生成するため、注意してドキュメントを読むことをお勧めします。欠点は、ファイバーはプリエンプティブ スレッドも使用しないとマルチプロセッサマシンを利用できないことです。ただし、 CPU コアの数よりもプリエンプティブ スレッドの数が多くないM:N スレッド モデルは、純粋なファイバーや純粋なプリエンプティブ スレッドよりも効率的です。
一部のサーバー プログラムでは、ファイバーは、シングル スレッドの親プログラムが動作を継続できるように、自身をソフト ブロックするために使用されます。この設計では、ファイバーは主に CPU 処理を必要としない I/O アクセスに使用されます。これにより、メイン プログラムは実行中の処理を継続できます。ファイバーはシングル スレッドのメイン プログラムに制御を渡し、I/O 操作が完了すると、ファイバーは中断したところから動作を続行します。
オペレーティングシステムのサポート
ファイバーは、スレッドに比べてオペレーティング システムからのサポートが少なくて済みます。ファイバーは、GNU Portable Threadsのようにのライブラリ関数getcontext、setcontext、swapcontext を使用して、またはアセンブラで boost.fiber として、最新のUnixシステムで実装できます。
ucontext.h
Microsoft Windowsでは、ファイバーはConvertThreadToFiberおよび呼び出しを使用して作成されますCreateFiber。現在中断されているファイバーは、どのスレッドでも再開できます。スレッドローカルストレージに類似したファイバーローカルストレージは、変数の一意のコピーを作成するために使用できます。[3]
Symbian OS は、 Active Scheduler でファイバーと同様の概念を使用していました。アクティブ オブジェクトには、未処理の非同期呼び出しの 1 つが完了したときに Active Scheduler によって実行されるファイバーが 1 つ含まれていました。複数の Active オブジェクトが (優先度に基づいて) 実行を待機している可能性があり、それぞれが独自の実行時間を制限する必要がありました。
ファイバー実装例
一部のオペレーティング システムまたはライブラリではファイバーを明示的にサポートしていますが、ファイバーはオペレーティング システムのサポートなしで実装できます。
- Win32はファイバーAPI [4]を提供する(Windows NT 3.51 SP3以降)
- C++ Boostライブラリには、 Boostバージョン1.62以降にファイバークラスがあります。
- Ruby にはグリーンスレッドがありました(バージョン 1.9 以前)
- Netscape Portable Runtime (ユーザー空間ファイバー実装を含む)
- 肋骨2
- PHPバージョン8.1以降[5]
- フードの下でFuturesを使用するRustファイバー
- Crystalは言語と標準ライブラリの一部としてファイバーを提供する。
参照
参考文献
- ^ Nat Goodspeed、Oliver Kowalke、2014-05-22、N4024 コルーチンとファイバーの区別
- ^ Gor Nishanov、2018-11-20、P1364R0 拡大鏡の下の繊維
- ^ ファイバー、MSDN ライブラリ
- ^ CreateFiber、MSDN
- ^ PHP 8.1.0 リリースのお知らせ
外部リンク
- GNU ポータブル スレッド
- 「ポータブル コルーチン ライブラリ」。Freecode。
- Fiber Pool Microsoft Windows 用のファイバーに基づくマルチコア対応 C++ フレームワーク。
- 状態スレッド
- プロトスレッド
- 肋骨2
- ブーストファイバー
