私はちょうどcachingについての質問を書いてくれました。厳密なAPIを持つサーバープロセスを使用している場合、サーバーlibは静的にリンクされている可能性があります(それ自体のスレッドの可能性もあります)。プロセスはスレッドより遅いです
遅い場合、オーバーヘッドはいくらですか? OSはLinuxですが、私の開発とテストのほとんどはウィンドウズ上にあります。
私はちょうどcachingについての質問を書いてくれました。厳密なAPIを持つサーバープロセスを使用している場合、サーバーlibは静的にリンクされている可能性があります(それ自体のスレッドの可能性もあります)。プロセスはスレッドより遅いです
遅い場合、オーバーヘッドはいくらですか? OSはLinuxですが、私の開発とテストのほとんどはウィンドウズ上にあります。
はい、コンテクストの切り替えやデータのコピーを余儀なくされるため、処理が遅くなります。これは、例えばSQLiteが普及している理由の1つです。
どのくらいのオーバーヘッドについては、「それは依存しますが、答えは「あなたには問題ありません」と思われます。いつものように、疑わしい場合は、両方の方法を試してベンチマーク/プロファイルするだけです。
です。
スレッドとプロセスの間で、Linuxではコンテキスト切り替えが実際には異なるとは思いません。しかし:
は、新しいプロセスを開始する(例えばposix_spawnまたはフォーク/ Execで)あなたは、ダイナミックリンカを起動する新しいプロセスイメージを、ロードする必要があるため、新しいスレッドを開始するよりも遅くなり、他のことを行います
複数のプロセスシステムでは、共有するデータ構造によっては、マルチスレッドよりも多くのメモリを使用できます。もちろんこれはパフォーマンスに影響を与え、他のもののメモリを少なくします。
"forkしますがexecしない"プロセスは、プロセスとスレッドの中間にあります。しかし、彼らは独自の問題を抱えています(例えば、多くのライブラリはファイル記述子を別のプロセスと共有すると混乱します)。
少なくともARMでは、プロセススイッチとスレッドスイッチのパフォーマンスが大幅に向上します。これは、仮想アドレス空間の変更によってキャッシュフラッシュが発生するためです。 – blueshift
@blueshift:IIRCの新しいARMは、仮想的にタグ付けされた仮想的なタグ付きキャッシュをもはや持っていないので、これは新しいARMには当てはまりません。 OTOHでは、TLBと分岐予測子をフラッシュする必要があるかもしれません。 – ninjalj