ファイバー (コンピュータ)

ファイバー（）は、計算機科学の分野において、非常に軽量な実行スレッドを示す。

ファイバー同士はスレッドと同じくアドレス空間を共有するが、ファイバーが協調マルチタスクを使用するのに対し、スレッドはプリエンプティブマルチタスクを用いる。スレッドでは、ビジーなスレッドに割り込み他のスレッドを復帰させるためにカーネルのスレッドスケジューラを用いることが多いが、ファイバーは他のスレッドを実行させるために自ら制御を譲る。

 ファイバーとコルーチン 
ファイバーはコルーチンと本質的には同じ概念である。違いは、もしあるとすればコルーチンが言語レベルの構造で、制御の流れの形態の一つであるのに対し、ファイバーはシステムレベルの構造であり、並行に動作しないスレッドと捉えられる点である。どちらに近いか異論はあろうが、ファイバーはコルーチンの実装かA Fiber Class、あるいは、コルーチンを実装するための基盤と捉えることができるかもしれないImplementing Coroutines for .NET by Wrapping the Unmanaged Fiber API, Ajai Shankar, MSDN Magazine。

 利点と欠点 
ファイバーのマルチタスクは協調的であるため、スレッドセーフネスはプリエンプティブにスケジュールされるスレッドと比べて問題となりにくく、また暗黙のうちに同期が行われているためスピンロックなどの同期の機構や、アトミックな操作は不要である。
しかし、ノンブロッキング I/Oを行う際暗黙のうちに処理を譲るライブラリが多く、十分な注意とドキュメントの熟読が推奨される。

欠点としては、ファイバーはプリエンプティブなスレッドを用いない限りマルチプロセッシングの機構を活用できない点がある。しかし、CPU コア数以下のプリエンプティブスレッドを用いた N:M スレッドモデルでは、純粋なファイバーやプリエンプティブなスレッドより効率的である。

 オペレーティングシステムのサポート 
スレッドに比べて、オペレーティングシステムがファイバーをサポートするために必要なことはわずかでよい。ファイバーは現代的なUnixシステム上では、GNU Portable Threadsが行っているように ucontext.h で定義されたgetcontext, setcontext, swapcontext 関数を用いて実現できる。

Microsoft Windows では、ファイバーはWindows API関数である ConvertThreadToFiber() あるいは CreateFiber() の呼び出しで作成することができる。一時停止したファイバーはどのスレッドでも復帰させることができる。変数のファイバー固有のコピーを作成するために、スレッド局所記憶に類似したファイバー局所記憶 (fiber local storage) を使用することができるFibers - Win32 apps | Microsoft Docs。

 JavaScript でのサポート 
JavaScript は元々はシングルスレッドで動作させる設計になっていたが、HTML5 より、アドレス空間を共有しない、Web Workers が追加になった。それらとは別に、Node.js では、アドレス空間を共有するが、協調マルチタスクな設計となっているファイバーが fibers パッケージfibersにて提供されている。

 脚注 

 関連項目 
 :en:Getcontext
 グリーンスレッド
 スレッド (コンピュータ)

 外部リンク 
GNU Portable threads
Portable Coroutines

Category:制御構造
Category:スレッド (コンピュータ)