【问题标题】:Managing thread access to unique RAM address from Multi Cores管理多核对唯一 RAM 地址的线程访问
【发布时间】:2013-07-04 11:30:20
【问题描述】:

同一进程(程序)的线程是否曾经分布在多个内核上?

在多核/处理器系统中,每个内核是否都可以访问整个 RAM,或者 RAM 在逻辑上是否在多个内核之间划分?

这两个内核不可能处理不同的线程,每个线程都需要“锁定”对 RAM 地址的访问以保证原子性。在单个内核上,每条汇编代码指令都是原子的,因为原子性的量子是内核时钟周期。在多核上,这是不能假设的,因为虽然第一个核没有前进到下一条汇编指令,但另一个核可能已经弄乱了 RAM 中第一个核最初加载到要处理的寄存器中的值。

直觉上我知道这一定会导致多核系统出现问题,但我没有任何可靠的东西可以继续我的研究。感谢所有帮助。

【问题讨论】:

  • 是的,多个线程可以访问同一个内存 - 由您来编写线程,所以这不是问题。这是所谓的“线程安全”编程的本质。另请注意,编写良好的代码将在 90% 的时间内保持缓存一致性 - 内核将处理数据的不同“副本”。但是当另一个线程写入我缓存中的块时,它是脏的,我不能使用它。巨大的速度惩罚。
  • 我推荐一本大学级别的操作系统教科书,可能还有一本数据库系统教科书。两者都处理如何解决同步问题。
  • 另外,由于现代 CPU 架构(具有流水线和乱序执行),即使是单核上的指令也不是“原子的”。
  • 感谢millimoose 指出这一点,我会这么说的。还有一些内部时钟以与全局 CPU 时钟不同的速度运行以执行不同的指令。 (例如 P4 ALU 以 x2 运行)。不仅如此,指令是扩展为微代码 RISC 指令批的宏。所以非常不是原子的。不是在谈论像 integer divide 这样的指令,它需要不同数量的周期,具体取决于操作数,并且可以达到 20 甚至更多才能完成。

标签: multithreading


【解决方案1】:

同一进程(程序)的线程是否曾经分布在多个内核上?

是和不是。检查您的操作系统的文档。

在多核/处理器系统中,每个内核是否都可以访问整个 RAM,或者 RAM 在逻辑上是否在多个内核之间划分?

所有内核都可以访问所有 RAM - 在合理范围内 - 并受操作系统设置的条件限制。在某些架构中,单个 CPU 是系统某些方面的“看门人”。请查看您的操作系统和系统架构的文档。

这两个内核不可能处理不同的线程,每个线程都需要“锁定”对 RAM 地址的访问以保证原子性。在单个内核上,每条汇编代码指令都是原子的,因为原子性的量子是内核时钟周期。在多核上,这是不能假设的,因为虽然第一个核没有前进到下一条汇编指令,但另一个核可能已经弄乱了 RAM 中第一个核最初加载到要处理的寄存器中的值。

当然。请检查您的操作系统的文档 - 以及用户应用程序的锁定原语。

直觉上我知道这一定会导致多核系统出现问题,但我没有任何可靠的东西可以继续我的研究。感谢所有帮助。

有一些关于 Linux 操作系统的书籍和文档,对于像您这样对这些原则感兴趣的人来说可能是很好的读物(从Linux Memory Barriers 开始怎么样)。我个人推荐“Solaris Internals”一书作为对多处理器操作系统的一个很好的描述。

【讨论】:

  • 我来给你总结一下你的答案:RTFM。
【解决方案2】:

我还要说一点 RTFM,因为您的问题很广泛,需要大量的教育性阅读材料。尤其是关于微处理器和并发性。 (可以任意顺序阅读,甚至可以纠缠)

所以你必须按以下顺序阅读:

  • cpu 执行管道
  • cpu 缓存/分层内存
  • NUMA
  • 多线程编程

我们走吧。

CPU

这是一篇关于现代处理器乱序的非常好的文章:

http://www.gamedev.net/page/resources/_/technical/general-programming/a-journey-through-the-cpu-pipeline-r3115
这很好,cmets 会给你更多的学习链接。

考虑到您的问题以及如何表述它,了解更多关于 CPU 中真正发生的事情非常重要。

缓存

还有关于缓存如何工作的精彩文章,这将是上述文章(讨论管道)的完美补充:
===> http://lwn.net/Articles/250967/ 上一个链接是链接!

顺便说一句,但会以更快的阅读方式说同样的话:
http://www.hardwaresecrets.com/article/How-The-Memory-Cache-Works/481/1 http://web.cs.mun.ca/~paul/cs3725/material/web/notes/node3.html

很全面:
http://en.wikipedia.org/wiki/CPU_cache

或者这个“初学者”语气,更容易阅读:
http://arstechnica.com/gadgets/2002/07/caching/

NUMA

现在,关于您的“RAM 在内核之间划分”?问题,它确实可以发生在 NUMA 系统中:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa363804(v=vs.85).aspx
NUMA 存在于 opteron 和 core i7 处理器中,但主要仅在服务器配置上激活。但是这项技术是存在的(并且已经存在了很长时间)。

编程

然后这个是关于内存障碍的:
http://mechanical-sympathy.blogspot.jp/2011/07/memory-barriersfences.html

以下是关于同一进程的多个线程是否将在不同的 CPU 上运行的问题:
http://www2.cs.ucy.ac.cy/carch/xi/papers/MigrationCAN.pdf
快速的回答是“当然是的”,而且他们也会不时移动(migrate)。

关于 lockless(您可能听说过),个人建议从性能多线程编程的角度出发,并通过以下方式缓解 lockless:

不保证无锁算法比算法快 使用锁

这应该更多地进入人们的脑海:
http://msdn.microsoft.com/en-us/library/windows/desktop/ee418650(v=vs.85).aspx

那我推荐这篇(我自己的文章):
http://www.gamedev.net/page/resources/_/technical/general-programming/multithreading-r3048
从某种意义上说,它对已经警告过的程序员来说更具教育意义,并且没有内置的教学流程。但也许是一个很好的回顾。它也是我强烈建议您仔细阅读的优质链接。
值得注意的是 Alexandrescu 的无锁数据结构:
http://erdani.com/publications/cuj-2004-10.pdf

阅读愉快!

【讨论】:

    猜你喜欢
    • 2018-04-23
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 2014-04-27
    • 1970-01-01
    • 2013-05-14
    相关资源
    最近更新 更多