跨多个内核的同一进程的多个线程

时间:2019-07-13 12:38:37

标签: java multithreading multicore

很高兴知道有可能在同一CPU的不同内核上执行多个线程。那么线程上下文切换的定义是否仍将保持不变?我的意思是地址空间仍将在不同内核的线程之间共享。同步块是否仍然可以在不同内核中运行的线程中保持安全?

1 个答案:

答案 0 :(得分:1)

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

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

Intel,AMD等所做的事情是在CPU /内核之间实现非常快速的类似于网络的通信通道。因此,当内核尝试访问未直接与其连接的内存地址时,它会通过通道向与正确的内存芯片连接的内核发送请求。该核心进行查找,然后将内容通过网络发送回去。一直有如此多的流量在不断进行,使缓存保持最新状态,等等。

这是不理想的,因为有很多硅片专用于运行该网络,而晶体管可能另外用于实现更多内核。

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

首先,这还不错-内存与CPU相比并没有那么慢。但是,它很快变得不可持续,但是到那时,世界上已经有太多的软件期望SMP环境(像所有主要OS一样小的东西)。因此,尽管当时理想的硬件体系结构迁移应该是纯NUMA(和该死的软件),但商业现实是SMP必须坚持下去。因此,出现了诸如Intel的QPI,AMD的Hypertransport等互连之类的东西。

具有讽刺意味的是,许多现代语言(Golang,Rust等)支持消息传递(CSP,Actor模型)作为该语言的一部分。如果底层硬件是纯NUMA,这正是被迫采用的编程范例。因此,我们有它;消息传递范例适用于在SMP架构之上由流行语言实现的NUMA机器,而SMP架构又是在实际NUMA硬件之上进行综合的。如果您认为这很疯狂,那么您并不孤单。

您可以将QPI,Hypertransport等视为有点像以太网连接的内存,其中CPU或Core充当其他CPU和Core的内存服务器。只有QPI,Hypertransport更快,而且所有这些都与运行在CPU上的软件隐藏在一起。