9

Java、C#、および C++ でのスレッド作成の実際のコストはどれくらいですか? スレッドが一連の操作を作成しているときに、スレッドスタックの割り当て、記述子の初期化などを行う必要があることを私は知っています。

しかし、私は実際のコストに興味があります。C# と Java は異なる VM と異なる JIT を使用し、C++ はネイティブ コードを実行します。したがって、スレッドの作成時間はこれらすべての言語で異なります。また、Java でのスレッド作成は C# よりもはるかに遅いと聞きました。誰かがこの問題について正式な回答と説明を与えることができますか?

4

3 に答える 3

5

スレッドが作成されると、このようになります。

新しいスレッドが作成されると、コード セクション、データ セクション、および開いているファイルなどのオペレーティング システム リソースを他のスレッドと共有します。ただし、独自のスタック、レジスタ セット、およびプログラム カウンタが割り当てられます。

スレッドコスト

スレッド化は、メモリの使用とパフォーマンスの点で、プログラム (およびシステム) に実際のコストをもたらします。各スレッドは、カーネル メモリ空間とプログラムのメモリ空間の両方にメモリを割り当てる必要があります。

スレッドを管理し、そのスケジューリングを調整するために必要なコア構造は、有線メモリを使用してカーネルに保存されます。スレッドのスタック スペースとスレッドごとのデータは、プログラムのメモリ スペースに格納されます。

これらの構造のほとんどは、最初にスレッドを作成するときに作成および初期化されます。このプロセスは、カーネルとの対話が必要なため、比較的コストがかかる可能性があります。

セカンダリ スレッドに割り当てられるスタック領域の量など、これらのコストの一部は構成可能です。スレッドを作成するための時間コストは大まかな概算であり、相互の相対的な比較にのみ使用する必要があります。スレッドの作成時間は、プロセッサの負荷、コンピュータの速度、使用可能なシステムおよびプログラム メモリの量によって大きく異なります。

ここに画像の説明を入力

スレッドはメモリを消費しません (一定サイズのスタックを除いて)。プロセスはメモリを消費します。スレッドの要点は、プロセス状態を共有することです。

共通言語ランタイム(CLR) スレッドのスタック領域は、デフォルトで 1MB (64 ビット コード スレッドの場合は 4MB) に設定されています (CLR によってコミットされます)。

C++ では、スタック用に 1MB を予約します (アドレス空間をマップします) が、必ずしも物理メモリに割り当てられるわけではなく、その一部のみが割り当てられます。スタックがそれ以上に大きくなると、ページ フォールトが生成され、より多くの物理メモリが割り当てられます。

Java スレッドの作成にはかなりの作業が必要なため、コストがかかります。

  • スレッド スタック用に大きなメモリ ブロックを割り当てて初期化する必要があります。

  • ホスト OS でネイティブ スレッドを作成/登録するには、システム コールを実行する必要があります。

  • 記述子を作成、初期化し、JVM 内部データ構造に追加する必要があります。

また、スレッドが生きている限りリソースを拘束するという意味でもコストがかかります。たとえば、スレッド スタック、スタックから到達可能なすべてのオブジェクト、JVM スレッド記述子、OS ネイティブ スレッド記述子などです。

于 2013-10-15T12:50:01.973 に答える
0

C++ は、習得が難しい言語かもしれませんが、一般に実行が速い言語です。したがって、より基本的な機能を理解するのに時間がかかり、アプリケーションを作成するときにコーディングのプロセスが遅くなる可能性があります

于 2013-10-14T06:34:59.260 に答える