0

スレッドのプールを使用してマルチスレッドを使用する Java プログラムがあります。各スレッドは、いくつかの select ステートメントと insert ステートメントを作成します。DB は MySQL InnoDB です。

複数の実行画面 (6 つのプロセス) を起動する予定で、各プロセスはマルチスレッドを使用する予定です。私の質問は次のとおりです。

1) プールに対していくつのスレッドを定義できますか? プロセッサが Core i7-2640M であるため、最大 4 スレッドに制限されますか?

2) DB の整合性に関して何か心配する必要がありますか? 私は自分のプログラムで同期を使用しませんでした (thre は必要ありません) が、DB 挿入ステートメントが心配です。それらを同期する必要がありますか、またはメイン関数のプロセスごとに 1 つの接続があることを知っている MySQL がそれを処理します。

教えてください。

4

2 に答える 2

1

2) から始めて、分離レベルを監視している限り、DB の整合性が保証されます。挿入がアトミックでない場合、または選択が他のスレッドからの挿入タイミングを気にする場合は、トランザクションを使用します。

1) スレッドの最適な数は、これらのスレッドが何をするかに大きく依存します。リモート データベース トランザクションが完了するのを待っているスレッドは、利用可能なコアを必要としません。コア数の 4 倍程度から始めて、そこからテストを開始することをお勧めします。OS によっては、プロセスとスレッドのベンチマークも行う必要があります。

于 2012-11-22T14:00:51.603 に答える
0

糸量について

必要に応じて、1 つのコアで 100 のスレッドを使用できます。OSはそれらをスケジュールして、それぞれが実行する時間を確保します。実行中のコンピューターには、すでに数百のアクティブなスレッド/プロセスがあり、それらのほとんどはアイドル状態です (Windows タスク マネージャーはその情報をどこかに表示します)。

CPU の各コアは、一度に 1 つのスレッドを実行できます。i7-2640Mには 2 つの物理コアがありますが、それぞれがハイパースレッディング (= 1 つの物理コアで 2 つのスレッドを「並列」で実行) を行うため、4 つのコアを使用して作業できます。

最適なスレッド数を概算するには、スレッドのアクティブ度を知る必要があります。各スレッドがスリープ/待機なしで常に実行されると、完全なコアが占有されます。その場合、4 つを超えるスレッドを使用しないでください。スレッドは互いにブロックするだけだからです。アクティブなスレッド間の切り替えには CPU の時間がかかるため、スレッドが増えると全体的なパフォーマンスが低下します。

スレッドが待機している場合は、アクティブの割合を把握する必要があります。たとえば、各スクリーンスレッドはほとんどの場合、ユーザー入力を待ちます。各入力の処理には 1 秒かかり、各画面は 1 分あたり 30 イベントを受け取ると予想されます。つまり、それぞれに 1 分あたり約 30 秒かかるということです。1 分間に 4 x 60 秒あるので、最適なスレッド/スクリーン数は約 8 になります。

小さなタスクを実行するエグゼキュータがあり、それぞれが数秒以内に完了する場合は、コアとほぼ同じ数のスレッドを使用します。エグゼキューターによって小さなタスクをスレッドに分散できるため、各コアの負荷を約 100% に戻すことができます。

データベースの整合性について

Eugen Rieckを参照してください。トランザクションは、アトミックな変更を保証する方法です (= 他のプロセスはトランザクションの開始と終了の間の状態を見ることができません)

于 2012-11-22T14:38:01.020 に答える