web-dev-qa-db-ja.com

スレッドを使用するのとプロセスを使用するのはなぜですか?

プログラムのさまざまな部分をさまざまなプロセスに分離することは、(私にとって)すべてを単にスレッド化するよりもエレガントなプログラムを作成するように思えます。プログラムを異なるプロセスに分離するのではなく、スレッドで実行するのはどのシナリオで意味がありますか?いつスレッドを使用する必要がありますか?


編集

シングルコアとマルチコアで異なる動作をする方法(またはするかどうか)も役立ちます。

43
danmine

次の2つの理由から、複数のプロセスよりも複数のスレッドを好むでしょう。

  1. スレッド間通信(データの共有など)は、プロセス間通信よりもプログラミングが非常に簡単です。
  2. スレッド間のコンテキスト切り替えは、プロセス間の切り替えよりも高速です。つまり、2つのプロセスで同じことを行うよりも、OSが1つのスレッドを停止して別のスレッドの実行を開始する方が高速です。

例:

GUIを使用するアプリケーションは通常、GUIに1つのスレッドを使用し、バックグラウンド計算に他のスレッドを使用します。たとえば、MS Officeのスペルチェッカーは、Officeユーザーインターフェイスを実行しているスレッドとは別のスレッドです。そのようなアプリケーションでは、代わりに複数のプロセスを使用すると、パフォーマンスが低下し、コードの作成と保守が困難になります。

72

以下のようなプロセスよりもスレッドを使用する利点とは別に

利点:

  • プロセスよりもはるかに迅速にスレッドを作成します。
  • プロセスを切り替えるよりもスレッドを切り替える方がはるかに高速です。
  • スレッドはデータを簡単に共有します

いくつかの欠点も考慮してください。

  • スレッド間のセキュリティはありません。
  • あるスレッドが別のスレッドのデータを踏みつけることができます。
  • 1つのスレッドがブロックすると、タスク内のすべてのスレッドがブロックされます。

あなたの質問の重要な部分については、「いつスレッドを使うべきですか?」

スレッドがプログラムのセマンティクスを変更してはならないという事実をほとんど考慮しないでください。それらは単に操作のタイミングを変更します。その結果、ほとんどの場合、パフォーマンス関連の問題に対する洗練されたソリューションとして使用されます。スレッドを使用する状況の例を次に示します。

  • 長時間の処理の実行:Windowsアプリケーションが計算しているとき、それ以上メッセージを処理できません。その結果、表示を更新できません。
  • バックグラウンド処理の実行:一部のタスクは時間的に重要ではないかもしれませんが、継続的に実行する必要があります。
  • I/O作業の実行:ディスクまたはネットワークへのI/Oには、予測できない遅延が生じる可能性があります。スレッドを使用すると、I/Oレイテンシがアプリケーションの無関係な部分を遅延させないようにすることができます。
32
simplyharsh

スレッドまたはプロセスが必要であることは既にわかっていると思いますので、どちらかを選択する主な理由はデータの共有にあると思います。

プロセスを使用するということは、プロセス間でデータをやり取りするためにプロセス間通信(IPC)も必要であることを意味します。ただし、プロセスを分離する場合、これは良いことです。

6
BenB

あなたは確かに初心者のように聞こえません。プロセスは、多くの点でよりエレガントであるという優れた観察結果です。スレッドは基本的に、メモリ空間間の過度の遷移や通信の過剰を回避するための最適化です。

表面的にスレッドを使用すると、スレッド間で変数とメモリを自由に共有できるため、プログラムの読み取りと書き込みが容易になるように思えるかもしれません。実際には、競合状態やデッドロックを回避するために、非常に慎重な注意が必要です。

プロセス間通信の効率を改善するために非常に一生懸命努力しているオペレーティングシステムカーネル(最も顕著な L4 )があります。このようなシステムの場合、おそらくスレッドは無意味であるという説得力のある議論をすることができます。

6
flodin

上記の回答のほとんどに同意します。しかし、設計の観点から言えば、論理的に関連する一連の操作を並行して実行したい場合は、むしろスレッドに行きたいと思います。たとえば、Wordプロセッサを実行すると、エディターとしてフォアグラウンドで実行される1つのスレッドと、バックグラウンドで実行される他のスレッドが定期的にドキュメントを自動保存するため、その自動保存タスクを個別に実行するプロセスを設計する人はいません。

2
Sanjay

他の答えに加えて、単一のプロセスの維持と展開は、いくつかの実行可能ファイルを保持するよりもはるかに簡単です。

複数のプロセス/実行可能ファイルを使用して、明確に定義されたインターフェイス/デカップリングを提供し、1つのプロセスですべての機能を保持するよりも簡単に再利用または再実装できるようにします。

2
Tim

この投稿に出くわしました。興味深い議論。しかし、1つのポイントが欠落しているか、間接的にポイントされていると感じました。

新しいプロセスの作成には、すべてのデータ構造を割り当てて初期化する必要があるため、コストがかかります。プロセスは、プロセス内でマルチスレッドを実現するために、制御の異なるスレッドに細分化されます。

スレッドまたはプロセスを使用して目標を達成することは、プログラムの使用要件とリソース使用率に基づいています。

0
Suresh