我搜索了之前关于类似主题的帖子,但找不到合适的答案因此问这个问题。非常感谢您帮助回答它。
我知道在Linux中通过taskset命令设置进程对特定CPU核心的亲和力。但我想设置一个Java线程与特定cpu核心的亲和力,以便属于同一进程的其他线程可以在所有剩余的核心上运行。例如,如果我有一个包含10个线程和4核机器的进程,我想为一个线程保留core-1,并让剩余的9个线程在剩余的3个核心上运行。可以这样做吗?
由于 萨钦
答案 0 :(得分:10)
说2241是你的java进程的pid。运行:
jstack 2241
这为您提供了一个线程列表。在那里找到你的并注意nid字段。说nid = 0x8e9,它转换为基数10为2281.然后运行:
taskset -p -c 0 2281
完成。
答案 1 :(得分:7)
不幸的是,您无法将Java线程分配给特定的核心。但是,您可以设置Thread Priorities来确定线程的优先级(假设这样可以完成同样的事情)
或者,您可以使用JNI,但那将是完全矫枉过正的。
答案 2 :(得分:2)
请记住您的运行实际在JVM中运行的Java应用程序,而JVM又在操作系统上运行。为了能够直接与CPU交互,您需要一种低级编程语言(例如C)。
正如在另一个答案中所建议的那样,您可以使用JNI与较低级别的语言(如C)进行交互,以执行您想要的操作,但是您必须将并发(在较低级别的langaguge中管理的线程)委派给它... < / p>
答案 3 :(得分:0)
您可以使用JNA在普通Java中执行此操作。没有必要使用任务集。请记住,线程关联是没有意义的,除非您之前已将内核/用户线程和硬件中断与核心隔离开来。我隶属于Coral Blocks,它开发了CoralThreads,确实如此。