【发布时间】:2013-07-04 11:30:20
【问题描述】:
同一进程(程序)的线程是否曾经分布在多个内核上?
在多核/处理器系统中,每个内核是否都可以访问整个 RAM,或者 RAM 在逻辑上是否在多个内核之间划分?
这两个内核不可能处理不同的线程,每个线程都需要“锁定”对 RAM 地址的访问以保证原子性。在单个内核上,每条汇编代码指令都是原子的,因为原子性的量子是内核时钟周期。在多核上,这是不能假设的,因为虽然第一个核没有前进到下一条汇编指令,但另一个核可能已经弄乱了 RAM 中第一个核最初加载到要处理的寄存器中的值。
直觉上我知道这一定会导致多核系统出现问题,但我没有任何可靠的东西可以继续我的研究。感谢所有帮助。
【问题讨论】:
-
是的,多个线程可以访问同一个内存 - 由您来编写线程,所以这不是问题。这是所谓的“线程安全”编程的本质。另请注意,编写良好的代码将在 90% 的时间内保持缓存一致性 - 内核将处理数据的不同“副本”。但是当另一个线程写入我缓存中的块时,它是脏的,我不能使用它。巨大的速度惩罚。
-
我推荐一本大学级别的操作系统教科书,可能还有一本数据库系统教科书。两者都处理如何解决同步问题。
-
另外,由于现代 CPU 架构(具有流水线和乱序执行),即使是单核上的指令也不是“原子的”。
-
感谢millimoose 指出这一点,我会这么说的。还有一些内部时钟以与全局 CPU 时钟不同的速度运行以执行不同的指令。 (例如 P4 ALU 以 x2 运行)。不仅如此,指令是扩展为微代码 RISC 指令批的宏。所以非常不是原子的。不是在谈论像
integer divide这样的指令,它需要不同数量的周期,具体取决于操作数,并且可以达到 20 甚至更多才能完成。
标签: multithreading