管理多核中唯一RAM地址的线程访问

时间:2013-07-04 11:30:20

标签: multithreading

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

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

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

直觉上我知道这必然会导致多核系统出现问题,但我没有什么可以继续我的研究。感谢所有的帮助。

2 个答案:

答案 0 :(得分:2)

  

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

是和否。查看操作系统的文档。

  

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

所有核心都可以在合理范围内访问所有RAM,并且受操作系统对其施加的条件的限制。在某些体系结构中,单个CPU是系统某些方面的“守门人”。请查看有关操作系统和系统架构的文档。

  

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

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

  

直觉上我知道这必然会导致多核系统出现问题,但我没有什么可以继续我的研究。感谢所有的帮助。

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

答案 1 :(得分:0)

我也会说一些RTFM,因为你的问题很广泛,需要一大堆教育读物。特别是关于微处理器和并发性。 (您可以按任何顺序阅读,甚至纠缠不清)

所以你必须按顺序阅读:

  • cpu执行管道
  • cpu caches / hierarchical memory
  • NUMA
  • 多线程编程

我们走了。

CPU

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

http://www.gamedev.net/page/resources/_/technical/general-programming/a-journey-through-the-cpu-pipeline-r3115
这非常好,评论将为您提供进一步的学习链接。

考虑到您的问题以及如何制定它,您需要了解更多关于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和核心i7处理器中,但主要仅在服务器配置上激活。但技术存在(并且已经存在了很长时间)。

编程

然后这个谈论记忆障碍
http://mechanical-sympathy.blogspot.jp/2011/07/memory-barriersfences.html

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

关于无锁(您可能听说过),个人推荐关于性能多线程编程的一个很好的观点,并通过说:

来减轻无锁
  

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

这应该更多地进入人们的脑袋:
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

好的阅读!