Java在操作系统中使用了多少处理器?

Java在操作系统中使用了多少处理器?,java,concurrency,Java,Concurrency,我删除了旧问题,因为这是一个更清楚的问题。 如果任何java进程是在多核CPU上启动的,那么该java进程将分配给哪个核?这是特定于操作系统的吗?如果java进程启动了许多线程,那么其他内核是否有机会运行这些线程,或者只有启动java进程的内核才能处理这些线程 寻找建设性的答案 如果任何操作系统是多处理器的,那么JVM使用所有操作系统还是其中一个 在大多数现代硬件架构上,JVM将使用操作系统提供给它的所有CPU/内核 由于处理器有不同的内存上下文,所以它们相应的内存线程也会有不同的内存上下文,所

我删除了旧问题,因为这是一个更清楚的问题。 如果任何java进程是在多核CPU上启动的,那么该java进程将分配给哪个核?这是特定于操作系统的吗?如果java进程启动了许多线程,那么其他内核是否有机会运行这些线程,或者只有启动java进程的内核才能处理这些线程

寻找建设性的答案

如果任何操作系统是多处理器的,那么JVM使用所有操作系统还是其中一个

在大多数现代硬件架构上,JVM将使用操作系统提供给它的所有CPU/内核

由于处理器有不同的内存上下文,所以它们相应的内存线程也会有不同的内存上下文,所以它们不会有并发问题

呃,没有?我不知道你在问什么,但并发的整个问题是CPU有自己的缓存。这就是内存同步和锁定如此重要的原因。线程可能会对其缓存内存进行本地更改,或者由于其他线程对中央存储所做的更改,其缓存内存可能会失效。因此,多处理器和不同的内存上下文肯定存在并发问题

编辑:

这里是我的主要疑问:如果JVM P1、P2、P3、P4使用4个进程,那么在一个进程下运行的线程将面临并发问题,P1下的线程T1和P2下的线程T2将永远不会有并发问题,因为它们具有不同的内存上下文。我是对还是错

你错了。JVM将在与同一操作系统上运行的其他进程争用的4个处理器上调度您的4个用户线程和其他后台线程gc、finalizer、jmx等。有时,JVM可能使用全部4个处理器,或者可能不使用处理器,具体取决于操作系统上运行的其他进程

如果T1和T2在不同的处理器上,那么它们可以同时运行。除非共享数据,否则所有线程都不会出现并发问题。如果T1对T2也在使用的对象进行更改,则T2可能会看到这些更改,也可能看不到这些更改,这取决于正在使用的同步。这种内存同步是多线程编程的一个大问题。例如:

 static Integer sharedValue = 1;
 ...
 // thread T1 changes the shared value
 sharedValue = 2;
 ...
 // thread T2 reads the shared value later
 // it is unknown whether this will print 1 or 2
 System.out.println("shared = " + sharedValue);
如果T2被调出,T3在同一个处理器上运行,那么实际上可能会出现较少的并发问题,因为它们都使用相同的CPU缓存,但您仍然需要担心锁定问题。例如,如果T2任务执行一个看似原子但实际上是3个操作get、increment、store的+,则它可能在增量之后但在存储之前中断,并可能覆盖T3的增量:

 static int counter = 0;
 ...
 // thread T2
 // 3 operations: get, increment, store
 // this thread might be interrupted in the middle causing a ++ to be lost
 counter++;
 ...
 // thread T3
 // 3 operations: get, increment, store
 // this thread might be interrupted in the middle causing a ++ to be lost
 counter++;
 ...
 // later on, even if T2 and T3 have completed, you may see the counter as 1 or 2
 System.out.println("counter = " + counter);

因此,即使线程是在多处理器系统上运行还是在单处理器系统上运行,锁定也是一个问题。请参见此处了解一个问题。

听起来您需要理解线程和并行性之间的区别

线程是一种执行原语,其中的指令在CPU上运行

并行性是多个线程同时执行的可能性

作为实现细节,JVM运行多个线程用于内部目的。例如,垃圾收集器在代码的一个单独线程上运行。类似地,您使用的代码和库可能会生成任意数量的线程,作为其自身实现的一部分。它们是否会并行运行则是另一回事

操作系统负责将CPU内核分配给线程,以便它们可以运行,而这些最终将限制程序的潜在并行性

是的,并发问题确实存在,因为线程本身就是邪恶的

如果任何操作系统是多处理器的,那么JVM使用所有操作系统还是其中一个

JVM将使用操作系统允许的内核数。。。最多可运行线程数

我这样问是因为在一个处理器中,一次只运行一个线程,所以如果有4个处理器,那么在那个时候将运行4个线程

最多可以同时运行4个线程。这取决于线程是否可运行,以及操作系统是否准备在4个内核上调度应用程序的线程。一个系统通常会运行其他进程以及JVM

由于处理器有不同的内存上下文,所以它们相应的内存线程也会有不同的内存上下文,所以它们不会有并发问题

Java中的并发性是一个大话题。我建议您从阅读Java教程中关于主题的部分开始

是的。。。不同的内核将共享相同的地址空间,正确的是,它们将具有不同的内存上下文。具体来说,它们不会共享寄存器集,也可能不会共享内存1/2/3级内存缓存。但是,如果您遵循编写correc的规则 t多线程Java代码,应该没有问题。JLS中作为Java内存模型指定的这些规则使多线程程序在一个线程所做的更改对另一个线程可见时可以和不能假设的内容变得非常清楚

更新

这里是我的主要疑问:如果JVM P1、P2、P3、P4使用4个进程,那么在一个进程下运行的线程将面临并发问题,P1下的线程T1和P2下的线程T2将永远不会有并发问题,因为它们具有不同的内存上下文。我是对还是错

很难知道你的意思,因此很难判断你是对还是错

然而:

如果您有4个进程,那么每个进程将运行自己的JVM。每个JVM有一个进程。不多也不少

每个线程都属于一个JVM,因此属于一个进程,在正常情况下不能干扰属于另一个JVM的线程。不同的进程不会共享内存上下文,除非您采取措施使其发生。操作系统确保进程地址空间/内存上下文是分开的。如果不是这样的话,这将是一个重大的安全问题

属于一个JVM的线程可以相互干扰。它们确实共享相同的虚拟地址空间,尽管内存共享并不完美,请参见上文关于缓存等的内容

线程到核心的映射是动态的;i、 它可以改变毫秒。但是,操作系统确保不同进程中的线程之间没有不必要的内存上下文泄漏


1-当进程使用共享内存段时,画面很复杂。但是,在纯Java中无法做到这一点,即使在JVM中的本机代码库中也很难做到。

这个问题写得不好。我在回答中添加了一些示例。如果你愿意,可以在评论中提问。