一部のオペレーティングシステム(OpenBSDなど)では、スレッドはユーザーランドのみであり、ほとんどの場合、互換性のために存在します。そのタイプの実装を無視すると、カーネルレベルのスレッドの使用はマルチプロセス設計とどのように比較されますか?それぞれのセキュリティへの影響は何ですか?パフォーマンスはどうですか?開発の複雑さ?
1 に答える
デフォルトでは、スレッドはすべてを共有します。デフォルトでは、プロセスは何も共有しません。したがって、唯一の違いは共有の量です。Plan 9 と Linux は、新しいプロセス、新しいスレッド、またはその間の何かを作成できる単一のシステム コール ( rfork()
Plan 9 の場合、Linux の場合) を提供します。clone()
一部のプラットフォームはサポートしていませんfork()
(例: Win32、Java)。これにより、新しいプロセスを作成するのに非常にコストがかかり、スレッドがパフォーマンスに役立つという広範な信念につながりました.
スレッドはプロセスよりも簡単に作成できますが、POSIX API を使用するとプロセスを非常に効率的に作成できます。それでも、新しいプロセスの作成が遅いシステムもあります。
シングル CPU コンピューターでは、同じプロセスのスレッド間のコンテキスト切り替えは、異なるプロセス間よりも高速になる可能性があります (例: TLB をフラッシュする必要はありません)。これがパフォーマンスに大きな影響を与えるには、コンテキストを頻繁に切り替える必要があります。SMP マシン上の OTOH では、異なるコアで実行されているスレッド間でデータを共有することは、一部のデータがキャッシュ間で移動する必要があることを意味する場合があります (キャッシュライン バウンス)。マルチスレッド プログラムのパフォーマンスを予測するのは難しい場合があります。
セキュリティ的には、スレッドはすべてを共有するため、スレッド間で保護されていないことを意味し、ある意味では仮想メモリ OS の前の時代に戻るようなものです。
複雑さに関しては、マルチスレッド プログラムを正しく記述することは、非マルチスレッド プログラムを正しく記述することよりも困難です (桁違いに難しいと言う人もいます)。さらに悪いことに、マルチスレッド プログラムを作成することは、イベント駆動型プログラムを作成するよりも、初心者にとって明らかに簡単に見えます。