1. ホーム
  2. multithreading

[解決済み】糸と繊維の違いは何ですか?

2022-04-08 12:49:04

質問

糸と繊維の違いは何ですか?rubyのファイバーは聞いたことがあるし、他の言語でも使えると聞いたことがあるのですが、どなたかスレッドとファイバーの違いをわかりやすく説明していただけませんか?

どのように解決するのですか?

最も単純に言えば、スレッドは一般にプリエンプティブであると考えられており(OSによっては必ずしもそうでない場合もありますが)、ファイバーは軽量で協調的なスレッドであると考えられています。どちらも、アプリケーションの実行経路としては別物です。

スレッドの場合:現在の実行パスはいつでも中断または先取りされる可能性があります(注:この記述は一般論であり、OS/スレッドパッケージ/その他によって常に正しいとは限りません)。つまり、スレッドにとってデータの整合性は大きな問題であり、あるスレッドがデータの塊を更新している途中で停止し、データの整合性が悪い状態や不完全な状態で放置される可能性があるということです。これは、OSが複数のスレッドを同時に実行することで複数のCPUやCPUコアを活用し、データアクセスのガードを開発者に任せることができることも意味しています。

ファイバーの場合:現在の実行経路は、ファイバーが実行をゆだねるときのみ中断されます(上記と同じ注意点)。つまり、ファイバーは常に明確に定義された場所で開始・停止するため、データの整合性が問題になることは非常に少なくなります。また、ファイバーはユーザー空間で管理されることが多いため、高価なコンテキストスイッチやCPUの状態変更を行う必要がなく、あるファイバーから次のファイバーへの変更が非常に効率的です。一方、2つのファイバーをまったく同時に実行することはできないので、ファイバーを使うだけでは、マルチCPUやマルチCPUコアの利点を生かすことはできない。