4

重複の可能性:
Java スレッド アフィニティ

サーバーがあり、16 コアの CPU を搭載しています。

Java では、いくつかのスレッドを作成する必要があります (スレッドの数は 16 未満です)。各スレッドは、イベント キューの処理など、いくつかの操作を実行する必要があります。

これらのスレッドを作成して、各スレッドが 1 つのコアに永久に割り当てられることを保証するにはどうすればよいですか? OSが1つのスレッドのコアを交換したくないということです。1 つのスレッドが固定コアで専用に実行されていることを願っています。

それをしてもいいですか?


これが欲しい理由は

いくつかのバックグラウンド タスク (計算集約型) といくつかのユーザー向けタスクを同じサーバーで処理しています。ユーザー側に悪影響を与えたくありません。例えば、私の計算タスクが 16 個のコアに割り当てられた場合、ユーザー側で実行されているスレッドは確実に悪影響を受けますよね?

4

4 に答える 4

5

できません。JVM はすべてのハードウェアを仮想化するため、そのようなことはできません。

特定のアーキテクチャと特定の JVM で機能する「トリック」がいくつかある可能性がありますが、それはすべてハックであり、信頼性が低くなります。

于 2012-05-04T10:05:34.233 に答える
2

これで貴重な開発時間を無駄にしないでください。その他いくつかの問題を修正します。OS コアの管理にかかる時間がアプリにとって問題である場合、いずれにせよ、アプリは失敗の瀬戸際にあります。

于 2012-05-04T10:18:24.750 に答える
1

いいえ、OS スケジューラはスレッドをコアに割り当てるためのものであるため、それを行うことはできません。Java アプリが実行されている JVM は、それにアクセスできません。

于 2012-05-04T10:06:54.583 に答える
1

すべきではありません。

本当に必要な場合は、ネイティブ呼び出しを使用できます: Java スレッド アフィニティ

しかし、実際には、これを行うには十分な理由があることを確認してください。なぜそれが良い考えだと思いますか?

于 2012-05-04T10:08:57.980 に答える