首页 文章

每个JVM或每个CPU核心的线程

提问于
浏览
2

如何根据每个JVM的CPU核心数创建线程与在多个JVM上运行的线程的不同创建CPU核心数上的线程数,条件是所有JVM在一个共享同一CPU的物理系统上运行?换句话说,一个并行运行8个线程的多线程Java程序与在8个不同JVM上运行的相同多线程程序共享同一个CPU?

我在下面给出了一些我可能用线程实现并行处理的方法,但是无法理解它们之间的本质区别?

Approach one: 一个线程定期查询数据库更改,并行启动(长时间运行)线程(每当发生更改时)对更改数据起作用 . (这项工作涉及算术并将结果保存到数据库中)

Approach two: 多个线程查询数据库中的数据更改,锁定已修改的数据,每个线程启动一个处理更改数据的线程(来自线程池) .

Approach three: 多个线程,本质上从不同的JVM作为单独的进程运行,查询数据库,锁定它找到的已更改的记录并启动线程(从线程池中每个线程都有,池上的最大线程是CPU核心数) )处理变更数据 .

第三种方法是否比其他两种方法更好?如果是/否为什么? (因为监视线程在不同的JVM上运行,所以每个人都可以创建与CPU核心一样多的线程?例如,在8核CPU中,在单独的JVM上创建8个监视线程(作为单独的进程),每个他们将更改作业提交到8的线程池?但是,这个参数不会失败,因为只有8个物理内核,处理器在任何时候只能运行8个线程吗?)

您还有其他任何有效的方法来实现此方案吗?

1 回答

  • 3

    我想你的答案归结为:

    • 在一个进程中处理一个线程,故事结束 .

    • 在一个进程中处理多个线程 .

    • 在多个进程中处理多个线程 .

    如果您的目标是尽可能多地使CPU饱和,并以最快的速度执行处理,那么答案通常是#2,在一个进程中有多个线程 .

    多个进程中的多个线程对您没有多大帮助,并且有几个缺点:

    • 如果所有线程都在同一进程中,那么它们可以使用超薄互斥锁/锁(进程内互斥锁/锁),其性能明显优于进程间互斥锁/锁 . 多个进程意味着使用内核提供的锁定原语,这些原语通常要慢得多 .

    • 如果所有线程都在同一个进程中,它们都可以访问相同的内存,并将所有内存汇集在一起 . 将所有内容都放在一个堆中意味着数据共处,而托管可以提高CPU缓存性能 . 此外,如果必须在多个进程中的线程之间共享数据,则需要使用共享内存(在Java中很麻烦)或消息传递(这会复制数据,浪费CPU和内存) .

    使用多个进程的唯一好处是您可以轻松执行权限分离 .

相关问题