14

我搜索了以前关于类似主题的帖子,但找不到合适的答案,因此提出了这个问题。非常感谢您帮助回答它。

我知道通过 Linux 中的 taskset 命令设置进程对特定 CPU 内核的亲和性。但是我想设置一个 Java 线程对特定 cpu 核心的亲和性,以便属于同一进程的其他线程可以在所有剩余的核心上运行。例如,如果我有一个包含 10 个线程和 4 核机器的进程,我想为一个线程保留 core-1,并让剩余的 9 个线程在剩余的 3 核上运行。可以做到吗?怎么做?

谢谢萨钦

4

4 回答 4

11

假设 2241 是您的 java 进程的 pid。跑:

jstack 2241

这为您提供了一个线程列表。在那里找到你的并注意 nid 字段。说 nid=0x8e9,它将以 10 为基数转换为 2281。然后运行:

taskset -p -c 0 2281

完毕。

于 2012-11-15T19:12:27.327 回答
8

不幸的是,您不能将 Java 线程分配给特定的内核。但是,您可以做的是设置线程优先级来确定线程的优先级(假设这会完成同样的事情)

或者,您可以使用 JNI,但这完全是矫枉过正。

于 2012-11-15T06:11:35.970 回答
2

请记住,您运行的 Java 应用程序实际上是在 JVM 中运行的,而 JVM 又在 OS 上运行。为了让您能够直接与 CPU 交互,您需要一种低级编程语言(例如 C)。

正如另一个答案中所建议的那样,您可以使用 JNI 与较低级别的语言(如 C)进行交互以执行您想要的操作,但是您必须将并发(在该较低级别语言中管理的线程)委托给它......

于 2012-11-15T06:23:50.447 回答
1

您可以使用 JNA 在纯 Java 中执行此操作。不需要使用任务集。请记住,除非您之前已将内核与内核/用户线程和硬件中断隔离开来,否则线程关联是没有意义的。我隶属于 Coral Blocks,该公司开发了CoralThreads,正是这样做的。

于 2014-06-12T15:12:43.450 回答