7

私は現在、Scala のアクターについて学んでいます。この本では、システムが使用するスレッドを減らすことができるため、のreact代わりに メソッドを使用することを推奨しています。receive

スレッドの作成にコストがかかる理由を読みました。しかし、いったんスレッドを取得すると (初期化後に Scala のアクター システムに保持する必要があります)、それらを使用するとコストがかかる理由は何ですか?

主にメモリ消費ですか?それとも他の理由がありますか?

4

3 に答える 3

10

多くのスレッドを使用すると、予想よりもコストがかかる場合があります。理由は次のとおりです

  • 各スレッドはヒープ外のメモリを消費するため、JVM 用に作成できるスレッドの数が制限されます。
  • あるスレッドから別のスレッドに切り替えると CPU 時間が消費されるため、単一のスレッドで実行できるアクティビティがある場合は、CPU サイクルを節約できます。
  • より多くのスレッドがある場合、より多くの作業を行うJVMスケジューラがあります。基盤となる OS スケジューラーにも同じことが当てはまります。
  • 最後に、CPU バウンドのタスクに CPU コアよりも多くのスレッドを使用してもほとんど意味がなく、I/O アクティビティ (ネットワーク クライアントなど) よりも多くの I/O スレッドを使用してもほとんど意味がありません。
于 2012-05-08T14:03:31.383 に答える
2

スレッドを使用することによるメモリ オーバーヘッド (小さい場合も小さい場合もあります) に加えて、通常、スレッドを多く使用することは、CPU を取得するスレッドを選択するときに、スケジュールで考慮すべき要素が増えることを意味します。次。

一部のオペレーティング システム/JVM では、同時に存在できるスレッドの量に制限がある場合もあります。

最終的には、最終的に大きな原因となる小さなオーバーヘッドの蓄積です。そして、これは実際には Java に固有のものではありません。

于 2012-05-08T14:02:24.457 に答える
2

スレッドを持つことは「高価」ではありません。もちろん、ここで話している数によって多少異なります。何十億ものスレッドが問題になると思います。一般的に言えば、多くのスレッドを持つことは、より多くの並列作業を行うことができるため、コストがかかると考えられていると思います。これにより、CPU が増加し、メモリが増加します...しかし、それらが正しく管理されている場合 (たとえば、システム リソースを保護するためにプールされている場合)、大丈夫です。JVM は必ずしもネイティブ スレッドを使用するとは限らないため、Java スレッドは必ずしも OS ネイティブ スレッドにマップされるとは限りません (たとえば、グリーン スレッドや軽量スレッドを見てください)。私の意見では、JVM のスレッドには暗黙のコストはありません。コストは、不十分なスレッド管理と、リソースに不用意に作業を割り当てることによるリソースの過剰使用に起因します。

于 2012-05-08T14:04:14.063 に答える