缓存相干性:线程与内核



我目前正在研究并发系统,并且同时使用多个线程和多个核心时,我与高速缓存相干性的概念有点混淆。

我了解的一些假设:

  • 核心有caches
  • 内核可能一次具有多个线程(如果超线程(
  • 线程是正在处理的单行命令
  • 因此,线程不是物理硬件,线程没有缓存并使用核心的缓存

假设核心具有我们有两个线程,而x是一个共享变量,值五。两者都想执行:

my_y = x;

其中my_y是两个线程定义的私有变量。现在假设线程0执行:

x++;

最后,假设线程1现在执行:

my_z = x;

其中 my_z是另一个私人变量。

我的书说:

my_z的值是多少?是五吗?还是六个?问题在于(至少(x的三个副本:主内存中的一个,一个线程0的缓存中的一个,一个中的一个副本。

中的一个。

这是如何工作的?x的至少三个副本如何,为什么这本书指定每个线程都有自己的缓存?对我来说,运行两个线程的核心在其缓存中具有x的值,因此这两个线程都具有"他们的"(共享(缓存。

,这是有道理的。

换句话说,当更新x++时,将更新核心缓存中的值。然后,线程1将执行仍在核心缓存中的my_z = x;,并且是最新的。因此,由于两个线程基本共享缓存。

这本书可能假设每个核心只有一个线程,但是该书以前确实提到过"如果线程多于内核"。"如果有更多的线程比内核更多"意味着核心具有多个线程(超线程(,或者是否有某种线程调度,以便每个核心一次只有一个线程?

即使是这种情况(核心的调度和核心只能一次有一个线程(,如果核心拥有线程0,执行x++,然后获得试图执行my_z = x;值的线程1如果我没记错的话,X仍存在于该核心的缓存中。

奖励问题:线程的私人变量如何存储在内存中?它们是否以与使用核心缓存中复制的任何变量相同的方式存储?如果是这种情况,如果多个线程使用缓存,则在核心缓存中拥有一个私有变量是一个问题 - 无论是同时还是计划?

根据@biziclop的请求,该书指出以下假设:

  • 我们使用MIMD系统,即节点具有相同的架构。(这本书没有具体说明这是哪种体系结构(
  • 我们的程序是SPMD。因此,我们将编写一个可以使用分支来具有多种行为的单个程序。
  • 我们假设核心是相同但异步运行的。
  • 我们以C语言进行编程,在本节中,我们重点介绍了Pthreads。

任何帮助将不胜感激!

为什么这本书指定每个线程都有自己的缓存?

作者是草率的。线没有缓存。线程运行的处理器内核具有缓存。

这本书以前做过[说]"如果线程多于内核"。这是否意味着核心具有多个线程(超线程(,或者是否有某种线程调度,以便每个核心一次只有一个线程?

其中一件事情都可能是真的。我们已经确定作者对语言有些草率,因此将其引用到上下文中,没有办法告诉它是比核心或更多软件线程更多的硬件线程。

如何存储在内存中的线程的私人变量?

过程中的所有线程都会查看相同的确切虚拟地址空间。从最广泛的意义上讲,"私有"只是描述了一个仅由一个线程使用的内存位置,而为什么该位置仅由一个线程使用。

从更狭窄的意义上讲,每个线程都有一堆功能激活记录(又称"呼叫堆栈"(,其中包含所有活动函数调用的参数和局部变量。在许多编程语言中,一个线程不可能与任何其他线程共享其ARG或当地人,因此这些内存位置会自动"私有"。在其他编程语言中,可能共享ARG或本地,但是程序员必须编写明确的代码以共享它,无论如何,这可能是一个坏主意。

如果多个线程使用缓存,则在核心缓存中拥有一个私有变量是一个问题 - 无论是同时还是计划?

当两个不同的内存位置都放在同一缓存位置时,称为 collision 。是的!碰撞发生了几次。如果某个缓存线包含变量x,而线程t希望访问恰好使用同一缓存线的变量y,则内存系统将使线程t等待从主内存中获取数据。

该现象也称为"错误共享"(通常是出现问题时(,您可以使用Google搜索策略以避免您确定它实际上会降低其性能您的程序。

最新更新