Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 跨多个核执行相同进程的多个线程_Java_Multithreading_Multicore - Fatal编程技术网

Java 跨多个核执行相同进程的多个线程

Java 跨多个核执行相同进程的多个线程,java,multithreading,multicore,Java,Multithreading,Multicore,了解到有可能在同一cpu的不同内核上执行多个线程。那么线程上下文切换的定义还会保持不变吗?我的意思是,地址空间仍将在不同内核中的线程之间共享。同时,同步块是否仍能在不同内核中运行的线程中保持安全 是的,所有现代CPU都实现对称多处理(SMP)系统。也就是说,所有内存出现在所有CPU上所有内核的地址空间中,所有内核上的相同地址表示内存芯片中的相同字节 就硬件而言,这远远不够理想。现代CPU并不是真正的SMP,而是在非统一内存体系结构(NUMA)之上合成的SMP;不同的内存位于不同CPU上的不同地址

了解到有可能在同一cpu的不同内核上执行多个线程。那么线程上下文切换的定义还会保持不变吗?我的意思是,地址空间仍将在不同内核中的线程之间共享。同时,同步块是否仍能在不同内核中运行的线程中保持安全

是的,所有现代CPU都实现对称多处理(SMP)系统。也就是说,所有内存出现在所有CPU上所有内核的地址空间中,所有内核上的相同地址表示内存芯片中的相同字节

就硬件而言,这远远不够理想。现代CPU并不是真正的SMP,而是在非统一内存体系结构(NUMA)之上合成的SMP;不同的内存位于不同CPU上的不同地址总线上(或者在某些体系结构上,位于不同的内核上)。因此,一个CPU上的内核不能直接寻址另一个CPU上的内存

英特尔、AMD等公司所做的是在CPU/内核之间实现非常快速的网络通信通道。因此,当内核试图访问未直接连接到它的内存地址时,它会通过通道向连接到正确内存芯片的内核发送请求。核心进行查找,通过网络将内容发送回。像这样的流量一直在增加,缓存保持最新,等等

这并不理想,因为有相当一部分硅专用于运行这个网络,晶体管可能被用来实现更多的核心

我们之所以这样做,是因为,回到过去,让多个CPU工作的廉价方法是将两个芯片粘在同一个内存地址/数据总线上。便宜,因为硬件便宜,而多线程软件(习惯于在单个CPU内进行上下文切换)并没有真正注意到差异

首先,这还不算太糟糕——与CPU相比,内存并没有那么慢。然而,它很快变得不可持续,但到那时,世界上有太多的软件期待SMP环境(像所有主要操作系统这样的小东西)。因此,虽然当时理想的硬件架构转变应该是纯NUMA(该死的软件),但商业现实是SMP必须持续存在。因此出现了互连,如英特尔的QPI、AMD的Hypertransport等

具有讽刺意味的是,相当多的现代语言(Golang、Rust等)支持消息传递(CSP、Actor模型)作为语言的一部分。如果底层硬件是纯NUMA的话,这正是人们不得不采用的编程范式。所以我们有了它;适用于NUMA机器的消息传递范例由SMP架构之上的流行语言实现,而SMP架构又在实际NUMA硬件之上合成。如果你认为这很疯狂,你并不孤单


您可以认为QPI、Hypertransport等有点像以太网连接的内存,CPU或内核充当其他CPU和内核的内存服务器。只有QPI、Hypertransport要快得多,而且都隐藏在CPU上运行的软件之外

这一切都是由操作系统完成的。从JVM的角度来看,您不必考虑运行在哪个核心上。所以,答案是:是的,同步块仍然是安全的。从程序员的角度来看,不同的内核是不同的处理器。您可以在任何关于多线程/多处理的书中阅读有关线程处理器关系的内容。