当前位置: 首页 > 知识库问答 >
问题:

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

宫高义
2023-03-14

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

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

方法一:线程周期性地查询数据库更改,并行地启动(长时间运行的)线程(每当发生更改时)来处理更改数据。(工作涉及到算术和将结果保存到数据库)

方法二:多线程查询数据库中的数据更改,锁定修改后的数据,每个线程启动一个线程(从线程池)来处理更改数据。

方法三:多个线程(本质上是作为单独的进程从不同的JVM运行)查询数据库,锁定它找到的已更改的记录,并启动线程(从每个线程拥有的线程池,池上的最大线程为CPU核数)来处理更改数据。

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

您有没有其他有效的方法来实现这个场景?

共有1个答案

岑彬炳
2023-03-14

我想你的答案可以归结为:

  • 在一个进程中使用一个线程进行处理,故事结束。
  • 在一个进程中处理多个线程。
  • 在多个进程中使用多个线程进行处理。

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

在多个进程中使用多个线程并不会为您带来太多好处,它有几个缺点:

>

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

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

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

  •  类似资料:
    • Per-cpu 变量是一项内核特性。从它的名字你就可以理解这项特性的意义了。我们可以创建一个变量,然后每个 CPU 上都会有一个此变量的拷贝。本节我们来看下这个特性,并试着去理解它是如何实现以及工作的。 内核提供了一个创建 per-cpu 变量的 API - DEFINE_PER_CPU 宏: #define DEFINE_PER_CPU(type, name) \ DEFINE_

    • 我不太理解参数。在我看来,“任务”对应于执行器中的“线程”或“进程”。假设我将“spark.task.cpus”设置为2。 > 线程如何同时使用两个CPU?它不会需要锁并导致同步问题吗? 我正在查看部署/执行器/Executor.scala中的函数,在这里我看不到任何“每个任务的cpu数量”的概念。那么Spark最终在哪里/如何在独立模式下为任务分配多个cpu呢?

    • 但是堆栈创建是如何工作的呢?Java是否在创建每个线程时为其创建堆栈?如果是,堆栈在内存上的具体位置?它当然不在“托管”堆中。 JVM是从本机内存创建堆栈还是为堆栈预先分配了一段托管内存区域?如果是,那么JVM如何知道如何创建线程呢?

    • 问题内容: 我能否查看当前python应用程序正在使用的处理器使用量(占最大值的百分比)? 场景:只要不消耗超过X%的CPU能力,我的主机就可以允许我运行我的应用程序,因此我希望它“关注自身”并放慢速度。那么我如何知道该应用程序使用了多少CPU? 目标平台是* nix,但是我也想在Win主机上进行。 问题答案: 从(2.5)手册中: 次() 返回一个五元组的浮点数,以秒为单位指示累计(处理器或其他

    • 问题内容: 假设我的应用程序运行2个线程(例如渲染线程和游戏更新线程)。如果它运行在具有多核CPU的移动设备上(当今通常是这样),我是否可以期望在可能的情况下自动将线程分配给不同的内核? 我知道底层的OS内核(Android linux内核)决定调度。我的问题是我是否需要做 任何其他事情 才能启用多核功能,还是自动而透明的? 问题答案: 您需要做的是允许两个线程尽可能独立地运行。如果您有两个始终在

    • 问题内容: 您能否解释一下已经在各种servlet实现中实现的两种方法: 每个连接线程 每个请求的线程 以上两种策略中的哪一种可以更好地扩展,为什么? 问题答案: 以上两种策略中的哪一种可以更好地扩展,为什么? 每个请求线程的可伸缩性比每个连接线程的可伸缩性更好。 Java线程非常昂贵,通常每个线程都使用1Mb的内存段,无论它们是活动的还是空闲的。如果为每个连接提供自己的线程,则该线程通常在连接的