ファイバー (コンピュータ)
From Wikipedia, the free encyclopedia
利点と欠点
ファイバーのマルチタスクは協調的であるため、スレッドセーフネスはプリエンプティブにスケジュールされるスレッドと比べて問題となりにくく、また暗黙のうちに同期が行われているためスピンロックなどの同期の機構や、アトミックな操作は不要である。 しかし、ノンブロッキング I/Oを行う際暗黙のうちに処理を譲るライブラリが多く、十分な注意とドキュメントの熟読が推奨される。
欠点としては、ファイバーはプリエンプティブなスレッドを用いない限りマルチプロセッシングの機構を活用できない点がある。しかし、CPU コア数以下のプリエンプティブスレッドを用いた N:M スレッドモデルでは、純粋なファイバーやプリエンプティブなスレッドより効率的である。
オペレーティングシステムのサポート
スレッドに比べて、オペレーティングシステムがファイバーをサポートするために必要なことはわずかでよい。ファイバーは現代的なUnixシステム上では、GNU Portable Threadsが行っているように ucontext.h で定義されたgetcontext, setcontext, swapcontext 関数を用いて実現できる。
Microsoft Windows では、ファイバーはWindows API関数である ConvertThreadToFiber() あるいは CreateFiber() の呼び出しで作成することができる。一時停止したファイバーはどのスレッドでも復帰させることができる。変数のファイバー固有のコピーを作成するために、スレッド局所記憶に類似したファイバー局所記憶 (fiber local storage) を使用することができる[3]。
JavaScript でのサポート
JavaScript は元々はシングルスレッドで動作させる設計になっていたが、HTML5 より、アドレス空間を共有しない、Web Workers が追加になった。それらとは別に、Node.js では、アドレス空間を共有するが、協調マルチタスクな設計となっているファイバーが fibers パッケージ[4]にて提供されている。